diff options
| -rw-r--r-- | llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp | 28 | ||||
| -rw-r--r-- | llvm/lib/Target/Alpha/AlphaInstrInfo.td | 60 | 
2 files changed, 48 insertions, 40 deletions
| diff --git a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp index ac87a4ef3f0..256ae549898 100644 --- a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp +++ b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp @@ -111,34 +111,6 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {    case ISD::DYNAMIC_STACKALLOC:      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: {      SDOperand Chain = Select(N->getOperand(0));      SDOperand CC = Select(N->getOperand(1)); diff --git a/llvm/lib/Target/Alpha/AlphaInstrInfo.td b/llvm/lib/Target/Alpha/AlphaInstrInfo.td index c32728c0075..4935e1577c8 100644 --- a/llvm/lib/Target/Alpha/AlphaInstrInfo.td +++ b/llvm/lib/Target/Alpha/AlphaInstrInfo.td @@ -308,18 +308,54 @@ def ZAPNOTi  : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",                        [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;   //Comparison, int -def CMPBGE   : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC", []>; //Compare byte -def CMPBGEi  : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC", []>; //Compare byte -def CMPEQ    : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC", []>; //Compare signed quadword equal -def CMPEQi   : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC", []>; //Compare signed quadword equal -def CMPLE    : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC", []>; //Compare signed quadword less than or equal -def CMPLEi   : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC", []>; //Compare signed quadword less than or equal -def CMPLT    : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC", []>; //Compare signed quadword less than -def CMPLTi   : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC", []>; //Compare signed quadword less than -def CMPULE   : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC", []>; //Compare unsigned quadword less than or equal -def CMPULEi  : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC", []>; //Compare unsigned quadword less than or equal -def CMPULT   : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC", []>; //Compare unsigned quadword less than -def CMPULTi  : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC", []>; //Compare unsigned quadword less than +//So this is a waste of what this instruction can do, but it still saves something +def CMPBGE  : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",  +                     [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>; +def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC", +                     [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>; +def CMPEQ   : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",  +                     [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>; +def CMPEQi  : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",  +                     [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>; +def CMPLE   : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",  +                     [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>; +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  def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC">;  //Compare T_floating equal | 

