mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
AMDGPU: Split extload/zextload local load patterns
This will help removing the custom load predicates, allowing the global isel emitter to handle them. llvm-svn: 365398
This commit is contained in:
parent
dd9f8a5f1b
commit
ad59d40f4a
@ -446,9 +446,11 @@ def truncstorei8_hi16_global : StoreHi16 <truncstorei8>, GlobalAddress;
|
||||
def truncstorei16_hi16_global : StoreHi16 <truncstorei16>, GlobalAddress;
|
||||
|
||||
def load_local : LocalLoad <load>;
|
||||
def az_extloadi8_local : LocalLoad <az_extloadi8>;
|
||||
def extloadi8_local : LocalLoad <extloadi8>;
|
||||
def zextloadi8_local : LocalLoad <zextloadi8>;
|
||||
def sextloadi8_local : LocalLoad <sextloadi8>;
|
||||
def az_extloadi16_local : LocalLoad <az_extloadi16>;
|
||||
def extloadi16_local : LocalLoad <extloadi16>;
|
||||
def zextloadi16_local : LocalLoad <zextloadi16>;
|
||||
def sextloadi16_local : LocalLoad <sextloadi16>;
|
||||
def atomic_load_32_local : LocalLoad<atomic_load_32>;
|
||||
def atomic_load_64_local : LocalLoad<atomic_load_64>;
|
||||
|
@ -623,12 +623,15 @@ class DSReadPat_D16 <DS_Pseudo inst, PatFrag frag, ValueType vt> : GCNPat <
|
||||
>;
|
||||
|
||||
defm : DSReadPat_mc <DS_READ_I8, i32, "sextloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i32, "az_extloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_I8, i16, "sextloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i16, "az_extloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i32, "extloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i32, "zextloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i16, "extloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U8, i16, "zextloadi8_local">;
|
||||
defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
|
||||
defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U16, i32, "az_extloadi16_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U16, i32, "extloadi16_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U16, i32, "zextloadi16_local">;
|
||||
defm : DSReadPat_mc <DS_READ_U16, i16, "load_local">;
|
||||
defm : DSReadPat_mc <DS_READ_B32, i32, "load_local">;
|
||||
defm : DSReadPat_mc <DS_READ_B32, i32, "atomic_load_32_local">;
|
||||
|
@ -30,6 +30,10 @@ class EGOrCaymanPat<dag pattern, dag result> : AMDGPUPat<pattern, result> {
|
||||
let SubtargetPredicate = isEGorCayman;
|
||||
}
|
||||
|
||||
// FIXME: These are deprecated
|
||||
def az_extloadi8_local : LocalLoad <az_extloadi8>;
|
||||
def az_extloadi16_local : LocalLoad <az_extloadi16>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Evergreen / Cayman store instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -300,13 +300,13 @@ def AMDGPUatomic_ld_glue : SDNode <"ISD::ATOMIC_LOAD", SDTAtomicLoad,
|
||||
[SDNPHasChain, SDNPMayLoad, SDNPMemOperand, SDNPInGlue]
|
||||
>;
|
||||
|
||||
def unindexedload_glue : PatFrag <(ops node:$ptr), (AMDGPUld_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
|
||||
}]>;
|
||||
def unindexedload_glue : PatFrag <(ops node:$ptr), (AMDGPUld_glue node:$ptr)> {
|
||||
let IsUnindexed = 1;
|
||||
}
|
||||
|
||||
def load_glue : PatFrag <(ops node:$ptr), (unindexedload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;
|
||||
}]>;
|
||||
def load_glue : PatFrag <(ops node:$ptr), (unindexedload_glue node:$ptr)> {
|
||||
let IsNonExtLoad = 1;
|
||||
}
|
||||
|
||||
def atomic_load_32_glue : PatFrag<(ops node:$ptr),
|
||||
(AMDGPUatomic_ld_glue node:$ptr)> {
|
||||
@ -320,35 +320,49 @@ def atomic_load_64_glue : PatFrag<(ops node:$ptr),
|
||||
let MemoryVT = i64;
|
||||
}
|
||||
|
||||
def extload_glue : PatFrag<(ops node:$ptr), (load_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD;
|
||||
}]>;
|
||||
def extload_glue : PatFrag<(ops node:$ptr), (load_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let IsAnyExtLoad = 1;
|
||||
}
|
||||
|
||||
def sextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD;
|
||||
}]>;
|
||||
|
||||
def zextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD;
|
||||
}]>;
|
||||
def zextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let IsZeroExtLoad = 1;
|
||||
}
|
||||
|
||||
def az_extload_glue : AZExtLoadBase <unindexedload_glue>;
|
||||
def extloadi8_glue : PatFrag<(ops node:$ptr), (extload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i8;
|
||||
}
|
||||
|
||||
def az_extloadi8_glue : PatFrag<(ops node:$ptr), (az_extload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
|
||||
}]>;
|
||||
def zextloadi8_glue : PatFrag<(ops node:$ptr), (zextload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i8;
|
||||
}
|
||||
|
||||
def az_extloadi16_glue : PatFrag<(ops node:$ptr), (az_extload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
|
||||
}]>;
|
||||
def extloadi16_glue : PatFrag<(ops node:$ptr), (extload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i16;
|
||||
}
|
||||
|
||||
def sextloadi8_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
|
||||
}]>;
|
||||
def zextloadi16_glue : PatFrag<(ops node:$ptr), (zextload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i16;
|
||||
}
|
||||
|
||||
def sextloadi16_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
|
||||
}]>;
|
||||
def sextloadi8_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i8;
|
||||
}
|
||||
|
||||
def sextloadi16_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr)> {
|
||||
let IsLoad = 1;
|
||||
let MemoryVT = i16;
|
||||
}
|
||||
|
||||
def load_glue_align8 : Aligned8Bytes <
|
||||
(ops node:$ptr), (load_glue node:$ptr)
|
||||
@ -361,8 +375,10 @@ def load_glue_align16 : Aligned16Bytes <
|
||||
def load_local_m0 : LoadFrag<load_glue>, LocalAddress;
|
||||
def sextloadi8_local_m0 : LoadFrag<sextloadi8_glue>, LocalAddress;
|
||||
def sextloadi16_local_m0 : LoadFrag<sextloadi16_glue>, LocalAddress;
|
||||
def az_extloadi8_local_m0 : LoadFrag<az_extloadi8_glue>, LocalAddress;
|
||||
def az_extloadi16_local_m0 : LoadFrag<az_extloadi16_glue>, LocalAddress;
|
||||
def extloadi8_local_m0 : LoadFrag<extloadi8_glue>, LocalAddress;
|
||||
def zextloadi8_local_m0 : LoadFrag<zextloadi8_glue>, LocalAddress;
|
||||
def extloadi16_local_m0 : LoadFrag<extloadi16_glue>, LocalAddress;
|
||||
def zextloadi16_local_m0 : LoadFrag<zextloadi16_glue>, LocalAddress;
|
||||
def load_align8_local_m0 : LoadFrag <load_glue_align8>, LocalAddress;
|
||||
def load_align16_local_m0 : LoadFrag <load_glue_align16>, LocalAddress;
|
||||
def atomic_load_32_local_m0 : LoadFrag<atomic_load_32_glue>, LocalAddress;
|
||||
|
Loading…
x
Reference in New Issue
Block a user