@@ -192,10 +192,6 @@ namespace {
192
192
// /
193
193
void promote32 (unsigned targetReg, const ValueRecord &VR);
194
194
195
- // / EmitByteSwap - Byteswap SrcReg into DestReg.
196
- // /
197
- void EmitByteSwap (unsigned DestReg, unsigned SrcReg, unsigned Class);
198
-
199
195
// / emitGEPOperation - Common code shared between visitGetElementPtrInst and
200
196
// / constant expression GEP support.
201
197
// /
@@ -215,6 +211,11 @@ namespace {
215
211
Value *Op0, Value *Op1,
216
212
unsigned OperatorClass, unsigned TargetReg);
217
213
214
+ void emitDivRemOperation (MachineBasicBlock *BB,
215
+ MachineBasicBlock::iterator &IP,
216
8000
+ unsigned Op0Reg, unsigned Op1Reg, bool isDiv,
217
+ const Type *Ty, unsigned TargetReg);
218
+
218
219
// / emitSetCCOperation - Common code shared between visitSetCondInst and
219
220
// / constant expression support.
220
221
void emitSetCCOperation (MachineBasicBlock *BB,
@@ -355,6 +356,22 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB,
355
356
Class, R);
356
357
return ;
357
358
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
+
358
375
case Instruction::SetNE:
359
376
case Instruction::SetEQ:
360
377
case Instruction::SetLT:
@@ -1339,36 +1356,44 @@ void ISel::visitMul(BinaryOperator &I) {
1339
1356
// / instructions work differently for signed and unsigned operands.
1340
1357
// /
1341
1358
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);
1344
1362
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);
1345
1373
switch (Class) {
1346
1374
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) {
1350
1376
BuildMI (BB, X86::FpDIV, 2 , ResultReg).addReg (Op0Reg).addReg (Op1Reg);
1351
1377
} else { // Floating point remainder...
1352
1378
MachineInstr *TheCall =
1353
1379
BuildMI (X86::CALLpcrel32, 1 ).addExternalSymbol (" fmod" , true );
1354
1380
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 ));
1357
1383
doCall (ValueRecord (ResultReg, Type::DoubleTy), TheCall, Args);
1358
1384
}
1359
1385
return ;
1360
1386
case cLong: {
1361
1387
static const char *FnName[] =
1362
1388
{ " __moddi3" , " __divdi3" , " __umoddi3" , " __udivdi3" };
1363
1389
1364
- unsigned NameIdx = I.getType ()->isUnsigned ()*2 ;
1365
- NameIdx += I.getOpcode () == Instruction::Div;
1390
+ unsigned NameIdx = Ty->isUnsigned ()*2 + isDiv;
1366
1391
MachineInstr *TheCall =
1367
1392
BuildMI (X86::CALLpcrel32, 1 ).addExternalSymbol (FnName[NameIdx], true );
1368
1393
1369
1394
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 ));
1372
1397
doCall (ValueRecord (ResultReg, Type::LongTy), TheCall, Args);
1373
1398
return ;
1374
1399
}
@@ -1388,17 +1413,16 @@ void ISel::visitDivRem(BinaryOperator &I) {
1388
1413
{ X86::IDIVr8, X86::IDIVr16, X86::IDIVr32, 0 }, // Signed division
1389
1414
};
1390
1415
1391
- bool isSigned = I. getType () ->isSigned ();
1416
+ bool isSigned = Ty ->isSigned ();
1392
1417
unsigned Reg = Regs[Class];
1393
1418
unsigned ExtReg = ExtRegs[Class];
1394
1419
1395
1420
// Put the first operand into one of the A registers...
1396
- Op0Reg = getReg (I.getOperand (0 ));
1397
1421
BuildMI (BB, MovOpcode[Class], 1 , Reg).addReg (Op0Reg);
1398
1422
1399
1423
if (isSigned) {
1400
1424
// Emit a sign extension instruction...
1401
- unsigned ShiftResult = makeAnotherReg (I. getType () );
1425
+ unsigned ShiftResult = makeAnotherReg (Ty );
1402
1426
BuildMI (BB, SarOpcode[Class], 2 , ShiftResult).addReg (Op0Reg).addZImm (31 );
1403
1427
BuildMI (BB, MovOpcode[Class], 1 , ExtReg).addReg (ShiftResult);
1404
1428
} else {
@@ -1407,11 +1431,10 @@ void ISel::visitDivRem(BinaryOperator &I) {
1407
1431
}
1408
1432
1409
1433
// Emit the appropriate divide or remainder instruction...
1410
- Op1Reg = getReg (I.getOperand (1 ));
1411
1434
BuildMI (BB, DivOpcode[isSigned][Class], 1 ).addReg (Op1Reg);
1412
1435
1413
1436
// 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;
1415
1438
1416
1439
// Put the result into the destination register...
1417
1440
BuildMI (BB, MovOpcode[Class], 1 , ResultReg).addReg (DestReg);
@@ -1544,35 +1567,6 @@ void ISel::visitShiftInst(ShiftInst &I) {
1544
1567
}
1545
1568
1546
1569
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
-
1576
1570
// / visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
1577
1571
// / instruction. The load and store instructions are the only place where we
1578
1572
// / need to worry about the memory layout of the target machine.
0 commit comments