Correctly load FP constants out of the constant pool.
llvm-svn: 14782
This commit is contained in:
		
							parent
							
								
									9dacda651f
								
							
						
					
					
						commit
						be1b680f54
					
				| 
						 | 
					@ -1608,20 +1608,17 @@ void ISel::emitBinaryFPOperation(MachineBasicBlock *BB,
 | 
				
			||||||
    MachineConstantPool *CP = F->getConstantPool();
 | 
					    MachineConstantPool *CP = F->getConstantPool();
 | 
				
			||||||
    unsigned CPI = CP->getConstantPoolIndex(Op1C);
 | 
					    unsigned CPI = CP->getConstantPoolIndex(Op1C);
 | 
				
			||||||
    const Type *Ty = Op1->getType();
 | 
					    const Type *Ty = Op1->getType();
 | 
				
			||||||
 | 
					    assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static const unsigned OpcodeTab[][4] = {
 | 
					    static const unsigned OpcodeTab[][4] = {
 | 
				
			||||||
      { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS },  // Float
 | 
					      { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS },  // Float
 | 
				
			||||||
      { PPC32::FADD,  PPC32::FSUB,  PPC32::FMUL,  PPC32::FDIV },   // Double
 | 
					      { PPC32::FADD,  PPC32::FSUB,  PPC32::FMUL,  PPC32::FDIV },   // Double
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
 | 
					    unsigned Op1Reg = getReg(Op1C);
 | 
				
			||||||
    unsigned TempReg = makeAnotherReg(Ty);
 | 
					 | 
				
			||||||
    unsigned LoadOpcode = (Ty == Type::FloatTy) ? PPC32::LFS : PPC32::LFD;
 | 
					 | 
				
			||||||
    addConstantPoolReference(BuildMI(*BB, IP, LoadOpcode, 2, TempReg), CPI);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
 | 
					    unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
 | 
				
			||||||
    unsigned Op0r = getReg(Op0, BB, IP);
 | 
					    unsigned Op0r = getReg(Op0, BB, IP);
 | 
				
			||||||
    BuildMI(*BB, IP, Opcode, DestReg).addReg(Op0r).addReg(TempReg);
 | 
					    BuildMI(*BB, IP, Opcode, DestReg).addReg(Op0r).addReg(Op1Reg);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1608,20 +1608,17 @@ void ISel::emitBinaryFPOperation(MachineBasicBlock *BB,
 | 
				
			||||||
    MachineConstantPool *CP = F->getConstantPool();
 | 
					    MachineConstantPool *CP = F->getConstantPool();
 | 
				
			||||||
    unsigned CPI = CP->getConstantPoolIndex(Op1C);
 | 
					    unsigned CPI = CP->getConstantPoolIndex(Op1C);
 | 
				
			||||||
    const Type *Ty = Op1->getType();
 | 
					    const Type *Ty = Op1->getType();
 | 
				
			||||||
 | 
					    assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static const unsigned OpcodeTab[][4] = {
 | 
					    static const unsigned OpcodeTab[][4] = {
 | 
				
			||||||
      { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS },  // Float
 | 
					      { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS },  // Float
 | 
				
			||||||
      { PPC32::FADD,  PPC32::FSUB,  PPC32::FMUL,  PPC32::FDIV },   // Double
 | 
					      { PPC32::FADD,  PPC32::FSUB,  PPC32::FMUL,  PPC32::FDIV },   // Double
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
 | 
					    unsigned Op1Reg = getReg(Op1C);
 | 
				
			||||||
    unsigned TempReg = makeAnotherReg(Ty);
 | 
					 | 
				
			||||||
    unsigned LoadOpcode = (Ty == Type::FloatTy) ? PPC32::LFS : PPC32::LFD;
 | 
					 | 
				
			||||||
    addConstantPoolReference(BuildMI(*BB, IP, LoadOpcode, 2, TempReg), CPI);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
 | 
					    unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
 | 
				
			||||||
    unsigned Op0r = getReg(Op0, BB, IP);
 | 
					    unsigned Op0r = getReg(Op0, BB, IP);
 | 
				
			||||||
    BuildMI(*BB, IP, Opcode, DestReg).addReg(Op0r).addReg(TempReg);
 | 
					    BuildMI(*BB, IP, Opcode, DestReg).addReg(Op0r).addReg(Op1Reg);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue