mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
R600/SI: Add support for 64-bit loads
https://bugs.freedesktop.org/show_bug.cgi?id=65873 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186339 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d1654a769c
commit
cd0f245864
@ -86,6 +86,12 @@ def COND_NULL : PatLeaf <
|
||||
// Load/Store Pattern Fragments
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def az_extload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{
|
||||
LoadSDNode *L = cast<LoadSDNode>(N);
|
||||
return L->getExtensionType() == ISD::ZEXTLOAD ||
|
||||
L->getExtensionType() == ISD::EXTLOAD;
|
||||
}]>;
|
||||
|
||||
def zextloadi8_global : PatFrag<(ops node:$ptr), (zextloadi8 node:$ptr), [{
|
||||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
@ -94,6 +100,20 @@ def zextloadi8_constant : PatFrag<(ops node:$ptr), (zextloadi8 node:$ptr), [{
|
||||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi32 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
|
||||
}]>;
|
||||
|
||||
def az_extloadi32_global : PatFrag<(ops node:$ptr),
|
||||
(az_extloadi32 node:$ptr), [{
|
||||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi32_constant : PatFrag<(ops node:$ptr),
|
||||
(az_extloadi32 node:$ptr), [{
|
||||
return isConstantLoad(dyn_cast<LoadSDNode>(N), -1);
|
||||
}]>;
|
||||
|
||||
def local_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isLocalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
@ -76,6 +76,8 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) :
|
||||
|
||||
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
|
||||
|
||||
setLoadExtAction(ISD::SEXTLOAD, MVT::i32, Expand);
|
||||
|
||||
setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
|
||||
|
||||
setTargetDAGCombine(ISD::SELECT_CC);
|
||||
|
@ -1024,7 +1024,9 @@ def V_LSHL_B64 : VOP3_64_Shift <0x00000161, "V_LSHL_B64",
|
||||
def V_LSHR_B64 : VOP3_64_Shift <0x00000162, "V_LSHR_B64",
|
||||
[(set i64:$dst, (srl i64:$src0, i32:$src1))]
|
||||
>;
|
||||
def V_ASHR_I64 : VOP3_64_Shift <0x00000163, "V_ASHR_I64", []>;
|
||||
def V_ASHR_I64 : VOP3_64_Shift <0x00000163, "V_ASHR_I64",
|
||||
[(set i64:$dst, (sra i64:$src0, i32:$src1))]
|
||||
>;
|
||||
|
||||
let isCommutable = 1 in {
|
||||
|
||||
@ -1738,6 +1740,10 @@ defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORD_ADDR64, i32,
|
||||
global_load, constant_load>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_ADDR64, i32,
|
||||
zextloadi8_global, zextloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, i64,
|
||||
global_load, constant_load>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, i64,
|
||||
az_extloadi32_global, az_extloadi32_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, v2i32,
|
||||
global_load, constant_load>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_DWORDX4_ADDR64, v4i32,
|
||||
|
@ -65,3 +65,45 @@ define void @load_const_addrspace_f32(float addrspace(1)* %out, float addrspace(
|
||||
store float %1, float addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; R600-CHECK: @load_i64
|
||||
; R600-CHECK: RAT
|
||||
; R600-CHECK: RAT
|
||||
|
||||
; SI-CHECK: @load_i64
|
||||
; SI-CHECK: BUFFER_LOAD_DWORDX2
|
||||
define void @load_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
|
||||
entry:
|
||||
%0 = load i64 addrspace(1)* %in
|
||||
store i64 %0, i64 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; R600-CHECK: @load_i64_sext
|
||||
; R600-CHECK: RAT
|
||||
; R600-CHECK: RAT
|
||||
; R600-CHECK: ASHR {{[* ]*}}T{{[0-9]\.[XYZW]}}, T{{[0-9]\.[XYZW]}}, literal.x
|
||||
; R600-CHECK: 31
|
||||
; SI-CHECK: @load_i64_sext
|
||||
; SI-CHECK: BUFFER_LOAD_DWORDX2 [[VAL:VGPR[0-9]_VGPR[0-9]]]
|
||||
; SI-CHECK: V_LSHL_B64 [[LSHL:VGPR[0-9]_VGPR[0-9]]], [[VAL]], 32
|
||||
; SI-CHECK: V_ASHR_I64 VGPR{{[0-9]}}_VGPR{{[0-9]}}, [[LSHL]], 32
|
||||
|
||||
define void @load_i64_sext(i64 addrspace(1)* %out, i32 addrspace(1)* %in) {
|
||||
entry:
|
||||
%0 = load i32 addrspace(1)* %in
|
||||
%1 = sext i32 %0 to i64
|
||||
store i64 %1, i64 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; R600-CHECK: @load_i64_zext
|
||||
; R600-CHECK: RAT
|
||||
; R600-CHECK: RAT
|
||||
define void @load_i64_zext(i64 addrspace(1)* %out, i32 addrspace(1)* %in) {
|
||||
entry:
|
||||
%0 = load i32 addrspace(1)* %in
|
||||
%1 = zext i32 %0 to i64
|
||||
store i64 %1, i64 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
@ -38,3 +38,17 @@ define void @ashr_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %i
|
||||
store <4 x i32> %result, <4 x i32> addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
;EG-CHECK: @ashr_i64
|
||||
;EG-CHECK: ASHR
|
||||
|
||||
;SI-CHECK: @ashr_i64
|
||||
;SI-CHECK: V_ASHR_I64
|
||||
define void @ashr_i64(i64 addrspace(1)* %out, i32 %in) {
|
||||
entry:
|
||||
%0 = sext i32 %in to i64
|
||||
%1 = ashr i64 %0, 8
|
||||
store i64 %1, i64 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user