mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-13 17:00:01 +00:00
AMDGPU/SI: Add support for 32-bit immediate SMRD offsets on CI
Reviewers: arsenm Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D11604 llvm-svn: 244254
This commit is contained in:
parent
5d9e608825
commit
544c5ba738
@ -113,8 +113,10 @@ private:
|
||||
bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset,
|
||||
bool &Imm) const;
|
||||
bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
|
||||
bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
|
||||
bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
|
||||
bool SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const;
|
||||
bool SelectSMRDBufferImm32(SDValue Addr, SDValue &Offset) const;
|
||||
bool SelectSMRDBufferSgpr(SDValue Addr, SDValue &Offset) const;
|
||||
SDNode *SelectAddrSpaceCast(SDNode *N);
|
||||
bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
|
||||
@ -1191,14 +1193,19 @@ bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode,
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isUInt<32>(ByteOffset)) {
|
||||
if (!isUInt<32>(EncodedOffset) || !isUInt<32>(ByteOffset))
|
||||
return false;
|
||||
|
||||
if (Gen == AMDGPUSubtarget::SEA_ISLANDS && isUInt<32>(EncodedOffset)) {
|
||||
// 32-bit Immediates are supported on Sea Islands.
|
||||
Offset = CurDAG->getTargetConstant(EncodedOffset, SL, MVT::i32);
|
||||
} else {
|
||||
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;
|
||||
Imm = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase,
|
||||
@ -1226,10 +1233,24 @@ bool AMDGPUDAGToDAGISel::SelectSMRDImm(SDValue Addr, SDValue &SBase,
|
||||
return SelectSMRD(Addr, SBase, Offset, Imm) && Imm;
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRDImm32(SDValue Addr, SDValue &SBase,
|
||||
SDValue &Offset) const {
|
||||
|
||||
if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS)
|
||||
return false;
|
||||
|
||||
bool Imm;
|
||||
if (!SelectSMRD(Addr, SBase, Offset, Imm))
|
||||
return false;
|
||||
|
||||
return !Imm && isa<ConstantSDNode>(Offset);
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase,
|
||||
SDValue &Offset) const {
|
||||
bool Imm;
|
||||
return SelectSMRD(Addr, SBase, Offset, Imm) && !Imm;
|
||||
return SelectSMRD(Addr, SBase, Offset, Imm) && !Imm &&
|
||||
!isa<ConstantSDNode>(Offset);
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr,
|
||||
@ -1238,10 +1259,23 @@ bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr,
|
||||
return SelectSMRDOffset(Addr, Offset, Imm) && Imm;
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm32(SDValue Addr,
|
||||
SDValue &Offset) const {
|
||||
if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS)
|
||||
return false;
|
||||
|
||||
bool Imm;
|
||||
if (!SelectSMRDOffset(Addr, Offset, Imm))
|
||||
return false;
|
||||
|
||||
return !Imm && isa<ConstantSDNode>(Offset);
|
||||
}
|
||||
|
||||
bool AMDGPUDAGToDAGISel::SelectSMRDBufferSgpr(SDValue Addr,
|
||||
SDValue &Offset) const {
|
||||
bool Imm;
|
||||
return SelectSMRDOffset(Addr, Offset, Imm) && !Imm;
|
||||
return SelectSMRDOffset(Addr, Offset, Imm) && !Imm &&
|
||||
!isa<ConstantSDNode>(Offset);
|
||||
}
|
||||
|
||||
// FIXME: This is incorrect and only enough to be able to compile.
|
||||
|
@ -301,6 +301,8 @@ public:
|
||||
bool isDSOffset01() const;
|
||||
bool isSWaitCnt() const;
|
||||
bool isMubufOffset() const;
|
||||
bool isSMRDOffset() const;
|
||||
bool isSMRDLiteralOffset() const;
|
||||
};
|
||||
|
||||
class AMDGPUAsmParser : public MCTargetAsmParser {
|
||||
@ -1570,6 +1572,23 @@ AMDGPUAsmParser::parseR128(OperandVector &Operands) {
|
||||
return parseNamedBit("r128", Operands);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// smrd
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool AMDGPUOperand::isSMRDOffset() const {
|
||||
|
||||
// FIXME: Support 20-bit offsets on VI. We need to to pass subtarget
|
||||
// information here.
|
||||
return isImm() && isUInt<8>(getImm());
|
||||
}
|
||||
|
||||
bool AMDGPUOperand::isSMRDLiteralOffset() const {
|
||||
// 32-bit literals are only supported on CI and we only want to use them
|
||||
// when the offset is > 8-bits.
|
||||
return isImm() && !isUInt<8>(getImm()) && isUInt<32>(getImm());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// vop3
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -231,7 +231,8 @@ class SMRD_IMMe_ci <bits<5> op> : Enc64 {
|
||||
let Inst{8} = 0;
|
||||
let Inst{14-9} = sbase{6-1};
|
||||
let Inst{21-15} = sdst;
|
||||
let Inst{26-22} = 0x18; //encoding
|
||||
let Inst{26-22} = op;
|
||||
let Inst{31-27} = 0x18; //encoding
|
||||
let Inst{63-32} = offset;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,9 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
def isCI : Predicate<"Subtarget->getGeneration() "
|
||||
">= AMDGPUSubtarget::SEA_ISLANDS">;
|
||||
def isCIOnly : Predicate<"Subtarget->getGeneration() =="
|
||||
"AMDGPUSubtarget::SEA_ISLANDS">,
|
||||
AssemblerPredicate <"FeatureSeaIslands">;
|
||||
def isVI : Predicate <
|
||||
"Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS">,
|
||||
AssemblerPredicate<"FeatureGCN3Encoding">;
|
||||
@ -436,6 +439,17 @@ def ClampMatchClass : AsmOperandClass {
|
||||
let RenderMethod = "addImmOperands";
|
||||
}
|
||||
|
||||
class SMRDOffsetBaseMatchClass <string predicate> : AsmOperandClass {
|
||||
let Name = "SMRDOffset"#predicate;
|
||||
let PredicateMethod = predicate;
|
||||
let RenderMethod = "addImmOperands";
|
||||
}
|
||||
|
||||
def SMRDOffsetMatchClass : SMRDOffsetBaseMatchClass <"isSMRDOffset">;
|
||||
def SMRDLiteralOffsetMatchClass : SMRDOffsetBaseMatchClass <
|
||||
"isSMRDLiteralOffset"
|
||||
>;
|
||||
|
||||
let OperandType = "OPERAND_IMMEDIATE" in {
|
||||
|
||||
def offen : Operand<i1> {
|
||||
@ -510,6 +524,16 @@ def ClampMod : Operand <i1> {
|
||||
let ParserMatchClass = ClampMatchClass;
|
||||
}
|
||||
|
||||
def smrd_offset : Operand <i32> {
|
||||
let PrintMethod = "printU32ImmOperand";
|
||||
let ParserMatchClass = SMRDOffsetMatchClass;
|
||||
}
|
||||
|
||||
def smrd_literal_offset : Operand <i32> {
|
||||
let PrintMethod = "printU32ImmOperand";
|
||||
let ParserMatchClass = SMRDLiteralOffsetMatchClass;
|
||||
}
|
||||
|
||||
} // End OperandType = "OPERAND_IMMEDIATE"
|
||||
|
||||
def VOPDstS64 : VOPDstOperand <SReg_64>;
|
||||
@ -529,11 +553,12 @@ def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">;
|
||||
def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
|
||||
|
||||
def SMRDImm : ComplexPattern<i64, 2, "SelectSMRDImm">;
|
||||
def SMRDImm32 : ComplexPattern<i64, 2, "SelectSMRDImm32">;
|
||||
def SMRDSgpr : ComplexPattern<i64, 2, "SelectSMRDSgpr">;
|
||||
def SMRDBufferImm : ComplexPattern<i32, 1, "SelectSMRDBufferImm">;
|
||||
def SMRDBufferImm32 : ComplexPattern<i32, 1, "SelectSMRDBufferImm32">;
|
||||
def SMRDBufferSgpr : ComplexPattern<i32, 1, "SelectSMRDBufferSgpr">;
|
||||
|
||||
|
||||
def VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">;
|
||||
def VOP3NoMods0 : ComplexPattern<untyped, 4, "SelectVOP3NoMods0">;
|
||||
def VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">;
|
||||
@ -893,14 +918,14 @@ multiclass SMRD_Helper <bits<5> op, string opName, RegisterClass baseClass,
|
||||
RegisterClass dstClass> {
|
||||
defm _IMM : SMRD_m <
|
||||
op, opName#"_IMM", 1, (outs dstClass:$dst),
|
||||
(ins baseClass:$sbase, u32imm:$offset),
|
||||
(ins baseClass:$sbase, smrd_offset:$offset),
|
||||
opName#" $dst, $sbase, $offset", []
|
||||
>;
|
||||
|
||||
def _IMM_ci : SMRD <
|
||||
(outs dstClass:$dst), (ins baseClass:$sbase, u32imm:$offset),
|
||||
(outs dstClass:$dst), (ins baseClass:$sbase, smrd_literal_offset:$offset),
|
||||
opName#" $dst, $sbase, $offset", []>, SMRD_IMMe_ci <op> {
|
||||
let AssemblerPredicates = [isCI];
|
||||
let AssemblerPredicates = [isCIOnly];
|
||||
}
|
||||
|
||||
defm _SGPR : SMRD_m <
|
||||
|
@ -2072,27 +2072,34 @@ def : Pat <
|
||||
// SMRD Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass SMRD_Pattern <SMRD Instr_IMM, SMRD Instr_SGPR, ValueType vt> {
|
||||
multiclass SMRD_Pattern <string Instr, ValueType vt> {
|
||||
|
||||
// 1. IMM offset
|
||||
def : Pat <
|
||||
(constant_load (SMRDImm i64:$sbase, i32:$offset)),
|
||||
(vt (Instr_IMM $sbase, $offset))
|
||||
(vt (!cast<SMRD>(Instr#"_IMM") $sbase, $offset))
|
||||
>;
|
||||
|
||||
// 2. SGPR offset
|
||||
def : Pat <
|
||||
(constant_load (SMRDSgpr i64:$sbase, i32:$offset)),
|
||||
(vt (Instr_SGPR $sbase, $offset))
|
||||
(vt (!cast<SMRD>(Instr#"_SGPR") $sbase, $offset))
|
||||
>;
|
||||
|
||||
def : Pat <
|
||||
(constant_load (SMRDImm32 i64:$sbase, i32:$offset)),
|
||||
(vt (!cast<SMRD>(Instr#"_IMM_ci") $sbase, $offset))
|
||||
> {
|
||||
let Predicates = [isCIOnly];
|
||||
}
|
||||
}
|
||||
|
||||
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_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, v8i32>;
|
||||
defm : SMRD_Pattern <S_LOAD_DWORDX16_IMM, S_LOAD_DWORDX16_SGPR, v16i32>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORD", i32>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORDX2", v2i32>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORDX4", v4i32>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORDX8", v32i8>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORDX8", v8i32>;
|
||||
defm : SMRD_Pattern <"S_LOAD_DWORDX16", v16i32>;
|
||||
|
||||
// 1. Offset as an immediate
|
||||
def : Pat <
|
||||
@ -2106,6 +2113,15 @@ def : Pat <
|
||||
(S_BUFFER_LOAD_DWORD_SGPR $sbase, $offset)
|
||||
>;
|
||||
|
||||
let Predicates = [isCI] in {
|
||||
|
||||
def : Pat <
|
||||
(SIload_constant v4i32:$sbase, (SMRDBufferImm32 i32:$offset)),
|
||||
(S_BUFFER_LOAD_DWORD_IMM_ci $sbase, $offset)
|
||||
>;
|
||||
|
||||
} // End Predicates = [isCI]
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// SOP1 Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,9 +1,10 @@
|
||||
; RUN: llc < %s -march=amdgcn -mcpu=SI -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=SI --check-prefix=GCN %s
|
||||
; RUN: llc < %s -march=amdgcn -mcpu=tonga -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=VI --check-prefix=GCN %s
|
||||
; RUN: llc < %s -march=amdgcn -mcpu=SI -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=SI --check-prefix=GCN --check-prefix=SIVI %s
|
||||
; RUN: llc < %s -march=amdgcn -mcpu=bonaire -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=CI --check-prefix=GCN %s
|
||||
; RUN: llc < %s -march=amdgcn -mcpu=tonga -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=VI --check-prefix=GCN --check-prefix=SIVI %s
|
||||
|
||||
; SMRD load with an immediate offset.
|
||||
; GCN-LABEL: {{^}}smrd0:
|
||||
; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x1 ; encoding: [0x01
|
||||
; SICI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x1 ; encoding: [0x01
|
||||
; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4
|
||||
define void @smrd0(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||
entry:
|
||||
@ -15,7 +16,7 @@ entry:
|
||||
|
||||
; SMRD load with the largest possible immediate offset.
|
||||
; GCN-LABEL: {{^}}smrd1:
|
||||
; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff
|
||||
; SICI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff,0x{{[0-9]+[137]}}
|
||||
; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3fc
|
||||
define void @smrd1(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||
entry:
|
||||
@ -29,6 +30,7 @@ entry:
|
||||
; GCN-LABEL: {{^}}smrd2:
|
||||
; SI: s_movk_i32 s[[OFFSET:[0-9]]], 0x400
|
||||
; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], s[[OFFSET]] ; encoding: [0x0[[OFFSET]]
|
||||
; CI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x100
|
||||
; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x400
|
||||
; GCN: s_endpgm
|
||||
define void @smrd2(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||
@ -58,6 +60,7 @@ entry:
|
||||
; 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]]
|
||||
; CI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3ffff
|
||||
; 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:
|
||||
@ -69,9 +72,9 @@ entry:
|
||||
|
||||
; 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]]
|
||||
; SIVI: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
|
||||
; SIVI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||
; CI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x40000
|
||||
; GCN: s_endpgm
|
||||
define void @smrd5(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
|
||||
entry:
|
||||
@ -83,7 +86,7 @@ entry:
|
||||
|
||||
; SMRD load using the load.const intrinsic with an immediate offset
|
||||
; GCN-LABEL: {{^}}smrd_load_const0:
|
||||
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4 ; encoding: [0x04
|
||||
; SICI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4 ; encoding: [0x04
|
||||
; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x10
|
||||
define void @smrd_load_const0(<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:
|
||||
@ -97,7 +100,7 @@ main_body:
|
||||
; SMRD load using the load.const intrinsic with the largest possible immediate
|
||||
; offset.
|
||||
; GCN-LABEL: {{^}}smrd_load_const1:
|
||||
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff
|
||||
; SICI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff
|
||||
; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3fc
|
||||
define void @smrd_load_const1(<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:
|
||||
@ -113,6 +116,7 @@ main_body:
|
||||
; GCN-LABEL: {{^}}smrd_load_const2:
|
||||
; SI: s_movk_i32 s[[OFFSET:[0-9]]], 0x400
|
||||
; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], s[[OFFSET]] ; encoding: [0x0[[OFFSET]]
|
||||
; CI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x100
|
||||
; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x400
|
||||
define void @smrd_load_const2(<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:
|
||||
@ -127,6 +131,7 @@ main_body:
|
||||
; 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]]
|
||||
; CI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3ffff
|
||||
; 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:
|
||||
@ -139,9 +144,9 @@ main_body:
|
||||
|
||||
; 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]]
|
||||
; SIVI: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
|
||||
; SIVI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
|
||||
; CI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x40000
|
||||
; 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:
|
||||
|
@ -1,32 +1,53 @@
|
||||
// RUN: llvm-mc -arch=amdgcn -show-encoding %s | FileCheck %s
|
||||
// RUN: llvm-mc -arch=amdgcn -mcpu=SI -show-encoding %s | FileCheck %s
|
||||
// RUN: not llvm-mc -arch=amdgcn -show-encoding %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
// RUN: not llvm-mc -arch=amdgcn -mcpu=SI -show-encoding %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
// RUN: llvm-mc -arch=amdgcn -mcpu=bonaire -show-encoding %s | FileCheck --check-prefix=GCN --check-prefix=CI %s
|
||||
|
||||
// RUN: not llvm-mc -arch=amdgcn %s 2>&1 | FileCheck %s --check-prefix=NOSI
|
||||
// RUN: not llvm-mc -arch=amdgcn -mcpu=SI %s 2>&1 | FileCheck %s --check-prefix=NOSI
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Offset Handling
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
s_load_dword s1, s[2:3], 0xfc
|
||||
// GCN: s_load_dword s1, s[2:3], 0xfc ; encoding: [0xfc,0x83,0x00,0xc0]
|
||||
|
||||
s_load_dword s1, s[2:3], 0xff
|
||||
// GCN: s_load_dword s1, s[2:3], 0xff ; encoding: [0xff,0x83,0x00,0xc0]
|
||||
|
||||
s_load_dword s1, s[2:3], 0x100
|
||||
// NOSI: error: instruction not supported on this GPU
|
||||
// CI: s_load_dword s1, s[2:3], 0x100 ; encoding: [0xff,0x82,0x00,0xc0,0x00,0x01,0x00,0x00]
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
s_load_dword s1, s[2:3], 1
|
||||
// CHECK: s_load_dword s1, s[2:3], 0x1 ; encoding: [0x01,0x83,0x00,0xc0]
|
||||
// GCN: s_load_dword s1, s[2:3], 0x1 ; encoding: [0x01,0x83,0x00,0xc0]
|
||||
|
||||
s_load_dword s1, s[2:3], s4
|
||||
// CHECK: s_load_dword s1, s[2:3], s4 ; encoding: [0x04,0x82,0x00,0xc0]
|
||||
// GCN: s_load_dword s1, s[2:3], s4 ; encoding: [0x04,0x82,0x00,0xc0]
|
||||
|
||||
s_load_dwordx2 s[2:3], s[2:3], 1
|
||||
// CHECK: s_load_dwordx2 s[2:3], s[2:3], 0x1 ; encoding: [0x01,0x03,0x41,0xc0]
|
||||
// GCN: s_load_dwordx2 s[2:3], s[2:3], 0x1 ; encoding: [0x01,0x03,0x41,0xc0]
|
||||
|
||||
s_load_dwordx2 s[2:3], s[2:3], s4
|
||||
// CHECK: s_load_dwordx2 s[2:3], s[2:3], s4 ; encoding: [0x04,0x02,0x41,0xc0]
|
||||
// GCN: s_load_dwordx2 s[2:3], s[2:3], s4 ; encoding: [0x04,0x02,0x41,0xc0]
|
||||
|
||||
s_load_dwordx4 s[4:7], s[2:3], 1
|
||||
// CHECK: s_load_dwordx4 s[4:7], s[2:3], 0x1 ; encoding: [0x01,0x03,0x82,0xc0]
|
||||
// GCN: s_load_dwordx4 s[4:7], s[2:3], 0x1 ; encoding: [0x01,0x03,0x82,0xc0]
|
||||
|
||||
s_load_dwordx4 s[4:7], s[2:3], s4
|
||||
// CHECK: s_load_dwordx4 s[4:7], s[2:3], s4 ; encoding: [0x04,0x02,0x82,0xc0]
|
||||
// GCN: s_load_dwordx4 s[4:7], s[2:3], s4 ; encoding: [0x04,0x02,0x82,0xc0]
|
||||
|
||||
s_load_dwordx8 s[8:15], s[2:3], 1
|
||||
// CHECK: s_load_dwordx8 s[8:15], s[2:3], 0x1 ; encoding: [0x01,0x03,0xc4,0xc0]
|
||||
// GCN: s_load_dwordx8 s[8:15], s[2:3], 0x1 ; encoding: [0x01,0x03,0xc4,0xc0]
|
||||
|
||||
s_load_dwordx8 s[8:15], s[2:3], s4
|
||||
// CHECK: s_load_dwordx8 s[8:15], s[2:3], s4 ; encoding: [0x04,0x02,0xc4,0xc0]
|
||||
// GCN: s_load_dwordx8 s[8:15], s[2:3], s4 ; encoding: [0x04,0x02,0xc4,0xc0]
|
||||
|
||||
s_load_dwordx16 s[16:31], s[2:3], 1
|
||||
// CHECK: s_load_dwordx16 s[16:31], s[2:3], 0x1 ; encoding: [0x01,0x03,0x08,0xc1]
|
||||
// GCN: s_load_dwordx16 s[16:31], s[2:3], 0x1 ; encoding: [0x01,0x03,0x08,0xc1]
|
||||
|
||||
s_load_dwordx16 s[16:31], s[2:3], s4
|
||||
// CHECK: s_load_dwordx16 s[16:31], s[2:3], s4 ; encoding: [0x04,0x02,0x08,0xc1]
|
||||
// GCN: s_load_dwordx16 s[16:31], s[2:3], s4 ; encoding: [0x04,0x02,0x08,0xc1]
|
||||
|
Loading…
x
Reference in New Issue
Block a user