diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-02-27 08:53:46 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-02-27 08:53:46 +0000 |
commit | 61738cbcb6c40cdaf6a6c560787b07373415114c (patch) | |
tree | 07e4ca2782e2f1996a768a1dfe09241c4630ac59 /llvm/lib | |
parent | 353c84e747924745eb0e5df4defc2afd90a1758e (diff) | |
download | bcm5719-llvm-61738cbcb6c40cdaf6a6c560787b07373415114c.tar.gz bcm5719-llvm-61738cbcb6c40cdaf6a6c560787b07373415114c.zip |
AMDGPU: Implement readcyclecounter
This matches the behavior of the HSAIL clock instruction.
s_realmemtime is used if the subtarget supports it, and falls
back to s_memtime if not.
Also introduces new intrinsics for each of s_memtime / s_memrealtime.
llvm-svn: 262119
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPU.td | 8 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h | 1 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrInfo.td | 32 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstructions.td | 17 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/VIInstructions.td | 14 |
7 files changed, 68 insertions, 10 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td index 5321fe14873..145fadcee74 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.td +++ b/llvm/lib/Target/AMDGPU/AMDGPU.td @@ -149,6 +149,12 @@ def FeatureCIInsts : SubtargetFeature<"ci-insts", "Additional intstructions for CI+" >; +def FeatureVIInsts : SubtargetFeature<"vi-insts", + "VIInsts", + "true", + "Additional intstructions for VI+" +>; + //===------------------------------------------------------------===// // Subtarget Features (options and debugging) //===------------------------------------------------------------===// @@ -308,7 +314,7 @@ def FeatureSeaIslands : SubtargetFeatureGeneration<"SEA_ISLANDS", def FeatureVolcanicIslands : SubtargetFeatureGeneration<"VOLCANIC_ISLANDS", [FeatureFP64, FeatureLocalMemorySize65536, FeatureWavefrontSize64, FeatureFlatAddressSpace, FeatureGCN, - FeatureGCN3Encoding, FeatureCIInsts] + FeatureGCN3Encoding, FeatureCIInsts, FeatureVIInsts] >; //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp index 8e58aae9b79..91d1aec5c07 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp @@ -81,7 +81,8 @@ AMDGPUSubtarget::AMDGPUSubtarget(const Triple &TT, StringRef GPU, StringRef FS, WavefrontSize(0), CFALUBug(false), LocalMemorySize(0), MaxPrivateElementSize(0), EnableVGPRSpilling(false), SGPRInitBug(false), IsGCN(false), - GCN1Encoding(false), GCN3Encoding(false), CIInsts(false), LDSBankCount(0), + GCN1Encoding(false), GCN3Encoding(false), CIInsts(false), VIInsts(false), + LDSBankCount(0), IsaVersion(ISAVersion0_0_0), EnableHugeScratchBuffer(false), EnableSIScheduler(false), FrameLowering(nullptr), InstrItins(getInstrItineraryForCPU(GPU)), TargetTriple(TT) { diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h index c943b2cf6f4..787c04aef2d 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h @@ -88,6 +88,7 @@ private: bool GCN1Encoding; bool GCN3Encoding; bool CIInsts; + bool VIInsts; bool FeatureDisable; int LDSBankCount; unsigned IsaVersion; diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index ada827d38c2..46b73f7ed09 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -135,6 +135,9 @@ SITargetLowering::SITargetLowering(TargetMachine &TM, setOperationAction(ISD::BR_CC, MVT::f32, Expand); setOperationAction(ISD::BR_CC, MVT::f64, Expand); + // On SI this is s_memtime and s_memrealtime on VI. + setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Legal); + for (MVT VT : MVT::integer_valuetypes()) { if (VT == MVT::i64) continue; diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index d99028f4be5..a63df887c59 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1077,23 +1077,31 @@ multiclass SMRD_m <smrd op, string opName, bit imm, dag outs, dag ins, } } -multiclass SMRD_Inval <smrd op, string opName, - SDPatternOperator node> { - let hasSideEffects = 1, mayStore = 1 in { - def "" : SMRD_Pseudo <opName, (outs), (ins), [(node)]>; +multiclass SMRD_Special <smrd op, string opName, dag outs, + string opStr = "", + list<dag> pattern = []> { + let hasSideEffects = 1 in { + def "" : SMRD_Pseudo <opName, outs, (ins), pattern>; let sbase = 0, offset = 0 in { let sdst = 0 in { - def _si : SMRD_Real_si <op.SI, opName, 0, (outs), (ins), opName>; + def _si : SMRD_Real_si <op.SI, opName, 0, outs, (ins), opName#opStr>; } let glc = 0, sdata = 0 in { - def _vi : SMRD_Real_vi <op.VI, opName, 0, (outs), (ins), opName>; + def _vi : SMRD_Real_vi <op.VI, opName, 0, outs, (ins), opName#opStr>; } } } } +multiclass SMRD_Inval <smrd op, string opName, + SDPatternOperator node> { + let mayStore = 1 in { + defm : SMRD_Special<op, opName, (outs), "", [(node)]>; + } +} + class SMEM_Inval <bits<8> op, string opName, SDPatternOperator node> : SMRD_Real_vi<op, opName, 0, (outs), (ins), opName, [(node)]> { let hasSideEffects = 1; @@ -1104,6 +1112,18 @@ class SMEM_Inval <bits<8> op, string opName, SDPatternOperator node> : let offset = 0; } +class SMEM_Ret <bits<8> op, string opName, SDPatternOperator node> : + SMRD_Real_vi<op, opName, 0, (outs SReg_64:$dst), (ins), + opName#" $dst", [(set i64:$dst, (node))]> { + let hasSideEffects = 1; + let mayStore = ?; + let mayLoad = ?; + let sbase = 0; + let sdata = 0; + let glc = 0; + let offset = 0; +} + multiclass SMRD_Helper <smrd op, string opName, RegisterClass baseClass, RegisterClass dstClass> { defm _IMM : SMRD_m < diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index debf9ae82d2..def2f267820 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -88,7 +88,15 @@ defm S_BUFFER_LOAD_DWORDX16 : SMRD_Helper < smrd<0x0c>, "s_buffer_load_dwordx16", SReg_128, SReg_512 >; -//def S_MEMTIME : SMRD_ <0x0000001e, "s_memtime", []>; +let mayStore = ? in { +// FIXME: mayStore = ? is a workaround for tablegen bug for different +// inferred mayStore flags for the instruction pattern vs. standalone +// Pat. Each considers the other contradictory. + +defm S_MEMTIME : SMRD_Special <smrd<0x1e, 0x24>, "s_memtime", + (outs SReg_64:$dst), " $dst", [(set i64:$dst, (int_amdgcn_s_memtime))] +>; +} defm S_DCACHE_INV : SMRD_Inval <smrd<0x1f, 0x20>, "s_dcache_inv", int_amdgcn_s_dcache_inv>; @@ -3151,6 +3159,13 @@ defm : BFMPatterns <i32, S_BFM_B32, S_MOV_B32>; def : BFEPattern <V_BFE_U32, S_MOV_B32>; +let Predicates = [isSICI] in { +def : Pat < + (i64 (readcyclecounter)), + (S_MEMTIME) +>; +} + //===----------------------------------------------------------------------===// // Fract Patterns //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/VIInstructions.td b/llvm/lib/Target/AMDGPU/VIInstructions.td index 807d461cd9c..b998b8a725c 100644 --- a/llvm/lib/Target/AMDGPU/VIInstructions.td +++ b/llvm/lib/Target/AMDGPU/VIInstructions.td @@ -103,6 +103,9 @@ def S_DCACHE_WB : SMEM_Inval <0x21, def S_DCACHE_WB_VOL : SMEM_Inval <0x23, "s_dcache_wb_vol", int_amdgcn_s_dcache_wb_vol>; +def S_MEMREALTIME : SMEM_Ret<0x25, + "s_memrealtime", int_amdgcn_s_memrealtime>; + } // End SIAssemblerPredicate = DisableInst, SubtargetPredicate = isVI let Predicates = [isVI] in { @@ -114,7 +117,7 @@ def : Pat < >; //===----------------------------------------------------------------------===// -// DPP Paterns +// DPP Patterns //===----------------------------------------------------------------------===// def : Pat < @@ -124,4 +127,13 @@ def : Pat < (as_i32imm $bank_mask), (as_i32imm $row_mask)) >; +//===----------------------------------------------------------------------===// +// Misc Patterns +//===----------------------------------------------------------------------===// + +def : Pat < + (i64 (readcyclecounter)), + (S_MEMREALTIME) +>; + } // End Predicates = [isVI] |