mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 20:26:07 +00:00
int comparison patterns
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24020 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -111,34 +111,6 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
|
|||||||
case ISD::DYNAMIC_STACKALLOC:
|
case ISD::DYNAMIC_STACKALLOC:
|
||||||
assert(0 && "You want these too?");
|
assert(0 && "You want these too?");
|
||||||
|
|
||||||
case ISD::SETCC: {
|
|
||||||
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
|
|
||||||
assert(MVT::isInteger(N->getOperand(0).getValueType()) && "FP numbers are unnecessary");
|
|
||||||
SDOperand Op1 = Select(N->getOperand(0));
|
|
||||||
SDOperand Op2 = Select(N->getOperand(1));
|
|
||||||
unsigned Opc = Alpha::WTF;
|
|
||||||
int dir;
|
|
||||||
switch (CC) {
|
|
||||||
default: N->dump(); assert(0 && "Unknown integer comparison!");
|
|
||||||
case ISD::SETEQ: Opc = Alpha::CMPEQ; dir=1; break;
|
|
||||||
case ISD::SETLT: Opc = Alpha::CMPLT; dir = 1; break;
|
|
||||||
case ISD::SETLE: Opc = Alpha::CMPLE; dir = 1; break;
|
|
||||||
case ISD::SETGT: Opc = Alpha::CMPLT; dir = 0; break;
|
|
||||||
case ISD::SETGE: Opc = Alpha::CMPLE; dir = 0; break;
|
|
||||||
case ISD::SETULT: Opc = Alpha::CMPULT; dir = 1; break;
|
|
||||||
case ISD::SETUGT: Opc = Alpha::CMPULT; dir = 0; break;
|
|
||||||
case ISD::SETULE: Opc = Alpha::CMPULE; dir = 1; break;
|
|
||||||
case ISD::SETUGE: Opc = Alpha::CMPULE; dir = 0; break;
|
|
||||||
case ISD::SETNE: {//Handle this one special
|
|
||||||
SDOperand Tmp = CurDAG->getTargetNode(Alpha::CMPEQ, MVT::i64, Op1, Op2);
|
|
||||||
CurDAG->SelectNodeTo(N, Alpha::CMPEQ, MVT::i64, CurDAG->getRegister(Alpha::R31, MVT::i64), Tmp);
|
|
||||||
return SDOperand(N, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CurDAG->SelectNodeTo(N, Opc, MVT::i64, dir ? Op1 : Op2, dir ? Op2 : Op1);
|
|
||||||
return SDOperand(N, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
case ISD::BRCOND: {
|
case ISD::BRCOND: {
|
||||||
SDOperand Chain = Select(N->getOperand(0));
|
SDOperand Chain = Select(N->getOperand(0));
|
||||||
SDOperand CC = Select(N->getOperand(1));
|
SDOperand CC = Select(N->getOperand(1));
|
||||||
|
@@ -308,18 +308,54 @@ def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
|
|||||||
[(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
|
[(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
|
||||||
|
|
||||||
//Comparison, int
|
//Comparison, int
|
||||||
def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC", []>; //Compare byte
|
//So this is a waste of what this instruction can do, but it still saves something
|
||||||
def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC", []>; //Compare byte
|
def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
|
||||||
def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC", []>; //Compare signed quadword equal
|
[(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
|
||||||
def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC", []>; //Compare signed quadword equal
|
def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
|
||||||
def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC", []>; //Compare signed quadword less than or equal
|
[(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
|
||||||
def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC", []>; //Compare signed quadword less than or equal
|
def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
|
||||||
def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC", []>; //Compare signed quadword less than
|
[(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
|
||||||
def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC", []>; //Compare signed quadword less than
|
def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
|
||||||
def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC", []>; //Compare unsigned quadword less than or equal
|
[(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
|
||||||
def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC", []>; //Compare unsigned quadword less than or equal
|
def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
|
||||||
def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC", []>; //Compare unsigned quadword less than
|
[(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
|
||||||
def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC", []>; //Compare unsigned quadword less than
|
def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
|
||||||
|
[(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
|
||||||
|
def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
|
||||||
|
[(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
|
||||||
|
def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
|
||||||
|
[(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
|
||||||
|
def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
|
||||||
|
[(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
|
||||||
|
def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
|
||||||
|
[(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
|
||||||
|
def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
|
||||||
|
[(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
|
||||||
|
def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
|
||||||
|
[(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
|
||||||
|
|
||||||
|
//Patterns for unsupported int comparisons
|
||||||
|
def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
|
||||||
|
def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
|
||||||
|
|
||||||
|
def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
|
||||||
|
def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
|
||||||
|
|
||||||
|
def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
|
||||||
|
def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
|
||||||
|
|
||||||
|
def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
|
||||||
|
def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
|
||||||
|
|
||||||
|
def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
|
||||||
|
def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
|
||||||
|
|
||||||
|
def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
|
||||||
|
def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
|
||||||
|
|
||||||
|
def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
|
||||||
|
def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
|
||||||
|
|
||||||
|
|
||||||
//Comparison, FP
|
//Comparison, FP
|
||||||
def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC">; //Compare T_floating equal
|
def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC">; //Compare T_floating equal
|
||||||
|
Reference in New Issue
Block a user