1*9880d681SAndroid Build Coastguard Worker//===-- CaymanInstructions.td - CM Instruction defs -------*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// TableGen definitions for instructions which are available only on Cayman 11*9880d681SAndroid Build Coastguard Worker// family GPUs. 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdef isCayman : Predicate<"Subtarget->hasCaymanISA()">; 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 18*9880d681SAndroid Build Coastguard Worker// Cayman Instructions 19*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerlet Predicates = [isCayman] in { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdef MULADD_INT24_cm : R600_3OP <0x08, "MULADD_INT24", 24*9880d681SAndroid Build Coastguard Worker [(set i32:$dst, (AMDGPUmad_i24 i32:$src0, i32:$src1, i32:$src2))], VecALU 25*9880d681SAndroid Build Coastguard Worker>; 26*9880d681SAndroid Build Coastguard Workerdef MUL_INT24_cm : R600_2OP <0x5B, "MUL_INT24", 27*9880d681SAndroid Build Coastguard Worker [(set i32:$dst, (AMDGPUmul_i24 i32:$src0, i32:$src1))], VecALU 28*9880d681SAndroid Build Coastguard Worker>; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdef : IMad24Pat<MULADD_INT24_cm>; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerlet isVector = 1 in { 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdef RECIP_IEEE_cm : RECIP_IEEE_Common<0x86>; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdef MULLO_INT_cm : MULLO_INT_Common<0x8F>; 37*9880d681SAndroid Build Coastguard Workerdef MULHI_INT_cm : MULHI_INT_Common<0x90>; 38*9880d681SAndroid Build Coastguard Workerdef MULLO_UINT_cm : MULLO_UINT_Common<0x91>; 39*9880d681SAndroid Build Coastguard Workerdef MULHI_UINT_cm : MULHI_UINT_Common<0x92>; 40*9880d681SAndroid Build Coastguard Workerdef RECIPSQRT_CLAMPED_cm : RECIPSQRT_CLAMPED_Common<0x87>; 41*9880d681SAndroid Build Coastguard Workerdef EXP_IEEE_cm : EXP_IEEE_Common<0x81>; 42*9880d681SAndroid Build Coastguard Workerdef LOG_IEEE_cm : LOG_IEEE_Common<0x83>; 43*9880d681SAndroid Build Coastguard Workerdef RECIP_CLAMPED_cm : RECIP_CLAMPED_Common<0x84>; 44*9880d681SAndroid Build Coastguard Workerdef RECIPSQRT_IEEE_cm : RECIPSQRT_IEEE_Common<0x89>; 45*9880d681SAndroid Build Coastguard Workerdef SIN_cm : SIN_Common<0x8D>; 46*9880d681SAndroid Build Coastguard Workerdef COS_cm : COS_Common<0x8E>; 47*9880d681SAndroid Build Coastguard Worker} // End isVector = 1 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdef : RsqPat<RECIPSQRT_IEEE_cm, f32>; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdef : POW_Common <LOG_IEEE_cm, EXP_IEEE_cm, MUL>; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefm DIV_cm : DIV_Common<RECIP_IEEE_cm>; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker// RECIP_UINT emulation for Cayman 56*9880d681SAndroid Build Coastguard Worker// The multiplication scales from [0,1] to the unsigned integer range 57*9880d681SAndroid Build Coastguard Workerdef : Pat < 58*9880d681SAndroid Build Coastguard Worker (AMDGPUurecip i32:$src0), 59*9880d681SAndroid Build Coastguard Worker (FLT_TO_UINT_eg (MUL_IEEE (RECIP_IEEE_cm (UINT_TO_FLT_eg $src0)), 60*9880d681SAndroid Build Coastguard Worker (MOV_IMM_I32 CONST.FP_UINT_MAX_PLUS_1))) 61*9880d681SAndroid Build Coastguard Worker>; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker def CF_END_CM : CF_CLAUSE_EG<32, (ins), "CF_END"> { 64*9880d681SAndroid Build Coastguard Worker let ADDR = 0; 65*9880d681SAndroid Build Coastguard Worker let POP_COUNT = 0; 66*9880d681SAndroid Build Coastguard Worker let COUNT = 0; 67*9880d681SAndroid Build Coastguard Worker } 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsqrt f32:$src), (MUL R600_Reg32:$src, (RECIPSQRT_CLAMPED_cm $src))>; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerclass RAT_STORE_DWORD <RegisterClass rc, ValueType vt, bits<4> mask> : 73*9880d681SAndroid Build Coastguard Worker CF_MEM_RAT_CACHELESS <0x14, 0, mask, 74*9880d681SAndroid Build Coastguard Worker (ins rc:$rw_gpr, R600_TReg32_X:$index_gpr), 75*9880d681SAndroid Build Coastguard Worker "STORE_DWORD $rw_gpr, $index_gpr", 76*9880d681SAndroid Build Coastguard Worker [(global_store vt:$rw_gpr, i32:$index_gpr)]> { 77*9880d681SAndroid Build Coastguard Worker let eop = 0; // This bit is not used on Cayman. 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdef RAT_STORE_DWORD32 : RAT_STORE_DWORD <R600_TReg32_X, i32, 0x1>; 81*9880d681SAndroid Build Coastguard Workerdef RAT_STORE_DWORD64 : RAT_STORE_DWORD <R600_Reg64, v2i32, 0x3>; 82*9880d681SAndroid Build Coastguard Workerdef RAT_STORE_DWORD128 : RAT_STORE_DWORD <R600_Reg128, v4i32, 0xf>; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdef RAT_STORE_TYPED_cm: CF_MEM_RAT_STORE_TYPED<0> { 85*9880d681SAndroid Build Coastguard Worker let eop = 0; // This bit is not used on Cayman. 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerclass VTX_READ_cm <string name, bits<8> buffer_id, dag outs, list<dag> pattern> 89*9880d681SAndroid Build Coastguard Worker : VTX_WORD0_cm, VTX_READ<name, buffer_id, outs, pattern> { 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker // Static fields 92*9880d681SAndroid Build Coastguard Worker let VC_INST = 0; 93*9880d681SAndroid Build Coastguard Worker let FETCH_TYPE = 2; 94*9880d681SAndroid Build Coastguard Worker let FETCH_WHOLE_QUAD = 0; 95*9880d681SAndroid Build Coastguard Worker let BUFFER_ID = buffer_id; 96*9880d681SAndroid Build Coastguard Worker let SRC_REL = 0; 97*9880d681SAndroid Build Coastguard Worker // XXX: We can infer this field based on the SRC_GPR. This would allow us 98*9880d681SAndroid Build Coastguard Worker // to store vertex addresses in any channel, not just X. 99*9880d681SAndroid Build Coastguard Worker let SRC_SEL_X = 0; 100*9880d681SAndroid Build Coastguard Worker let SRC_SEL_Y = 0; 101*9880d681SAndroid Build Coastguard Worker let STRUCTURED_READ = 0; 102*9880d681SAndroid Build Coastguard Worker let LDS_REQ = 0; 103*9880d681SAndroid Build Coastguard Worker let COALESCED_READ = 0; 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker let Inst{31-0} = Word0; 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerclass VTX_READ_8_cm <bits<8> buffer_id, list<dag> pattern> 109*9880d681SAndroid Build Coastguard Worker : VTX_READ_cm <"VTX_READ_8 $dst_gpr, $src_gpr", buffer_id, 110*9880d681SAndroid Build Coastguard Worker (outs R600_TReg32_X:$dst_gpr), pattern> { 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker let DST_SEL_X = 0; 113*9880d681SAndroid Build Coastguard Worker let DST_SEL_Y = 7; // Masked 114*9880d681SAndroid Build Coastguard Worker let DST_SEL_Z = 7; // Masked 115*9880d681SAndroid Build Coastguard Worker let DST_SEL_W = 7; // Masked 116*9880d681SAndroid Build Coastguard Worker let DATA_FORMAT = 1; // FMT_8 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerclass VTX_READ_16_cm <bits<8> buffer_id, list<dag> pattern> 120*9880d681SAndroid Build Coastguard Worker : VTX_READ_cm <"VTX_READ_16 $dst_gpr, $src_gpr", buffer_id, 121*9880d681SAndroid Build Coastguard Worker (outs R600_TReg32_X:$dst_gpr), pattern> { 122*9880d681SAndroid Build Coastguard Worker let DST_SEL_X = 0; 123*9880d681SAndroid Build Coastguard Worker let DST_SEL_Y = 7; // Masked 124*9880d681SAndroid Build Coastguard Worker let DST_SEL_Z = 7; // Masked 125*9880d681SAndroid Build Coastguard Worker let DST_SEL_W = 7; // Masked 126*9880d681SAndroid Build Coastguard Worker let DATA_FORMAT = 5; // FMT_16 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerclass VTX_READ_32_cm <bits<8> buffer_id, list<dag> pattern> 131*9880d681SAndroid Build Coastguard Worker : VTX_READ_cm <"VTX_READ_32 $dst_gpr, $src_gpr", buffer_id, 132*9880d681SAndroid Build Coastguard Worker (outs R600_TReg32_X:$dst_gpr), pattern> { 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker let DST_SEL_X = 0; 135*9880d681SAndroid Build Coastguard Worker let DST_SEL_Y = 7; // Masked 136*9880d681SAndroid Build Coastguard Worker let DST_SEL_Z = 7; // Masked 137*9880d681SAndroid Build Coastguard Worker let DST_SEL_W = 7; // Masked 138*9880d681SAndroid Build Coastguard Worker let DATA_FORMAT = 0xD; // COLOR_32 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker // This is not really necessary, but there were some GPU hangs that appeared 141*9880d681SAndroid Build Coastguard Worker // to be caused by ALU instructions in the next instruction group that wrote 142*9880d681SAndroid Build Coastguard Worker // to the $src_gpr registers of the VTX_READ. 143*9880d681SAndroid Build Coastguard Worker // e.g. 144*9880d681SAndroid Build Coastguard Worker // %T3_X<def> = VTX_READ_PARAM_32_eg %T2_X<kill>, 24 145*9880d681SAndroid Build Coastguard Worker // %T2_X<def> = MOV %ZERO 146*9880d681SAndroid Build Coastguard Worker //Adding this constraint prevents this from happening. 147*9880d681SAndroid Build Coastguard Worker let Constraints = "$src_gpr.ptr = $dst_gpr"; 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerclass VTX_READ_64_cm <bits<8> buffer_id, list<dag> pattern> 151*9880d681SAndroid Build Coastguard Worker : VTX_READ_cm <"VTX_READ_64 $dst_gpr, $src_gpr", buffer_id, 152*9880d681SAndroid Build Coastguard Worker (outs R600_Reg64:$dst_gpr), pattern> { 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker let DST_SEL_X = 0; 155*9880d681SAndroid Build Coastguard Worker let DST_SEL_Y = 1; 156*9880d681SAndroid Build Coastguard Worker let DST_SEL_Z = 7; 157*9880d681SAndroid Build Coastguard Worker let DST_SEL_W = 7; 158*9880d681SAndroid Build Coastguard Worker let DATA_FORMAT = 0x1D; // COLOR_32_32 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerclass VTX_READ_128_cm <bits<8> buffer_id, list<dag> pattern> 162*9880d681SAndroid Build Coastguard Worker : VTX_READ_cm <"VTX_READ_128 $dst_gpr.XYZW, $src_gpr", buffer_id, 163*9880d681SAndroid Build Coastguard Worker (outs R600_Reg128:$dst_gpr), pattern> { 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker let DST_SEL_X = 0; 166*9880d681SAndroid Build Coastguard Worker let DST_SEL_Y = 1; 167*9880d681SAndroid Build Coastguard Worker let DST_SEL_Z = 2; 168*9880d681SAndroid Build Coastguard Worker let DST_SEL_W = 3; 169*9880d681SAndroid Build Coastguard Worker let DATA_FORMAT = 0x22; // COLOR_32_32_32_32 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker // XXX: Need to force VTX_READ_128 instructions to write to the same register 172*9880d681SAndroid Build Coastguard Worker // that holds its buffer address to avoid potential hangs. We can't use 173*9880d681SAndroid Build Coastguard Worker // the same constraint as VTX_READ_32_eg, because the $src_gpr.ptr and $dst 174*9880d681SAndroid Build Coastguard Worker // registers are different sizes. 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 178*9880d681SAndroid Build Coastguard Worker// VTX Read from parameter memory space 179*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 180*9880d681SAndroid Build Coastguard Workerdef VTX_READ_PARAM_8_cm : VTX_READ_8_cm <0, 181*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (load_param_exti8 ADDRVTX_READ:$src_gpr))] 182*9880d681SAndroid Build Coastguard Worker>; 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerdef VTX_READ_PARAM_16_cm : VTX_READ_16_cm <0, 185*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (load_param_exti16 ADDRVTX_READ:$src_gpr))] 186*9880d681SAndroid Build Coastguard Worker>; 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdef VTX_READ_PARAM_32_cm : VTX_READ_32_cm <0, 189*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (load_param ADDRVTX_READ:$src_gpr))] 190*9880d681SAndroid Build Coastguard Worker>; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdef VTX_READ_PARAM_64_cm : VTX_READ_64_cm <0, 193*9880d681SAndroid Build Coastguard Worker [(set v2i32:$dst_gpr, (load_param ADDRVTX_READ:$src_gpr))] 194*9880d681SAndroid Build Coastguard Worker>; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdef VTX_READ_PARAM_128_cm : VTX_READ_128_cm <0, 197*9880d681SAndroid Build Coastguard Worker [(set v4i32:$dst_gpr, (load_param ADDRVTX_READ:$src_gpr))] 198*9880d681SAndroid Build Coastguard Worker>; 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 201*9880d681SAndroid Build Coastguard Worker// VTX Read from global memory space 202*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker// 8-bit reads 205*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID1_8_cm : VTX_READ_8_cm <1, 206*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id1_az_extloadi8 ADDRVTX_READ:$src_gpr))] 207*9880d681SAndroid Build Coastguard Worker>; 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker// 16-bit reads 210*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID1_16_cm : VTX_READ_16_cm <1, 211*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id1_az_extloadi16 ADDRVTX_READ:$src_gpr))] 212*9880d681SAndroid Build Coastguard Worker>; 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker// 32-bit reads 215*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID1_32_cm : VTX_READ_32_cm <1, 216*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id1_load ADDRVTX_READ:$src_gpr))] 217*9880d681SAndroid Build Coastguard Worker>; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker// 64-bit reads 220*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID1_64_cm : VTX_READ_64_cm <1, 221*9880d681SAndroid Build Coastguard Worker [(set v2i32:$dst_gpr, (vtx_id1_load ADDRVTX_READ:$src_gpr))] 222*9880d681SAndroid Build Coastguard Worker>; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker// 128-bit reads 225*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID1_128_cm : VTX_READ_128_cm <1, 226*9880d681SAndroid Build Coastguard Worker [(set v4i32:$dst_gpr, (vtx_id1_load ADDRVTX_READ:$src_gpr))] 227*9880d681SAndroid Build Coastguard Worker>; 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker// 8-bit reads 230*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID2_8_cm : VTX_READ_8_cm <2, 231*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id2_az_extloadi8 ADDRVTX_READ:$src_gpr))] 232*9880d681SAndroid Build Coastguard Worker>; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker// 16-bit reads 235*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID2_16_cm : VTX_READ_16_cm <2, 236*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id2_az_extloadi16 ADDRVTX_READ:$src_gpr))] 237*9880d681SAndroid Build Coastguard Worker>; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker// 32-bit reads 240*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID2_32_cm : VTX_READ_32_cm <2, 241*9880d681SAndroid Build Coastguard Worker [(set i32:$dst_gpr, (vtx_id2_load ADDRVTX_READ:$src_gpr))] 242*9880d681SAndroid Build Coastguard Worker>; 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker// 64-bit reads 245*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID2_64_cm : VTX_READ_64_cm <2, 246*9880d681SAndroid Build Coastguard Worker [(set v2i32:$dst_gpr, (vtx_id2_load ADDRVTX_READ:$src_gpr))] 247*9880d681SAndroid Build Coastguard Worker>; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker// 128-bit reads 250*9880d681SAndroid Build Coastguard Workerdef VTX_READ_ID2_128_cm : VTX_READ_128_cm <2, 251*9880d681SAndroid Build Coastguard Worker [(set v4i32:$dst_gpr, (vtx_id2_load ADDRVTX_READ:$src_gpr))] 252*9880d681SAndroid Build Coastguard Worker>; 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker} // End isCayman 255*9880d681SAndroid Build Coastguard Worker 256