mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Support setcc on fp values.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14687 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -949,9 +949,15 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   unsigned DestReg = getReg (I); |   unsigned DestReg = getReg (I); | ||||||
|   const Type *Ty = I.getOperand (0)->getType (); |   const Type *Ty = I.getOperand (0)->getType (); | ||||||
|    |    | ||||||
|   assert (getClass (Ty) < cLong && "can't setcc on longs or fp yet"); |  | ||||||
|   // Compare the two values. |   // Compare the two values. | ||||||
|  |   assert (getClass (Ty) != cLong && "can't setcc on longs yet"); | ||||||
|  |   if (getClass (Ty) < cLong) { | ||||||
|     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); |     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cFloat) { | ||||||
|  |     BuildMI(BB, V8::FCMPS, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cDouble) { | ||||||
|  |     BuildMI(BB, V8::FCMPD, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   unsigned BranchIdx; |   unsigned BranchIdx; | ||||||
|   switch (I.getOpcode()) { |   switch (I.getOpcode()) { | ||||||
| @@ -963,17 +969,20 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   case Instruction::SetLE: BranchIdx = 4; break; |   case Instruction::SetLE: BranchIdx = 4; break; | ||||||
|   case Instruction::SetGE: BranchIdx = 5; break; |   case Instruction::SetGE: BranchIdx = 5; break; | ||||||
|   } |   } | ||||||
|   static unsigned OpcodeTab[12] = { |   unsigned Column = 0; | ||||||
|  |   if (Ty->isSigned()) ++Column; | ||||||
|  |   if (Ty->isFloatingPoint()) ++Column; | ||||||
|  |   static unsigned OpcodeTab[3*6] = { | ||||||
|                                  // LLVM            SparcV8 |                                  // LLVM            SparcV8 | ||||||
|                               //        unsigned signed |                                  //        unsigned signed  fp | ||||||
|     V8::BE,   V8::BE,         // seteq = be      be |     V8::BE,   V8::BE,  V8::FBE,  // seteq = be      be      fbe | ||||||
|     V8::BNE,  V8::BNE,        // setne = bne     bne |     V8::BNE,  V8::BNE, V8::FBNE, // setne = bne     bne     fbne | ||||||
|     V8::BCS,  V8::BL,         // setlt = bcs     bl |     V8::BCS,  V8::BL,  V8::FBL,  // setlt = bcs     bl      fbl | ||||||
|     V8::BGU,  V8::BG,         // setgt = bgu     bg |     V8::BGU,  V8::BG,  V8::FBG,  // setgt = bgu     bg      fbg | ||||||
|     V8::BLEU, V8::BLE,        // setle = bleu    ble |     V8::BLEU, V8::BLE, V8::FBLE, // setle = bleu    ble     fble | ||||||
|     V8::BCC,  V8::BGE         // setge = bcc     bge |     V8::BCC,  V8::BGE, V8::FBGE  // setge = bcc     bge     fbge | ||||||
|   }; |   }; | ||||||
|   unsigned Opcode = OpcodeTab[2*BranchIdx + (Ty->isSigned() ? 1 : 0)]; |   unsigned Opcode = OpcodeTab[3*BranchIdx + Column]; | ||||||
|  |  | ||||||
|   MachineBasicBlock *thisMBB = BB; |   MachineBasicBlock *thisMBB = BB; | ||||||
|   const BasicBlock *LLVM_BB = BB->getBasicBlock (); |   const BasicBlock *LLVM_BB = BB->getBasicBlock (); | ||||||
|   | |||||||
| @@ -949,9 +949,15 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   unsigned DestReg = getReg (I); |   unsigned DestReg = getReg (I); | ||||||
|   const Type *Ty = I.getOperand (0)->getType (); |   const Type *Ty = I.getOperand (0)->getType (); | ||||||
|    |    | ||||||
|   assert (getClass (Ty) < cLong && "can't setcc on longs or fp yet"); |  | ||||||
|   // Compare the two values. |   // Compare the two values. | ||||||
|  |   assert (getClass (Ty) != cLong && "can't setcc on longs yet"); | ||||||
|  |   if (getClass (Ty) < cLong) { | ||||||
|     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); |     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cFloat) { | ||||||
|  |     BuildMI(BB, V8::FCMPS, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cDouble) { | ||||||
|  |     BuildMI(BB, V8::FCMPD, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   unsigned BranchIdx; |   unsigned BranchIdx; | ||||||
|   switch (I.getOpcode()) { |   switch (I.getOpcode()) { | ||||||
| @@ -963,17 +969,20 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   case Instruction::SetLE: BranchIdx = 4; break; |   case Instruction::SetLE: BranchIdx = 4; break; | ||||||
|   case Instruction::SetGE: BranchIdx = 5; break; |   case Instruction::SetGE: BranchIdx = 5; break; | ||||||
|   } |   } | ||||||
|   static unsigned OpcodeTab[12] = { |   unsigned Column = 0; | ||||||
|  |   if (Ty->isSigned()) ++Column; | ||||||
|  |   if (Ty->isFloatingPoint()) ++Column; | ||||||
|  |   static unsigned OpcodeTab[3*6] = { | ||||||
|                                  // LLVM            SparcV8 |                                  // LLVM            SparcV8 | ||||||
|                               //        unsigned signed |                                  //        unsigned signed  fp | ||||||
|     V8::BE,   V8::BE,         // seteq = be      be |     V8::BE,   V8::BE,  V8::FBE,  // seteq = be      be      fbe | ||||||
|     V8::BNE,  V8::BNE,        // setne = bne     bne |     V8::BNE,  V8::BNE, V8::FBNE, // setne = bne     bne     fbne | ||||||
|     V8::BCS,  V8::BL,         // setlt = bcs     bl |     V8::BCS,  V8::BL,  V8::FBL,  // setlt = bcs     bl      fbl | ||||||
|     V8::BGU,  V8::BG,         // setgt = bgu     bg |     V8::BGU,  V8::BG,  V8::FBG,  // setgt = bgu     bg      fbg | ||||||
|     V8::BLEU, V8::BLE,        // setle = bleu    ble |     V8::BLEU, V8::BLE, V8::FBLE, // setle = bleu    ble     fble | ||||||
|     V8::BCC,  V8::BGE         // setge = bcc     bge |     V8::BCC,  V8::BGE, V8::FBGE  // setge = bcc     bge     fbge | ||||||
|   }; |   }; | ||||||
|   unsigned Opcode = OpcodeTab[2*BranchIdx + (Ty->isSigned() ? 1 : 0)]; |   unsigned Opcode = OpcodeTab[3*BranchIdx + Column]; | ||||||
|  |  | ||||||
|   MachineBasicBlock *thisMBB = BB; |   MachineBasicBlock *thisMBB = BB; | ||||||
|   const BasicBlock *LLVM_BB = BB->getBasicBlock (); |   const BasicBlock *LLVM_BB = BB->getBasicBlock (); | ||||||
|   | |||||||
| @@ -949,9 +949,15 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   unsigned DestReg = getReg (I); |   unsigned DestReg = getReg (I); | ||||||
|   const Type *Ty = I.getOperand (0)->getType (); |   const Type *Ty = I.getOperand (0)->getType (); | ||||||
|    |    | ||||||
|   assert (getClass (Ty) < cLong && "can't setcc on longs or fp yet"); |  | ||||||
|   // Compare the two values. |   // Compare the two values. | ||||||
|  |   assert (getClass (Ty) != cLong && "can't setcc on longs yet"); | ||||||
|  |   if (getClass (Ty) < cLong) { | ||||||
|     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); |     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cFloat) { | ||||||
|  |     BuildMI(BB, V8::FCMPS, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cDouble) { | ||||||
|  |     BuildMI(BB, V8::FCMPD, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   unsigned BranchIdx; |   unsigned BranchIdx; | ||||||
|   switch (I.getOpcode()) { |   switch (I.getOpcode()) { | ||||||
| @@ -963,17 +969,20 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   case Instruction::SetLE: BranchIdx = 4; break; |   case Instruction::SetLE: BranchIdx = 4; break; | ||||||
|   case Instruction::SetGE: BranchIdx = 5; break; |   case Instruction::SetGE: BranchIdx = 5; break; | ||||||
|   } |   } | ||||||
|   static unsigned OpcodeTab[12] = { |   unsigned Column = 0; | ||||||
|  |   if (Ty->isSigned()) ++Column; | ||||||
|  |   if (Ty->isFloatingPoint()) ++Column; | ||||||
|  |   static unsigned OpcodeTab[3*6] = { | ||||||
|                                  // LLVM            SparcV8 |                                  // LLVM            SparcV8 | ||||||
|                               //        unsigned signed |                                  //        unsigned signed  fp | ||||||
|     V8::BE,   V8::BE,         // seteq = be      be |     V8::BE,   V8::BE,  V8::FBE,  // seteq = be      be      fbe | ||||||
|     V8::BNE,  V8::BNE,        // setne = bne     bne |     V8::BNE,  V8::BNE, V8::FBNE, // setne = bne     bne     fbne | ||||||
|     V8::BCS,  V8::BL,         // setlt = bcs     bl |     V8::BCS,  V8::BL,  V8::FBL,  // setlt = bcs     bl      fbl | ||||||
|     V8::BGU,  V8::BG,         // setgt = bgu     bg |     V8::BGU,  V8::BG,  V8::FBG,  // setgt = bgu     bg      fbg | ||||||
|     V8::BLEU, V8::BLE,        // setle = bleu    ble |     V8::BLEU, V8::BLE, V8::FBLE, // setle = bleu    ble     fble | ||||||
|     V8::BCC,  V8::BGE         // setge = bcc     bge |     V8::BCC,  V8::BGE, V8::FBGE  // setge = bcc     bge     fbge | ||||||
|   }; |   }; | ||||||
|   unsigned Opcode = OpcodeTab[2*BranchIdx + (Ty->isSigned() ? 1 : 0)]; |   unsigned Opcode = OpcodeTab[3*BranchIdx + Column]; | ||||||
|  |  | ||||||
|   MachineBasicBlock *thisMBB = BB; |   MachineBasicBlock *thisMBB = BB; | ||||||
|   const BasicBlock *LLVM_BB = BB->getBasicBlock (); |   const BasicBlock *LLVM_BB = BB->getBasicBlock (); | ||||||
|   | |||||||
| @@ -949,9 +949,15 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   unsigned DestReg = getReg (I); |   unsigned DestReg = getReg (I); | ||||||
|   const Type *Ty = I.getOperand (0)->getType (); |   const Type *Ty = I.getOperand (0)->getType (); | ||||||
|    |    | ||||||
|   assert (getClass (Ty) < cLong && "can't setcc on longs or fp yet"); |  | ||||||
|   // Compare the two values. |   // Compare the two values. | ||||||
|  |   assert (getClass (Ty) != cLong && "can't setcc on longs yet"); | ||||||
|  |   if (getClass (Ty) < cLong) { | ||||||
|     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); |     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cFloat) { | ||||||
|  |     BuildMI(BB, V8::FCMPS, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } else if (getClass (Ty) == cDouble) { | ||||||
|  |     BuildMI(BB, V8::FCMPD, 2).addReg(Op0Reg).addReg(Op1Reg); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   unsigned BranchIdx; |   unsigned BranchIdx; | ||||||
|   switch (I.getOpcode()) { |   switch (I.getOpcode()) { | ||||||
| @@ -963,17 +969,20 @@ void V8ISel::visitSetCondInst(SetCondInst &I) { | |||||||
|   case Instruction::SetLE: BranchIdx = 4; break; |   case Instruction::SetLE: BranchIdx = 4; break; | ||||||
|   case Instruction::SetGE: BranchIdx = 5; break; |   case Instruction::SetGE: BranchIdx = 5; break; | ||||||
|   } |   } | ||||||
|   static unsigned OpcodeTab[12] = { |   unsigned Column = 0; | ||||||
|  |   if (Ty->isSigned()) ++Column; | ||||||
|  |   if (Ty->isFloatingPoint()) ++Column; | ||||||
|  |   static unsigned OpcodeTab[3*6] = { | ||||||
|                                  // LLVM            SparcV8 |                                  // LLVM            SparcV8 | ||||||
|                               //        unsigned signed |                                  //        unsigned signed  fp | ||||||
|     V8::BE,   V8::BE,         // seteq = be      be |     V8::BE,   V8::BE,  V8::FBE,  // seteq = be      be      fbe | ||||||
|     V8::BNE,  V8::BNE,        // setne = bne     bne |     V8::BNE,  V8::BNE, V8::FBNE, // setne = bne     bne     fbne | ||||||
|     V8::BCS,  V8::BL,         // setlt = bcs     bl |     V8::BCS,  V8::BL,  V8::FBL,  // setlt = bcs     bl      fbl | ||||||
|     V8::BGU,  V8::BG,         // setgt = bgu     bg |     V8::BGU,  V8::BG,  V8::FBG,  // setgt = bgu     bg      fbg | ||||||
|     V8::BLEU, V8::BLE,        // setle = bleu    ble |     V8::BLEU, V8::BLE, V8::FBLE, // setle = bleu    ble     fble | ||||||
|     V8::BCC,  V8::BGE         // setge = bcc     bge |     V8::BCC,  V8::BGE, V8::FBGE  // setge = bcc     bge     fbge | ||||||
|   }; |   }; | ||||||
|   unsigned Opcode = OpcodeTab[2*BranchIdx + (Ty->isSigned() ? 1 : 0)]; |   unsigned Opcode = OpcodeTab[3*BranchIdx + Column]; | ||||||
|  |  | ||||||
|   MachineBasicBlock *thisMBB = BB; |   MachineBasicBlock *thisMBB = BB; | ||||||
|   const BasicBlock *LLVM_BB = BB->getBasicBlock (); |   const BasicBlock *LLVM_BB = BB->getBasicBlock (); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user