diff options
author | Christian König <[email protected]> | 2012-08-01 20:46:39 +0200 |
---|---|---|
committer | Christian König <[email protected]> | 2012-08-02 15:15:00 +0200 |
commit | a3c6607be19af895ed6857c0a82b9b0821893dc6 (patch) | |
tree | c962b4ad5407abeeb8d2f14229187bcec56283b4 | |
parent | 250b7fdd2610bf03292399c7d489c82de22fc682 (diff) |
radeon/llvm: fix fp immediates on SI
I don't know if this is a good idea, but it
fixes the problem at hand.
Signed-off-by: Christian König <[email protected]>
Reviewed-by: Tom Stellard <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeon/SICodeEmitter.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/gallium/drivers/radeon/SICodeEmitter.cpp b/src/gallium/drivers/radeon/SICodeEmitter.cpp index 9fc4aab136e..fae56f4c968 100644 --- a/src/gallium/drivers/radeon/SICodeEmitter.cpp +++ b/src/gallium/drivers/radeon/SICodeEmitter.cpp @@ -232,7 +232,7 @@ uint64_t SICodeEmitter::getMachineOpValue(const MachineInstr &MI, case MachineOperand::MO_FPImmediate: // XXX: Not all instructions can use inline literals // XXX: We should make sure this is a 32-bit constant - return LITERAL_REG | (MO.getFPImm()->getValueAPF().bitcastToAPInt().getZExtValue() << 32); + return LITERAL_REG; case MachineOperand::MO_MachineBasicBlock: return (*BBIndexes.find(MI.getParent()->getNumber())).second - @@ -321,13 +321,26 @@ uint64_t SICodeEmitter::VOPPostEncode(const MachineInstr &MI, // Add one to skip over the destination reg operand. for (unsigned opIdx = 1; opIdx < numSrcOps + 1; opIdx++) { - if (!MI.getOperand(opIdx).isReg()) { + const MachineOperand &MO = MI.getOperand(opIdx); + switch(MO.getType()) { + case MachineOperand::MO_Register: + { + unsigned reg = MI.getOperand(opIdx).getReg(); + if (AMDGPU::VReg_32RegClass.contains(reg) + || AMDGPU::VReg_64RegClass.contains(reg)) { + Value |= (VGPR_BIT(opIdx)) << vgprBitOffset; + } + } + break; + + case MachineOperand::MO_FPImmediate: + // XXX: Not all instructions can use inline literals + // XXX: We should make sure this is a 32-bit constant + Value |= (MO.getFPImm()->getValueAPF().bitcastToAPInt().getZExtValue() << 32); continue; - } - unsigned reg = MI.getOperand(opIdx).getReg(); - if (AMDGPU::VReg_32RegClass.contains(reg) - || AMDGPU::VReg_64RegClass.contains(reg)) { - Value |= (VGPR_BIT(opIdx)) << vgprBitOffset; + + default: + break; } } return Value; |