forked from OSchip/llvm-project
AMDGPU/SI: Use ComplexPatterns for SMRD addressing modes
Summary: This allows us to consolidate several of the TableGen patterns. Reviewers: arsenm Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D11602 llvm-svn: 244253
This commit is contained in:
parent
4ab57cd9ab
commit
dee26a2876
|
@ -108,6 +108,14 @@ private:
|
||||||
SDValue &TFE) const;
|
SDValue &TFE) const;
|
||||||
bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
|
bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
|
||||||
SDValue &Offset, SDValue &GLC) const;
|
SDValue &Offset, SDValue &GLC) const;
|
||||||
|
bool SelectSMRDOffset(SDValue ByteOffsetNode, SDValue &Offset,
|
||||||
|
bool &Imm) const;
|
||||||
|
bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset,
|
||||||
|
bool &Imm) const;
|
||||||
|
bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
|
||||||
|
bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
|
||||||
|
bool SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const;
|
||||||
|
bool SelectSMRDBufferSgpr(SDValue Addr, SDValue &Offset) const;
|
||||||
SDNode *SelectAddrSpaceCast(SDNode *N);
|
SDNode *SelectAddrSpaceCast(SDNode *N);
|
||||||
bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
|
bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
|
||||||
bool SelectVOP3NoMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
|
bool SelectVOP3NoMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
|
||||||
|
@ -1153,6 +1161,89 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc,
|
||||||
return SelectMUBUFOffset(Addr, SRsrc, Soffset, Offset, GLC, SLC, TFE);
|
return SelectMUBUFOffset(Addr, SRsrc, Soffset, Offset, GLC, SLC, TFE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \param EncodedOffset This is the immediate value that will be encoded
|
||||||
|
/// directly into the instruction. On SI/CI the \p EncodedOffset
|
||||||
|
/// will be in units of dwords and on VI+ it will be units of bytes.
|
||||||
|
static bool isLegalSMRDImmOffset(const AMDGPUSubtarget *ST,
|
||||||
|
int64_t EncodedOffset) {
|
||||||
|
return ST->getGeneration() < AMDGPUSubtarget::VOLCANIC_ISLANDS ?
|
||||||
|
isUInt<8>(EncodedOffset) : isUInt<20>(EncodedOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode,
|
||||||
|
SDValue &Offset, bool &Imm) const {
|
||||||
|
|
||||||
|
// FIXME: Handle non-constant offsets.
|
||||||
|
ConstantSDNode *C = dyn_cast<ConstantSDNode>(ByteOffsetNode);
|
||||||
|
if (!C)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SDLoc SL(ByteOffsetNode);
|
||||||
|
AMDGPUSubtarget::Generation Gen = Subtarget->getGeneration();
|
||||||
|
int64_t ByteOffset = C->getSExtValue();
|
||||||
|
int64_t EncodedOffset = Gen < AMDGPUSubtarget::VOLCANIC_ISLANDS ?
|
||||||
|
ByteOffset >> 2 : ByteOffset;
|
||||||
|
|
||||||
|
if (isLegalSMRDImmOffset(Subtarget, EncodedOffset)) {
|
||||||
|
Offset = CurDAG->getTargetConstant(EncodedOffset, SL, MVT::i32);
|
||||||
|
Imm = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isUInt<32>(ByteOffset)) {
|
||||||
|
SDValue C32Bit = CurDAG->getTargetConstant(ByteOffset, SL, MVT::i32);
|
||||||
|
Offset = SDValue(CurDAG->getMachineNode(AMDGPU::S_MOV_B32, SL, MVT::i32,
|
||||||
|
C32Bit), 0);
|
||||||
|
Imm = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase,
|
||||||
|
SDValue &Offset, bool &Imm) const {
|
||||||
|
|
||||||
|
SDLoc SL(Addr);
|
||||||
|
if (CurDAG->isBaseWithConstantOffset(Addr)) {
|
||||||
|
SDValue N0 = Addr.getOperand(0);
|
||||||
|
SDValue N1 = Addr.getOperand(1);
|
||||||
|
|
||||||
|
if (SelectSMRDOffset(N1, Offset, Imm)) {
|
||||||
|
SBase = N0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SBase = Addr;
|
||||||
|
Offset = CurDAG->getTargetConstant(0, SL, MVT::i32);
|
||||||
|
Imm = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRDImm(SDValue Addr, SDValue &SBase,
|
||||||
|
SDValue &Offset) const {
|
||||||
|
bool Imm;
|
||||||
|
return SelectSMRD(Addr, SBase, Offset, Imm) && Imm;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase,
|
||||||
|
SDValue &Offset) const {
|
||||||
|
bool Imm;
|
||||||
|
return SelectSMRD(Addr, SBase, Offset, Imm) && !Imm;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr,
|
||||||
|
SDValue &Offset) const {
|
||||||
|
bool Imm;
|
||||||
|
return SelectSMRDOffset(Addr, Offset, Imm) && Imm;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AMDGPUDAGToDAGISel::SelectSMRDBufferSgpr(SDValue Addr,
|
||||||
|
SDValue &Offset) const {
|
||||||
|
bool Imm;
|
||||||
|
return SelectSMRDOffset(Addr, Offset, Imm) && !Imm;
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: This is incorrect and only enough to be able to compile.
|
// FIXME: This is incorrect and only enough to be able to compile.
|
||||||
SDNode *AMDGPUDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
|
SDNode *AMDGPUDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
|
||||||
AddrSpaceCastSDNode *ASC = cast<AddrSpaceCastSDNode>(N);
|
AddrSpaceCastSDNode *ASC = cast<AddrSpaceCastSDNode>(N);
|
||||||
|
|
|
@ -222,6 +222,19 @@ class SMRDe <bits<5> op, bits<1> imm> : Enc32 {
|
||||||
let Inst{31-27} = 0x18; //encoding
|
let Inst{31-27} = 0x18; //encoding
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SMRD_IMMe_ci <bits<5> op> : Enc64 {
|
||||||
|
bits<7> sdst;
|
||||||
|
bits<7> sbase;
|
||||||
|
bits<32> offset;
|
||||||
|
|
||||||
|
let Inst{7-0} = 0xff;
|
||||||
|
let Inst{8} = 0;
|
||||||
|
let Inst{14-9} = sbase{6-1};
|
||||||
|
let Inst{21-15} = sdst;
|
||||||
|
let Inst{26-22} = 0x18; //encoding
|
||||||
|
let Inst{63-32} = offset;
|
||||||
|
}
|
||||||
|
|
||||||
let SchedRW = [WriteSALU] in {
|
let SchedRW = [WriteSALU] in {
|
||||||
class SOP1 <dag outs, dag ins, string asm, list<dag> pattern> :
|
class SOP1 <dag outs, dag ins, string asm, list<dag> pattern> :
|
||||||
InstSI<outs, ins, asm, pattern> {
|
InstSI<outs, ins, asm, pattern> {
|
||||||
|
|
|
@ -528,6 +528,12 @@ def MUBUFScratch : ComplexPattern<i64, 4, "SelectMUBUFScratch">;
|
||||||
def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">;
|
def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">;
|
||||||
def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
|
def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
|
||||||
|
|
||||||
|
def SMRDImm : ComplexPattern<i64, 2, "SelectSMRDImm">;
|
||||||
|
def SMRDSgpr : ComplexPattern<i64, 2, "SelectSMRDSgpr">;
|
||||||
|
def SMRDBufferImm : ComplexPattern<i32, 1, "SelectSMRDBufferImm">;
|
||||||
|
def SMRDBufferSgpr : ComplexPattern<i32, 1, "SelectSMRDBufferSgpr">;
|
||||||
|
|
||||||
|
|
||||||
def VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">;
|
def VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">;
|
||||||
def VOP3NoMods0 : ComplexPattern<untyped, 4, "SelectVOP3NoMods0">;
|
def VOP3NoMods0 : ComplexPattern<untyped, 4, "SelectVOP3NoMods0">;
|
||||||
def VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">;
|
def VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">;
|
||||||
|
@ -891,6 +897,12 @@ multiclass SMRD_Helper <bits<5> op, string opName, RegisterClass baseClass,
|
||||||
opName#" $dst, $sbase, $offset", []
|
opName#" $dst, $sbase, $offset", []
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
def _IMM_ci : SMRD <
|
||||||
|
(outs dstClass:$dst), (ins baseClass:$sbase, u32imm:$offset),
|
||||||
|
opName#" $dst, $sbase, $offset", []>, SMRD_IMMe_ci <op> {
|
||||||
|
let AssemblerPredicates = [isCI];
|
||||||
|
}
|
||||||
|
|
||||||
defm _SGPR : SMRD_m <
|
defm _SGPR : SMRD_m <
|
||||||
op, opName#"_SGPR", 0, (outs dstClass:$dst),
|
op, opName#"_SGPR", 0, (outs dstClass:$dst),
|
||||||
(ins baseClass:$sbase, SReg_32:$soff),
|
(ins baseClass:$sbase, SReg_32:$soff),
|
||||||
|
|
|
@ -2074,79 +2074,36 @@ def : Pat <
|
||||||
|
|
||||||
multiclass SMRD_Pattern <SMRD Instr_IMM, SMRD Instr_SGPR, ValueType vt> {
|
multiclass SMRD_Pattern <SMRD Instr_IMM, SMRD Instr_SGPR, ValueType vt> {
|
||||||
|
|
||||||
// 1. SI-CI: Offset as 8bit DWORD immediate
|
// 1. IMM offset
|
||||||
def : Pat <
|
def : Pat <
|
||||||
(constant_load (add i64:$sbase, (i64 IMM8bitDWORD:$offset))),
|
(constant_load (SMRDImm i64:$sbase, i32:$offset)),
|
||||||
(vt (Instr_IMM $sbase, (as_dword_i32imm $offset)))
|
(vt (Instr_IMM $sbase, $offset))
|
||||||
>;
|
>;
|
||||||
|
|
||||||
// 2. Offset loaded in an 32bit SGPR
|
// 2. SGPR offset
|
||||||
def : Pat <
|
def : Pat <
|
||||||
(constant_load (add i64:$sbase, (i64 IMM32bit:$offset))),
|
(constant_load (SMRDSgpr i64:$sbase, i32:$offset)),
|
||||||
(vt (Instr_SGPR $sbase, (S_MOV_B32 (i32 (as_i32imm $offset)))))
|
(vt (Instr_SGPR $sbase, $offset))
|
||||||
>;
|
|
||||||
|
|
||||||
// 3. No offset at all
|
|
||||||
def : Pat <
|
|
||||||
(constant_load i64:$sbase),
|
|
||||||
(vt (Instr_IMM $sbase, 0))
|
|
||||||
>;
|
>;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass SMRD_Pattern_vi <SMRD Instr_IMM, SMRD Instr_SGPR, ValueType vt> {
|
|
||||||
|
|
||||||
// 1. VI: Offset as 20bit immediate in bytes
|
|
||||||
def : Pat <
|
|
||||||
(constant_load (add i64:$sbase, (i64 IMM20bit:$offset))),
|
|
||||||
(vt (Instr_IMM $sbase, (as_i32imm $offset)))
|
|
||||||
>;
|
|
||||||
|
|
||||||
// 2. Offset loaded in an 32bit SGPR
|
|
||||||
def : Pat <
|
|
||||||
(constant_load (add i64:$sbase, (i64 IMM32bit:$offset))),
|
|
||||||
(vt (Instr_SGPR $sbase, (S_MOV_B32 (i32 (as_i32imm $offset)))))
|
|
||||||
>;
|
|
||||||
|
|
||||||
// 3. No offset at all
|
|
||||||
def : Pat <
|
|
||||||
(constant_load i64:$sbase),
|
|
||||||
(vt (Instr_IMM $sbase, 0))
|
|
||||||
>;
|
|
||||||
}
|
|
||||||
|
|
||||||
let Predicates = [isSICI] in {
|
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORD_IMM, S_LOAD_DWORD_SGPR, i32>;
|
defm : SMRD_Pattern <S_LOAD_DWORD_IMM, S_LOAD_DWORD_SGPR, i32>;
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORDX2_IMM, S_LOAD_DWORDX2_SGPR, v2i32>;
|
defm : SMRD_Pattern <S_LOAD_DWORDX2_IMM, S_LOAD_DWORDX2_SGPR, v2i32>;
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORDX4_IMM, S_LOAD_DWORDX4_SGPR, v4i32>;
|
defm : SMRD_Pattern <S_LOAD_DWORDX4_IMM, S_LOAD_DWORDX4_SGPR, v4i32>;
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v32i8>;
|
defm : SMRD_Pattern <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v32i8>;
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v8i32>;
|
defm : SMRD_Pattern <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v8i32>;
|
||||||
defm : SMRD_Pattern <S_LOAD_DWORDX16_IMM, S_LOAD_DWORDX16_SGPR, v16i32>;
|
defm : SMRD_Pattern <S_LOAD_DWORDX16_IMM, S_LOAD_DWORDX16_SGPR, v16i32>;
|
||||||
} // End Predicates = [isSICI]
|
|
||||||
|
|
||||||
let Predicates = [isVI] in {
|
// 1. Offset as an immediate
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORD_IMM, S_LOAD_DWORD_SGPR, f32>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORD_IMM, S_LOAD_DWORD_SGPR, i32>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORDX2_IMM, S_LOAD_DWORDX2_SGPR, v2i32>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORDX4_IMM, S_LOAD_DWORDX4_SGPR, v4i32>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v32i8>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v8i32>;
|
|
||||||
defm : SMRD_Pattern_vi <S_LOAD_DWORDX16_IMM, S_LOAD_DWORDX16_SGPR, v16i32>;
|
|
||||||
} // End Predicates = [isVI]
|
|
||||||
|
|
||||||
let Predicates = [isSICI] in {
|
|
||||||
|
|
||||||
// 1. Offset as 8bit DWORD immediate
|
|
||||||
def : Pat <
|
def : Pat <
|
||||||
(SIload_constant v4i32:$sbase, IMM8bitDWORD:$offset),
|
(SIload_constant v4i32:$sbase, (SMRDBufferImm i32:$offset)),
|
||||||
(S_BUFFER_LOAD_DWORD_IMM $sbase, (as_dword_i32imm $offset))
|
(S_BUFFER_LOAD_DWORD_IMM $sbase, $offset)
|
||||||
>;
|
>;
|
||||||
|
|
||||||
} // End Predicates = [isSICI]
|
|
||||||
|
|
||||||
// 2. Offset loaded in an 32bit SGPR
|
// 2. Offset loaded in an 32bit SGPR
|
||||||
def : Pat <
|
def : Pat <
|
||||||
(SIload_constant v4i32:$sbase, imm:$offset),
|
(SIload_constant v4i32:$sbase, (SMRDBufferSgpr i32:$offset)),
|
||||||
(S_BUFFER_LOAD_DWORD_SGPR $sbase, (S_MOV_B32 imm:$offset))
|
(S_BUFFER_LOAD_DWORD_SGPR $sbase, $offset)
|
||||||
>;
|
>;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -54,6 +54,33 @@ entry:
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; SMRD load with the largest possible immediate offset on VI
|
||||||
|
; GCN-LABEL: {{^}}smrd4:
|
||||||
|
; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0xffffc
|
||||||
|
; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xffffc
|
||||||
|
define void @smrd4(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||||
|
entry:
|
||||||
|
%0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 262143
|
||||||
|
%1 = load i32, i32 addrspace(2)* %0
|
||||||
|
store i32 %1, i32 addrspace(1)* %out
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SMRD load with an offset greater than the largest possible immediate on VI
|
||||||
|
; GCN-LABEL: {{^}}smrd5:
|
||||||
|
; GCN: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
|
||||||
|
; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; GCN: s_endpgm
|
||||||
|
define void @smrd5(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||||
|
entry:
|
||||||
|
%0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 262144
|
||||||
|
%1 = load i32, i32 addrspace(2)* %0
|
||||||
|
store i32 %1, i32 addrspace(1)* %out
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
; SMRD load using the load.const intrinsic with an immediate offset
|
; SMRD load using the load.const intrinsic with an immediate offset
|
||||||
; GCN-LABEL: {{^}}smrd_load_const0:
|
; GCN-LABEL: {{^}}smrd_load_const0:
|
||||||
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4 ; encoding: [0x04
|
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4 ; encoding: [0x04
|
||||||
|
@ -96,6 +123,35 @@ main_body:
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; SMRD load with the largest possible immediate offset on VI
|
||||||
|
; GCN-LABEL: {{^}}smrd_load_const3:
|
||||||
|
; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0xffffc
|
||||||
|
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xffffc
|
||||||
|
define void @smrd_load_const3(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
|
||||||
|
main_body:
|
||||||
|
%20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
|
||||||
|
%21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
|
||||||
|
%22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1048572)
|
||||||
|
call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SMRD load with an offset greater than the largest possible immediate on VI
|
||||||
|
; GCN-LABEL: {{^}}smrd_load_const4:
|
||||||
|
; GCN: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
|
||||||
|
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||||
|
; GCN: s_endpgm
|
||||||
|
define void @smrd_load_const4(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
|
||||||
|
main_body:
|
||||||
|
%20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
|
||||||
|
%21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
|
||||||
|
%22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1048576)
|
||||||
|
call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
; Function Attrs: nounwind readnone
|
; Function Attrs: nounwind readnone
|
||||||
declare float @llvm.SI.load.const(<16 x i8>, i32) #1
|
declare float @llvm.SI.load.const(<16 x i8>, i32) #1
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue