diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-08-15 18:42:18 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-08-15 18:42:18 +0000 |
| commit | 13623d0e2877d9273f26a0ba9d059224d6f4e3f1 (patch) | |
| tree | 0bb958bd2bed6030da1bb0c4e7fa2ec2af1fbe53 /llvm/lib/Target/R600/SIISelLowering.cpp | |
| parent | a147438e37d009d7015bb27ca656323b82d8ae11 (diff) | |
| download | bcm5719-llvm-13623d0e2877d9273f26a0ba9d059224d6f4e3f1.tar.gz bcm5719-llvm-13623d0e2877d9273f26a0ba9d059224d6f4e3f1.zip | |
R600/SI: Use source modifiers for f64 fneg
llvm-svn: 215748
Diffstat (limited to 'llvm/lib/Target/R600/SIISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 508ed2a9a9a..1d5b43f5954 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -223,10 +223,6 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) : setOperationAction(ISD::FRINT, MVT::f64, Legal); } - // FIXME: These should be removed and handled the same was as f32 fneg. Source - // modifiers also work for the double instructions. - setOperationAction(ISD::FNEG, MVT::f64, Expand); - setOperationAction(ISD::FDIV, MVT::f32, Custom); setTargetDAGCombine(ISD::SELECT_CC); @@ -701,6 +697,7 @@ MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter( unsigned DestReg = MI->getOperand(0).getReg(); unsigned Reg = MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass); + // FIXME: Should use SALU instructions BuildMI(*BB, I, DL, TII->get(AMDGPU::V_MOV_B32_e32), Reg) .addImm(0x80000000); BuildMI(*BB, I, DL, TII->get(AMDGPU::V_XOR_B32_e32), DestReg) @@ -709,6 +706,33 @@ MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter( MI->eraseFromParent(); break; } + case AMDGPU::FNEG64_SI: { + MachineRegisterInfo &MRI = BB->getParent()->getRegInfo(); + const SIInstrInfo *TII = static_cast<const SIInstrInfo *>( + getTargetMachine().getSubtargetImpl()->getInstrInfo()); + + DebugLoc DL = MI->getDebugLoc(); + unsigned SrcReg = MI->getOperand(1).getReg(); + unsigned DestReg = MI->getOperand(0).getReg(); + + unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass); + unsigned ImmReg = MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass); + + // FIXME: Should use SALU instructions + BuildMI(*BB, I, DL, TII->get(AMDGPU::V_MOV_B32_e32), ImmReg) + .addImm(0x80000000); + BuildMI(*BB, I, DL, TII->get(AMDGPU::V_XOR_B32_e32), TmpReg) + .addReg(SrcReg, 0, AMDGPU::sub1) + .addReg(ImmReg); + + BuildMI(*BB, I, DL, TII->get(AMDGPU::REG_SEQUENCE), DestReg) + .addReg(SrcReg, 0, AMDGPU::sub0) + .addImm(AMDGPU::sub0) + .addReg(TmpReg) + .addImm(AMDGPU::sub1); + MI->eraseFromParent(); + break; + } case AMDGPU::FCLAMP_SI: { const SIInstrInfo *TII = static_cast<const SIInstrInfo *>( getTargetMachine().getSubtargetImpl()->getInstrInfo()); |

