forked from OSchip/llvm-project
R600/SI: Use a ComplexPattern for ADDR64 addressing of MUBUF loads
llvm-svn: 212217
This commit is contained in:
parent
10ae6a0e6a
commit
7c1838d797
|
@ -576,7 +576,9 @@ class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBU
|
|||
let mayLoad = 0;
|
||||
}
|
||||
|
||||
multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
|
||||
multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass,
|
||||
ValueType load_vt = i32,
|
||||
SDPatternOperator ld = null_frag> {
|
||||
|
||||
let lds = 0, mayLoad = 1 in {
|
||||
|
||||
|
@ -618,7 +620,9 @@ multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
|
|||
let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
|
||||
def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
|
||||
(ins SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
|
||||
asm#" $vdata, $srsrc + $vaddr + $offset", []>;
|
||||
asm#" $vdata, $srsrc + $vaddr + $offset",
|
||||
[(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc,
|
||||
i64:$vaddr, u16imm:$offset)))]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -846,13 +846,27 @@ defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Load_Helper <0x00000003, "BUFFER_LOAD_FORMA
|
|||
//def BUFFER_STORE_FORMAT_XY : MUBUF_ <0x00000005, "BUFFER_STORE_FORMAT_XY", []>;
|
||||
//def BUFFER_STORE_FORMAT_XYZ : MUBUF_ <0x00000006, "BUFFER_STORE_FORMAT_XYZ", []>;
|
||||
//def BUFFER_STORE_FORMAT_XYZW : MUBUF_ <0x00000007, "BUFFER_STORE_FORMAT_XYZW", []>;
|
||||
defm BUFFER_LOAD_UBYTE : MUBUF_Load_Helper <0x00000008, "BUFFER_LOAD_UBYTE", VReg_32>;
|
||||
defm BUFFER_LOAD_SBYTE : MUBUF_Load_Helper <0x00000009, "BUFFER_LOAD_SBYTE", VReg_32>;
|
||||
defm BUFFER_LOAD_USHORT : MUBUF_Load_Helper <0x0000000a, "BUFFER_LOAD_USHORT", VReg_32>;
|
||||
defm BUFFER_LOAD_SSHORT : MUBUF_Load_Helper <0x0000000b, "BUFFER_LOAD_SSHORT", VReg_32>;
|
||||
defm BUFFER_LOAD_DWORD : MUBUF_Load_Helper <0x0000000c, "BUFFER_LOAD_DWORD", VReg_32>;
|
||||
defm BUFFER_LOAD_DWORDX2 : MUBUF_Load_Helper <0x0000000d, "BUFFER_LOAD_DWORDX2", VReg_64>;
|
||||
defm BUFFER_LOAD_DWORDX4 : MUBUF_Load_Helper <0x0000000e, "BUFFER_LOAD_DWORDX4", VReg_128>;
|
||||
defm BUFFER_LOAD_UBYTE : MUBUF_Load_Helper <
|
||||
0x00000008, "BUFFER_LOAD_UBYTE", VReg_32, i32, az_extloadi8_global
|
||||
>;
|
||||
defm BUFFER_LOAD_SBYTE : MUBUF_Load_Helper <
|
||||
0x00000009, "BUFFER_LOAD_SBYTE", VReg_32, i32, sextloadi8_global
|
||||
>;
|
||||
defm BUFFER_LOAD_USHORT : MUBUF_Load_Helper <
|
||||
0x0000000a, "BUFFER_LOAD_USHORT", VReg_32, i32, az_extloadi16_global
|
||||
>;
|
||||
defm BUFFER_LOAD_SSHORT : MUBUF_Load_Helper <
|
||||
0x0000000b, "BUFFER_LOAD_SSHORT", VReg_32, i32, sextloadi16_global
|
||||
>;
|
||||
defm BUFFER_LOAD_DWORD : MUBUF_Load_Helper <
|
||||
0x0000000c, "BUFFER_LOAD_DWORD", VReg_32, i32, global_load
|
||||
>;
|
||||
defm BUFFER_LOAD_DWORDX2 : MUBUF_Load_Helper <
|
||||
0x0000000d, "BUFFER_LOAD_DWORDX2", VReg_64, v2i32, global_load
|
||||
>;
|
||||
defm BUFFER_LOAD_DWORDX4 : MUBUF_Load_Helper <
|
||||
0x0000000e, "BUFFER_LOAD_DWORDX4", VReg_128, v4i32, global_load
|
||||
>;
|
||||
|
||||
def BUFFER_STORE_BYTE : MUBUF_Store_Helper <
|
||||
0x00000018, "BUFFER_STORE_BYTE", VReg_32, i32, truncstorei8_global
|
||||
|
@ -2482,27 +2496,7 @@ defm : DSAtomicCmpXChg<DS_CMPST_RTN_B64, i64, atomic_cmp_swap_64_local>;
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass MUBUFLoad_Pattern <MUBUF Instr_ADDR64, ValueType vt,
|
||||
PatFrag global_ld, PatFrag constant_ld> {
|
||||
def : Pat <
|
||||
(vt (global_ld (mubuf_vaddr_offset i64:$ptr, i64:$offset, IMM12bit:$imm_offset))),
|
||||
(Instr_ADDR64 (SI_ADDR64_RSRC $ptr), $offset, (as_i16imm $imm_offset))
|
||||
>;
|
||||
|
||||
def : Pat <
|
||||
(vt (global_ld (add i64:$ptr, (i64 IMM12bit:$offset)))),
|
||||
(Instr_ADDR64 (SI_ADDR64_RSRC (i64 0)), $ptr, (as_i16imm $offset))
|
||||
>;
|
||||
|
||||
def : Pat <
|
||||
(vt (global_ld i64:$ptr)),
|
||||
(Instr_ADDR64 (SI_ADDR64_RSRC (i64 0)), $ptr, 0)
|
||||
>;
|
||||
|
||||
def : Pat <
|
||||
(vt (global_ld (add i64:$ptr, i64:$offset))),
|
||||
(Instr_ADDR64 (SI_ADDR64_RSRC $ptr), $offset, 0)
|
||||
>;
|
||||
|
||||
PatFrag constant_ld> {
|
||||
def : Pat <
|
||||
(vt (constant_ld (add i64:$ptr, i64:$offset))),
|
||||
(Instr_ADDR64 (SI_ADDR64_RSRC $ptr), $offset, 0)
|
||||
|
@ -2510,19 +2504,19 @@ multiclass MUBUFLoad_Pattern <MUBUF Instr_ADDR64, ValueType vt,
|
|||
}
|
||||
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_ADDR64, i32,
|
||||
sextloadi8_global, sextloadi8_constant>;
|
||||
sextloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_ADDR64, i32,
|
||||
az_extloadi8_global, az_extloadi8_constant>;
|
||||
az_extloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_SSHORT_ADDR64, i32,
|
||||
sextloadi16_global, sextloadi16_constant>;
|
||||
sextloadi16_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_USHORT_ADDR64, i32,
|
||||
az_extloadi16_global, az_extloadi16_constant>;
|
||||
az_extloadi16_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORD_ADDR64, i32,
|
||||
global_load, constant_load>;
|
||||
constant_load>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, v2i32,
|
||||
global_load, constant_load>;
|
||||
constant_load>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX4_ADDR64, v4i32,
|
||||
global_load, constant_load>;
|
||||
constant_load>;
|
||||
|
||||
// BUFFER_LOAD_DWORD*, addr64=0
|
||||
multiclass MUBUF_Load_Dword <ValueType vt, MUBUF offset, MUBUF offen, MUBUF idxen,
|
||||
|
|
Loading…
Reference in New Issue