summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <[email protected]>2012-08-01 20:46:39 +0200
committerChristian König <[email protected]>2012-08-02 15:15:00 +0200
commita3c6607be19af895ed6857c0a82b9b0821893dc6 (patch)
treec962b4ad5407abeeb8d2f14229187bcec56283b4
parent250b7fdd2610bf03292399c7d489c82de22fc682 (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.cpp27
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;