[llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp AlphaISelLowering.cpp AlphaISelLowering.h AlphaISelPattern.cpp AlphaInstrInfo.td
Andrew Lenharth
alenhar2 at cs.uiuc.edu
Fri Dec 23 21:36:48 PST 2005
Changes in directory llvm/lib/Target/Alpha:
AlphaISelDAGToDAG.cpp updated: 1.19 -> 1.20
AlphaISelLowering.cpp updated: 1.13 -> 1.14
AlphaISelLowering.h updated: 1.5 -> 1.6
AlphaISelPattern.cpp updated: 1.194 -> 1.195
AlphaInstrInfo.td updated: 1.85 -> 1.86
---
Log message:
Let's see if we can break things.
Lower GOT relative addresses to Lo and HI.
Update both ISels to select them when they can.
Saves instructions here and there.
---
Diffs of the changes: (+172 -51)
AlphaISelDAGToDAG.cpp | 7 ++-
AlphaISelLowering.cpp | 27 ++++++++++++++
AlphaISelLowering.h | 12 ++++++
AlphaISelPattern.cpp | 96 +++++++++++++++++++++++++++++++-------------------
AlphaInstrInfo.td | 81 +++++++++++++++++++++++++++++++++++-------
5 files changed, 172 insertions(+), 51 deletions(-)
Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.19 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.20
--- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.19 Fri Dec 23 21:41:56 2005
+++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Fri Dec 23 23:36:33 2005
@@ -203,13 +203,16 @@
CurDAG->getTargetFrameIndex(FI, MVT::i32),
getI64Imm(0));
}
- case ISD::ConstantPool: {
+ case AlphaISD::GlobalBaseReg:
+ return getGlobalBaseReg();
+
+ case ISD::TargetConstantPool: {
Constant *C = cast<ConstantPoolSDNode>(N)->get();
SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(C, MVT::i64);
Tmp = CurDAG->getTargetNode(Alpha::LDAHr, MVT::i64, CPI, getGlobalBaseReg());
return CurDAG->SelectNodeTo(N, Alpha::LDAr, MVT::i64, CPI, Tmp);
}
- case ISD::GlobalAddress: {
+ case ISD::TargetGlobalAddress: {
GlobalValue *GV = cast<GlobalAddressSDNode>(N)->getGlobal();
SDOperand GA = CurDAG->getTargetGlobalAddress(GV, MVT::i64);
return CurDAG->SelectNodeTo(N, Alpha::LDQl, MVT::i64, GA,
Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.13 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.14
--- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.13 Wed Dec 21 14:51:36 2005
+++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Fri Dec 23 23:36:33 2005
@@ -104,6 +104,11 @@
setOperationAction(ISD::LOCATION, MVT::Other, Expand);
setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
+ // We want to legalize GlobalAddress and ConstantPool nodes into the
+ // appropriate instructions to materialize the address.
+ setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
+ setOperationAction(ISD::ConstantPool, MVT::i64, Custom);
+
addLegalFPImmediate(+0.0); //F31
addLegalFPImmediate(-0.0); //-F31
@@ -434,6 +439,28 @@
return DAG.getLoad(MVT::i64, ST, FI, DAG.getSrcValue(0));
}
}
+ case ISD::ConstantPool: {
+ Constant *C = cast<ConstantPoolSDNode>(Op)->get();
+ SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i64);
+
+ SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi, MVT::i64, CPI,
+ DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+ SDOperand Lo = DAG.getNode(AlphaISD::GPRelLo, MVT::i64, CPI, Hi);
+ return Lo;
+ }
+ case ISD::GlobalAddress: {
+ GlobalAddressSDNode *GSDN = cast<GlobalAddressSDNode>(Op);
+ GlobalValue *GV = GSDN->getGlobal();
+ SDOperand GA = DAG.getTargetGlobalAddress(GV, MVT::i64, GSDN->getOffset());
+
+ if (!GV->hasWeakLinkage() && !GV->isExternal()) {
+ SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi, MVT::i64, GA,
+ DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+ SDOperand Lo = DAG.getNode(AlphaISD::GPRelLo, MVT::i64, GA, Hi);
+ return Lo;
+ } else
+ return GA;
+ }
}
Index: llvm/lib/Target/Alpha/AlphaISelLowering.h
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.5 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.6
--- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.5 Wed Nov 30 10:10:29 2005
+++ llvm/lib/Target/Alpha/AlphaISelLowering.h Fri Dec 23 23:36:33 2005
@@ -27,6 +27,18 @@
FIRST_NUMBER = ISD::BUILTIN_OP_END+Alpha::INSTRUCTION_LIST_END,
//These corrospond to the identical Instruction
ITOFT_, FTOIT_, CVTQT_, CVTQS_, CVTTQ_,
+
+ /// GPRelHi/GPRelLo - These represent the high and low 16-bit
+ /// parts of a global address respectively. These nodes have
+ /// two operands, the first of which must be a
+ /// TargetGlobalAddress, and the second of which must be a
+ /// Constant. Selected naively, these turn into 'ldah R(G)' and
+ /// 'lda R(C)', though these are usually folded into other nodes.
+ GPRelHi, GPRelLo,
+
+ /// GlobalBaseReg, used to restore the GOT ptr
+ GlobalBaseReg,
+
};
}
Index: llvm/lib/Target/Alpha/AlphaISelPattern.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.194 llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.195
--- llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.194 Thu Dec 22 15:15:41 2005
+++ llvm/lib/Target/Alpha/AlphaISelPattern.cpp Fri Dec 23 23:36:33 2005
@@ -676,31 +676,26 @@
getValueInfo(dyn_cast<SrcValueSDNode>(N.getOperand(2))->getValue(),
i, j, k);
- GlobalAddressSDNode *GASD = dyn_cast<GlobalAddressSDNode>(Address);
- if (GASD && !GASD->getGlobal()->isExternal()) {
- Tmp1 = MakeReg(MVT::i64);
- AlphaLowering.restoreGP(BB);
- BuildMI(BB, Alpha::LDAHr, 2, Tmp1)
- .addGlobalAddress(GASD->getGlobal()).addReg(Alpha::R29);
- if (EnableAlphaLSMark)
- BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
- .addImm(getUID());
- BuildMI(BB, GetRelVersion(Opc), 2, Result)
- .addGlobalAddress(GASD->getGlobal()).addReg(Tmp1);
- } else if (ConstantPoolSDNode *CP =
- dyn_cast<ConstantPoolSDNode>(Address)) {
- unsigned CPIdx = BB->getParent()->getConstantPool()->
- getConstantPoolIndex(CP->get());
- AlphaLowering.restoreGP(BB);
- has_sym = true;
- Tmp1 = MakeReg(MVT::i64);
- BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CPIdx)
- .addReg(Alpha::R29);
- if (EnableAlphaLSMark)
- BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
- .addImm(getUID());
- BuildMI(BB, GetRelVersion(Opc), 2, Result)
- .addConstantPoolIndex(CPIdx).addReg(Tmp1);
+ if (Address.getOpcode() == AlphaISD::GPRelLo) {
+ unsigned Hi = SelectExpr(Address.getOperand(1));
+ Address = Address.getOperand(0);
+ if (GlobalAddressSDNode *GASD = dyn_cast<GlobalAddressSDNode>(Address)) {
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
+ .addImm(getUID());
+ BuildMI(BB, GetRelVersion(Opc), 2, Result)
+ .addGlobalAddress(GASD->getGlobal()).addReg(Hi);
+ } else if (ConstantPoolSDNode *CP =
+ dyn_cast<ConstantPoolSDNode>(Address)) {
+ unsigned CPIdx = BB->getParent()->getConstantPool()->
+ getConstantPoolIndex(CP->get());
+ has_sym = true;
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
+ .addImm(getUID());
+ BuildMI(BB, GetRelVersion(Opc), 2, Result)
+ .addConstantPoolIndex(CPIdx).addReg(Tmp1);
+ } else assert(0 && "Unknown Lo part");
} else if(Address.getOpcode() == ISD::FrameIndex) {
if (EnableAlphaLSMark)
BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
@@ -718,6 +713,36 @@
}
return Result;
}
+ case AlphaISD::GlobalBaseReg:
+ AlphaLowering.restoreGP(BB);
+ BuildMI(BB, Alpha::BIS, 2, Result).addReg(Alpha::R29).addReg(Alpha::R29);
+ return Result;
+ case AlphaISD::GPRelHi:
+ if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N.getOperand(0)))
+ BuildMI(BB, Alpha::LDAHr, 2, Result)
+ .addConstantPoolIndex(BB->getParent()->getConstantPool()->
+ getConstantPoolIndex(CP->get()))
+ .addReg(SelectExpr(N.getOperand(1)));
+ else if (GlobalAddressSDNode *GASD =
+ dyn_cast<GlobalAddressSDNode>(N.getOperand(0)))
+ BuildMI(BB, Alpha::LDAHr, 2, Result)
+ .addGlobalAddress(GASD->getGlobal())
+ .addReg(SelectExpr(N.getOperand(1)));
+ else assert(0 && "unknown Hi part");
+ return Result;
+ case AlphaISD::GPRelLo:
+ if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N.getOperand(0)))
+ BuildMI(BB, Alpha::LDAr, 2, Result)
+ .addConstantPoolIndex(BB->getParent()->getConstantPool()->
+ getConstantPoolIndex(CP->get()))
+ .addReg(SelectExpr(N.getOperand(1)));
+ else if (GlobalAddressSDNode *GASD =
+ dyn_cast<GlobalAddressSDNode>(N.getOperand(0)))
+ BuildMI(BB, Alpha::LDAr, 2, Result)
+ .addGlobalAddress(GASD->getGlobal())
+ .addReg(SelectExpr(N.getOperand(1)));
+ else assert(0 && "unknown Lo part");
+ return Result;
case ISD::GlobalAddress:
AlphaLowering.restoreGP(BB);
@@ -1699,17 +1724,16 @@
getValueInfo(cast<SrcValueSDNode>(N.getOperand(3))->getValue(),
i, j, k);
- GlobalAddressSDNode *GASD = dyn_cast<GlobalAddressSDNode>(Address);
- if (GASD && !GASD->getGlobal()->isExternal()) {
- Tmp2 = MakeReg(MVT::i64);
- AlphaLowering.restoreGP(BB);
- BuildMI(BB, Alpha::LDAHr, 2, Tmp2)
- .addGlobalAddress(GASD->getGlobal()).addReg(Alpha::R29);
- if (EnableAlphaLSMark)
- BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
- .addImm(getUID());
- BuildMI(BB, GetRelVersion(Opc), 3).addReg(Tmp1)
- .addGlobalAddress(GASD->getGlobal()).addReg(Tmp2);
+ if (Address.getOpcode() == AlphaISD::GPRelLo) {
+ unsigned Hi = SelectExpr(Address.getOperand(1));
+ Address = Address.getOperand(0);
+ if (GlobalAddressSDNode *GASD = dyn_cast<GlobalAddressSDNode>(Address)) {
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
+ .addImm(getUID());
+ BuildMI(BB, GetRelVersion(Opc), 3).addReg(Tmp1)
+ .addGlobalAddress(GASD->getGlobal()).addReg(Hi);
+ } else assert(0 && "Unknown Lo part");
} else if(Address.getOpcode() == ISD::FrameIndex) {
if (EnableAlphaLSMark)
BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k)
Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td
diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.85 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.86
--- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.85 Fri Dec 23 21:41:56 2005
+++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Fri Dec 23 23:36:33 2005
@@ -25,6 +25,8 @@
def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_", SDTFPUnaryOp, []>;
+def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
+def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
// These are target-independent nodes, but have target-specific formats.
def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
@@ -437,7 +439,8 @@
def BR_DAG : BFormD<0x30, "br $$31,$DISP">; //Branch
-let isLoad = 1, OperandList = (ops GPRC:$RA, GPRC:$RB), disp = 0 in {
+let OperandList = (ops GPRC:$RA, GPRC:$RB), disp = 0 in {
+let isLoad = 1 in {
def LDQdag : MFormD<0x29, "ldq $RA,0($RB)",
[(set GPRC:$RA, (load GPRC:$RB))]>;
def LDLdag : MFormD<0x29, "ldl $RA,0($RB)",
@@ -446,7 +449,8 @@
[(set GPRC:$RA, (zextload GPRC:$RB, i8))]>;
def LDWUdag : MFormD<0x0C, "ldwu $RA,0($RB)",
[(set GPRC:$RA, (zextload GPRC:$RB, i16))]>;
-
+}
+let isStore = 1 in {
def STBdag : MFormD<0x0E, "stb $RA,0($RB)",
[(truncstore GPRC:$RA, GPRC:$RB, i8)]>;
def STWdag : MFormD<0x0D, "stw $RA,0($RB)",
@@ -456,6 +460,7 @@
def STQdag : MFormD<0x2D, "stq $RA,0($RB)",
[(store GPRC:$RA, GPRC:$RB)]>;
}
+}
def : Pat<(i64 (extload GPRC:$src, i8)),
(LDBUdag GPRC:$src)>;
@@ -464,48 +469,56 @@
def : Pat<(i64 (extload GPRC:$src, i32)),
(LDLdag GPRC:$src)>;
-let isLoad = 1, OperandList = (ops F4RC:$RA, GPRC:$RB), disp = 0 in {
+let OperandList = (ops F4RC:$RA, GPRC:$RB), disp = 0 in {
+let isStore = 1 in
def STSdag : MFormD<0x26, "sts $RA,0($RB)",
[(store F4RC:$RA, GPRC:$RB)]>;
+let isLoad = 1 in
def LDSdag : MFormD<0x22, "lds $RA,0($RB)",
[(set F4RC:$RA, (load GPRC:$RB))]>;
}
-let isLoad = 1, OperandList = (ops F8RC:$RA, GPRC:$RB), disp = 0 in {
+let OperandList = (ops F8RC:$RA, GPRC:$RB), disp = 0 in {
+let isStore = 1 in
def STTdag : MFormD<0x27, "stt $RA,0($RB)",
[(store F8RC:$RA, GPRC:$RB)]>;
+let isLoad = 1 in
def LDTdag : MFormD<0x23, "ldt $RA,0($RB)",
[(set F8RC:$RA, (load GPRC:$RB))]>;
}
+let isStore = 1 in {
//Stores, int
def STB : MForm<0x0E, "stb $RA,$DISP($RB)">; // Store byte
def STW : MForm<0x0D, "stw $RA,$DISP($RB)">; // Store word
def STL : MForm<0x2C, "stl $RA,$DISP($RB)">; // Store longword
def STQ : MForm<0x2D, "stq $RA,$DISP($RB)">; //Store quadword
-//Loads, int
-def LDL : MForm<0x28, "ldl $RA,$DISP($RB)">; // Load sign-extended longword
-def LDQ : MForm<0x29, "ldq $RA,$DISP($RB)">; //Load quadword
-def LDBU : MForm<0x0A, "ldbu $RA,$DISP($RB)">; //Load zero-extended byte
-def LDWU : MForm<0x0C, "ldwu $RA,$DISP($RB)">; //Load zero-extended word
-
//Stores, float
let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
def STS : MFormAlt<0x26, "sts $RA,$DISP($RB)">; //Store S_floating
let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
def STT : MFormAlt<0x27, "stt $RA,$DISP($RB)">; //Store T_floating
+}
+
+let isLoad = 1 in {
+//Loads, int
+def LDL : MForm<0x28, "ldl $RA,$DISP($RB)">; // Load sign-extended longword
+def LDQ : MForm<0x29, "ldq $RA,$DISP($RB)">; //Load quadword
+def LDBU : MForm<0x0A, "ldbu $RA,$DISP($RB)">; //Load zero-extended byte
+def LDWU : MForm<0x0C, "ldwu $RA,$DISP($RB)">; //Load zero-extended word
//Loads, float
let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
def LDS : MFormAlt<0x22, "lds $RA,$DISP($RB)">; //Load S_floating
let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
def LDT : MFormAlt<0x23, "ldt $RA,$DISP($RB)">; //Load T_floating
+}
//Load address
def LDA : MForm<0x08, "lda $RA,$DISP($RB)">; //Load address
def LDAH : MForm<0x09, "ldah $RA,$DISP($RB)">; //Load address high
-
+let isLoad = 1 in {
//Loads, int, Rellocated Low form
def LDLr : MForm<0x28, "ldl $RA,$DISP($RB)\t\t!gprellow">; // Load sign-extended longword
def LDQr : MForm<0x29, "ldq $RA,$DISP($RB)\t\t!gprellow">; //Load quadword
@@ -517,19 +530,22 @@
def LDSr : MFormAlt<0x22, "lds $RA,$DISP($RB)\t\t!gprellow">; //Load S_floating
let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
def LDTr : MFormAlt<0x23, "ldt $RA,$DISP($RB)\t\t!gprellow">; //Load T_floating
+}
//Load address, rellocated low and high form
def LDAr : MForm<0x08, "lda $RA,$DISP($RB)\t\t!gprellow">; //Load address
def LDAHr : MForm<0x09, "ldah $RA,$DISP($RB)\t\t!gprelhigh">; //Load address high
+
//load address, rellocated gpdist form
def LDAg : MgForm<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
def LDAHg : MgForm<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
-
//Load quad, rellocated literal form
+let isLoad = 1 in
def LDQl : MForm<0x29, "ldq $RA,$DISP($RB)\t\t!literal">; //Load quadword
+let isStore = 1 in {
//Stores, int
def STBr : MForm<0x0E, "stb $RA,$DISP($RB)\t\t!gprellow">; // Store byte
def STWr : MForm<0x0D, "stw $RA,$DISP($RB)\t\t!gprellow">; // Store word
@@ -541,7 +557,7 @@
def STSr : MFormAlt<0x26, "sts $RA,$DISP($RB)\t\t!gprellow">; //Store S_floating
let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
def STTr : MFormAlt<0x27, "stt $RA,$DISP($RB)\t\t!gprellow">; //Store T_floating
-
+}
//Branches, int
def BEQ : BForm<0x39, "beq $RA,$DISP">; //Branch if = zero
@@ -803,3 +819,42 @@
def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
(SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
(CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;
+
+def : Pat<(Alpha_gprello tglobaladdr:$in, GPRC:$reg),
+ (LDAr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(Alpha_gprelhi tglobaladdr:$in, GPRC:$reg),
+ (LDAHr tglobaladdr:$in, GPRC:$reg)>;
+
+//GOT Relative loads
+def : Pat<(i64 (load (Alpha_gprello tglobaladdr:$in, GPRC:$reg))),
+ (LDQr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(f64 (load (Alpha_gprello tglobaladdr:$in, GPRC:$reg))),
+ (LDTr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(f32 (load (Alpha_gprello tglobaladdr:$in, GPRC:$reg))),
+ (LDSr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (sextload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i32)),
+ (LDLr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (extload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i32)),
+ (LDLr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (zextload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i16)),
+ (LDWUr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (extload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i16)),
+ (LDWUr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (zextload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i8)),
+ (LDBUr tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(i64 (extload (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i8)),
+ (LDBUr tglobaladdr:$in, GPRC:$reg)>;
+
+//GOT Relative Stores
+def : Pat<(store GPRC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg)),
+ (STQr GPRC:$val, tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(store F8RC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg)),
+ (STTr F8RC:$val, tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(store F4RC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg)),
+ (STSr F4RC:$val, tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(truncstore GPRC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i32),
+ (STLr GPRC:$val, tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(truncstore GPRC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i16),
+ (STWr GPRC:$val, tglobaladdr:$in, GPRC:$reg)>;
+def : Pat<(truncstore GPRC:$val, (Alpha_gprello tglobaladdr:$in, GPRC:$reg), i8),
+ (STBr GPRC:$val, tglobaladdr:$in, GPRC:$reg)>;
More information about the llvm-commits
mailing list