diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-02-24 21:01:28 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-02-24 21:01:28 +0000 |
| commit | 41e2f2bacdd57e916909e52f34b06faaad4647f5 (patch) | |
| tree | fd4bc6c8392d05202256b4fe465cd949891824cc /llvm/lib | |
| parent | d0ce2bd8e484b5927824ff58dca7da3d896151dc (diff) | |
| download | bcm5719-llvm-41e2f2bacdd57e916909e52f34b06faaad4647f5.tar.gz bcm5719-llvm-41e2f2bacdd57e916909e52f34b06faaad4647f5.zip | |
R600/SI - Add new CI arithmetic instructions.
Does not yet include larger part required
to match v_mad_i64_i32 / v_mad_u64_u32.
llvm-svn: 202077
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/R600/AMDGPUISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/AMDGPUISelLowering.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/SIInstructions.td | 52 |
4 files changed, 72 insertions, 2 deletions
diff --git a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp index babd0e2eb1e..9629b70b470 100644 --- a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp @@ -45,6 +45,8 @@ static bool allocateStack(unsigned ValNo, MVT ValVT, MVT LocVT, AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) : TargetLowering(TM, new TargetLoweringObjectFileELF()) { + Subtarget = &TM.getSubtarget<AMDGPUSubtarget>(); + // Initialize target lowering borrowed from AMDIL InitAMDILLowering(); diff --git a/llvm/lib/Target/R600/AMDGPUISelLowering.h b/llvm/lib/Target/R600/AMDGPUISelLowering.h index b53ba0a542f..7fa25905d01 100644 --- a/llvm/lib/Target/R600/AMDGPUISelLowering.h +++ b/llvm/lib/Target/R600/AMDGPUISelLowering.h @@ -21,9 +21,13 @@ namespace llvm { class AMDGPUMachineFunction; +class AMDGPUSubtarget; class MachineRegisterInfo; class AMDGPUTargetLowering : public TargetLowering { +protected: + const AMDGPUSubtarget *Subtarget; + private: void ExtractVectorElements(SDValue Op, SelectionDAG &DAG, SmallVectorImpl<SDValue> &Args, diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 1a49ccb2268..004957ce189 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -14,6 +14,7 @@ #include "SIISelLowering.h" #include "AMDGPU.h" +#include "AMDGPUSubtarget.h" #include "AMDILIntrinsicInfo.h" #include "SIInstrInfo.h" #include "SIMachineFunctionInfo.h" @@ -30,7 +31,6 @@ using namespace llvm; SITargetLowering::SITargetLowering(TargetMachine &TM) : AMDGPUTargetLowering(TM) { - addRegisterClass(MVT::i1, &AMDGPU::SReg_64RegClass); addRegisterClass(MVT::i64, &AMDGPU::VSrc_64RegClass); @@ -175,8 +175,20 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) : } } - setTargetDAGCombine(ISD::SELECT_CC); + for (int I = MVT::v1f64; I <= MVT::v8f64; ++I) { + MVT::SimpleValueType VT = static_cast<MVT::SimpleValueType>(I); + setOperationAction(ISD::FTRUNC, MVT::f64, Expand); + setOperationAction(ISD::FCEIL, MVT::f64, Expand); + setOperationAction(ISD::FFLOOR, MVT::f64, Expand); + } + if (Subtarget->getGeneration() >= AMDGPUSubtarget::SEA_ISLANDS) { + setOperationAction(ISD::FTRUNC, MVT::f64, Legal); + setOperationAction(ISD::FCEIL, MVT::f64, Legal); + setOperationAction(ISD::FFLOOR, MVT::f64, Legal); + } + + setTargetDAGCombine(ISD::SELECT_CC); setTargetDAGCombine(ISD::SETCC); setSchedulingPreference(Sched::RegPressure); diff --git a/llvm/lib/Target/R600/SIInstructions.td b/llvm/lib/Target/R600/SIInstructions.td index 9da05c34d7b..b45da5cb9ee 100644 --- a/llvm/lib/Target/R600/SIInstructions.td +++ b/llvm/lib/Target/R600/SIInstructions.td @@ -29,6 +29,9 @@ def SendMsgImm : Operand<i32> { def isSI : Predicate<"Subtarget.getGeneration() " ">= AMDGPUSubtarget::SOUTHERN_ISLANDS">; +def isCI : Predicate<"Subtarget.getGeneration() " + ">= AMDGPUSubtarget::SEA_ISLANDS">; + def WAIT_FLAG : InstFlag<"printWaitFlag">; let Predicates = [isSI] in { @@ -2104,6 +2107,55 @@ def : MTBUF_StoreResource <v2i32, 2, TBUFFER_STORE_FORMAT_XY>; def : MTBUF_StoreResource <v4i32, 3, TBUFFER_STORE_FORMAT_XYZ>; def : MTBUF_StoreResource <v4i32, 4, TBUFFER_STORE_FORMAT_XYZW>; +let Predicates = [isCI] in { + +// Sea island new arithmetic instructinos +let neverHasSideEffects = 1 in { +defm V_TRUNC_F64 : VOP1_64 <0x00000017, "V_TRUNC_F64", + [(set f64:$dst, (ftrunc f64:$src0))] +>; +defm V_CEIL_F64 : VOP1_64 <0x00000018, "V_CEIL_F64", + [(set f64:$dst, (fceil f64:$src0))] +>; +defm V_FLOOR_F64 : VOP1_64 <0x0000001A, "V_FLOOR_F64", + [(set f64:$dst, (ffloor f64:$src0))] +>; + +defm V_RNDNE_F64 : VOP1_64 <0x00000019, "V_RNDNE_F64", []>; + +def V_QSAD_PK_U16_U8 : VOP3_32 <0x00000173, "V_QSAD_PK_U16_U8", []>; +def V_MQSAD_U16_U8 : VOP3_32 <0x000000172, "V_MQSAD_U16_U8", []>; +def V_MQSAD_U32_U8 : VOP3_32 <0x00000175, "V_MQSAD_U32_U8", []>; +def V_MAD_U64_U32 : VOP3_64 <0x00000176, "V_MAD_U64_U32", []>; + +// XXX - Does this set VCC? +def V_MAD_I64_I32 : VOP3_64 <0x00000177, "V_MAD_I64_I32", []>; +} // End neverHasSideEffects = 1 + +// Remaining instructions: +// FLAT_* +// S_CBRANCH_CDBGUSER +// S_CBRANCH_CDBGSYS +// S_CBRANCH_CDBGSYS_OR_USER +// S_CBRANCH_CDBGSYS_AND_USER +// S_DCACHE_INV_VOL +// V_EXP_LEGACY_F32 +// V_LOG_LEGACY_F32 +// DS_NOP +// DS_GWS_SEMA_RELEASE_ALL +// DS_WRAP_RTN_B32 +// DS_CNDXCHG32_RTN_B64 +// DS_WRITE_B96 +// DS_WRITE_B128 +// DS_CONDXCHG32_RTN_B128 +// DS_READ_B96 +// DS_READ_B128 +// BUFFER_LOAD_DWORDX3 +// BUFFER_STORE_DWORDX3 + +} // End Predicates = [isCI] + + /********** ====================== **********/ /********** Indirect adressing **********/ /********** ====================== **********/ |

