8000 Delete unused EmitByteSwap method · inside-compiler/llvm-project@37f4a4c · GitHub
[go: up one dir, main page]

Skip to content

Commit 37f4a4c

Browse files
committed
Delete unused EmitByteSwap method
Implement mul/div/rem constant expressions llvm-svn: 9424
1 parent f516c69 commit 37f4a4c

File tree

1 file changed

+43
-49
lines changed

1 file changed

+43
-49
lines changed

llvm/lib/Target/X86/InstSelectSimple.cpp

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,6 @@ namespace {
192192
///
193193
void promote32(unsigned targetReg, const ValueRecord &VR);
194194

195-
/// EmitByteSwap - Byteswap SrcReg into DestReg.
196-
///
197-
void EmitByteSwap(unsigned DestReg, unsigned SrcReg, unsigned Class);
198-
199195
/// emitGEPOperation - Common code shared between visitGetElementPtrInst and
200196
/// constant expression GEP support.
201197
///
@@ -215,6 +211,11 @@ namespace {
215211
Value *Op0, Value *Op1,
216212
unsigned OperatorClass, unsigned TargetReg);
217213

214+
void emitDivRemOperation(MachineBasicBlock *BB,
215+
MachineBasicBlock::iterator &IP,
216 8000 +
unsigned Op0Reg, unsigned Op1Reg, bool isDiv,
217+
const Type *Ty, unsigned TargetReg);
218+
218219
/// emitSetCCOperation - Common code shared between visitSetCondInst and
219220
/// constant expression support.
220221
void emitSetCCOperation(MachineBasicBlock *BB,
@@ -355,6 +356,22 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB,
355356
Class, R);
356357
return;
357358

359+
case Instruction::Mul: {
360+
unsigned Op0Reg = getReg(CE->getOperand(0), MBB, IP);
361+
unsigned Op1Reg = getReg(CE->getOperand(1), MBB, IP);
362+
doMultiply(MBB, IP, R, CE->getType(), Op0Reg, Op1Reg);
363+
return;
364+
}
365+
case Instruction::Div:
366+
case Instruction::Rem: {
367+
unsigned Op0Reg = getReg(CE->getOperand(0), MBB, IP);
368+
unsigned Op1Reg = getReg(CE->getOperand(1), MBB, IP);
369+
emitDivRemOperation(MBB, IP, Op0Reg, Op1Reg,
370+
CE->getOpcode() == Instruction::Div,
371+
CE->getType(), R);
372+
return;
373+
}
374+
358375
case Instruction::SetNE:
359376
case Instruction::SetEQ:
360377
case Instruction::SetLT:
@@ -1339,36 +1356,44 @@ void ISel::visitMul(BinaryOperator &I) {
13391356
/// instructions work differently for signed and unsigned operands.
13401357
///
13411358
void ISel::visitDivRem(BinaryOperator &I) {
1342-
unsigned Class = getClass(I.getType());
1343-
unsigned Op0Reg, Op1Reg, ResultReg = getReg(I);
1359+
unsigned Op0Reg = getReg(I.getOperand(0));
1360+
unsigned Op1Reg = getReg(I.getOperand(1));
1361+
unsigned ResultReg = getReg(I);
13441362

1363+
MachineBasicBlock::iterator IP = BB->end();
1364+
emitDivRemOperation(BB, IP, Op0Reg, Op1Reg, I.getOpcode() == Instruction::Div,
1365+
I.getType(), ResultReg);
1366+
}
1367+
1368+
void ISel::emitDivRemOperation(MachineBasicBlock *BB,
1369+
MachineBasicBlock::iterator &IP,
1370+
unsigned Op0Reg, unsigned Op1Reg, bool isDiv,
1371+
const Type *Ty, unsigned ResultReg) {
1372+
unsigned Class = getClass(Ty);
13451373
switch (Class) {
13461374
case cFP: // Floating point divide
1347-
if (I.getOpcode() == Instruction::Div) {
1348-
Op0Reg = getReg(I.getOperand(0));
1349-
Op1Reg = getReg(I.getOperand(1));
1375+
if (isDiv) {
13501376
BuildMI(BB, X86::FpDIV, 2, ResultReg).addReg(Op0Reg).addReg(Op1Reg);
13511377
} else { // Floating point remainder...
13521378
MachineInstr *TheCall =
13531379
BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("fmod", true);
13541380
std::vector<ValueRecord> Args;
1355-
Args.push_back(ValueRecord(I.getOperand(0)));
1356-
Args.push_back(ValueRecord(I.getOperand(1)));
1381+
Args.push_back(ValueRecord(Op0Reg, Type::DoubleTy));
1382+
Args.push_back(ValueRecord(Op1Reg, Type::DoubleTy));
13571383
doCall(ValueRecord(ResultReg, Type::DoubleTy), TheCall, Args);
13581384
}
13591385
return;
13601386
case cLong: {
13611387
static const char *FnName[] =
13621388
{ "__moddi3", "__divdi3", "__umoddi3", "__udivdi3" };
13631389

1364-
unsigned NameIdx = I.getType()->isUnsigned()*2;
1365-
NameIdx += I.getOpcode() == Instruction::Div;
1390+
unsigned NameIdx = Ty->isUnsigned()*2 + isDiv;
13661391
MachineInstr *TheCall =
13671392
BuildMI(X86::CALLpcrel32, 1).addExternalSymbol(FnName[NameIdx], true);
13681393

13691394
std::vector<ValueRecord> Args;
1370-
Args.push_back(ValueRecord(I.getOperand(0)));
1371-
Args.push_back(ValueRecord(I.getOperand(1)));
1395+
Args.push_back(ValueRecord(Op0Reg, Type::LongTy));
1396+
Args.push_back(ValueRecord(Op1Reg, Type::LongTy));
13721397
doCall(ValueRecord(ResultReg, Type::LongTy), TheCall, Args);
13731398
return;
13741399
}
@@ -1388,17 +1413,16 @@ void ISel::visitDivRem(BinaryOperator &I) {
13881413
{ X86::IDIVr8, X86::IDIVr16, X86::IDIVr32, 0 }, // Signed division
13891414
};
13901415

1391-
bool isSigned = I.getType()->isSigned();
1416+
bool isSigned = Ty->isSigned();
13921417
unsigned Reg = Regs[Class];
13931418
unsigned ExtReg = ExtRegs[Class];
13941419

13951420
// Put the first operand into one of the A registers...
1396-
Op0Reg = getReg(I.getOperand(0));
13971421
BuildMI(BB, MovOpcode[Class], 1, Reg).addReg(Op0Reg);
13981422

13991423
if (isSigned) {
14001424
// Emit a sign extension instruction...
1401-
unsigned ShiftResult = makeAnotherReg(I.getType());
1425+
unsigned ShiftResult = makeAnotherReg(Ty);
14021426
BuildMI(BB, SarOpcode[Class], 2, ShiftResult).addReg(Op0Reg).addZImm(31);
14031427
BuildMI(BB, MovOpcode[Class], 1, ExtReg).addReg(ShiftResult);
14041428
} else {
@@ -1407,11 +1431,10 @@ void ISel::visitDivRem(BinaryOperator &I) {
14071431
}
14081432

14091433
// Emit the appropriate divide or remainder instruction...
1410-
Op1Reg = getReg(I.getOperand(1));
14111434
BuildMI(BB, DivOpcode[isSigned][Class], 1).addReg(Op1Reg);
14121435

14131436
// Figure out which register we want to pick the result out of...
1414-
unsigned DestReg = (I.getOpcode() == Instruction::Div) ? Reg : ExtReg;
1437+
unsigned DestReg = isDiv ? Reg : ExtReg;
14151438

14161439
// Put the result into the destination register...
14171440
BuildMI(BB, MovOpcode[Class], 1, ResultReg).addReg(DestReg);
@@ -1544,35 +1567,6 @@ void ISel::visitShiftInst(ShiftInst &I) {
15441567
}
15451568

15461569

1547-
/// EmitByteSwap - Byteswap SrcReg into DestReg.
1548-
///
1549-
void ISel::EmitByteSwap(unsigned DestReg, unsigned SrcReg, unsigned Class) {
1550-
// Emit the byte swap instruction...
1551-
switch (Class) {
1552-
case cByte:
1553-
// No byteswap necessary for 8 bit value...
1554-
BuildMI(BB, X86::MOVrr8, 1, DestReg).addReg(SrcReg);
1555-
break;
1556-
case cInt:
1557-
// Use the 32 bit bswap instruction to do a 32 bit swap...
1558-
BuildMI(BB, X86::BSWAPr32, 1, DestReg).addReg(SrcReg);
1559-
break;
1560-
1561-
case cShort:
1562-
// For 16 bit we have to use an xchg instruction, because there is no
1563-
// 16-bit bswap. XCHG is necessarily not in SSA form, so we force things
1564-
// into AX to do the xchg.
1565-
//
1566-
BuildMI(BB, X86::MOVrr16, 1, X86::AX).addReg(SrcReg);
1567-
BuildMI(BB, X86::XCHGrr8, 2).addReg(X86::AL, MOTy::UseAndDef)
1568-
.addReg(X86::AH, MOTy::UseAndDef);
1569-
BuildMI(BB, X86::MOVrr16, 1, DestReg).addReg(X86::AX);
1570-
break;
1571-
default: assert(0 && "Cannot byteswap this class!");
1572-
}
1573-
}
1574-
1575-
15761570
/// visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
15771571
/// instruction. The load and store instructions are the only place where we
15781572
/// need to worry about the memory layout of the target machine.

0 commit comments

Comments
 (0)
0