Custom lower SIGN_EXTEND
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 May 2009 13:17:49 +0000 (13:17 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 May 2009 13:17:49 +0000 (13:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70763 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/MSP430/MSP430ISelLowering.cpp
lib/Target/MSP430/MSP430ISelLowering.h

index d609a31d9c2d80cd23e43e3a71a117c295b6b7fa..df8072c601683fcad3dd7596bb19da04aebd3605 100644 (file)
@@ -85,6 +85,7 @@ MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) :
   setOperationAction(ISD::SELECT_CC,        MVT::Other, Expand);
   setOperationAction(ISD::SELECT,           MVT::i8,    Custom);
   setOperationAction(ISD::SELECT,           MVT::i16,   Custom);
+  setOperationAction(ISD::SIGN_EXTEND,      MVT::i16,   Custom);
 
   // FIXME: Implement efficiently multiplication by a constant
   setOperationAction(ISD::MUL,              MVT::i16,   Expand);
@@ -107,6 +108,7 @@ SDValue MSP430TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
   case ISD::SETCC:            return LowerSETCC(Op, DAG);
   case ISD::BRCOND:           return LowerBRCOND(Op, DAG);
   case ISD::SELECT:           return LowerSELECT(Op, DAG);
+  case ISD::SIGN_EXTEND:      return LowerSIGN_EXTEND(Op, DAG);
   default:
     assert(0 && "unimplemented operand");
     return SDValue();
@@ -592,6 +594,19 @@ SDValue MSP430TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) {
   return DAG.getNode(MSP430ISD::SELECT, dl, VTs, &Ops[0], Ops.size());
 }
 
+SDValue MSP430TargetLowering::LowerSIGN_EXTEND(SDValue Op,
+                                               SelectionDAG &DAG) {
+  SDValue Val = Op.getOperand(0);
+  MVT VT      = Op.getValueType();
+  DebugLoc dl = Op.getDebugLoc();
+
+  assert(VT == MVT::i16 && "Only support i16 for now!");
+
+  return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT,
+                     DAG.getNode(ISD::ANY_EXTEND, dl, VT, Val),
+                     DAG.getValueType(Val.getValueType()));
+}
+
 const char *MSP430TargetLowering::getTargetNodeName(unsigned Opcode) const {
   switch (Opcode) {
   default: return NULL;
index d440ca296c6ac10d9a296b22fb8afa408a8b3c9e..32c990d84b043bb85759849a502bff4bb667659c 100644 (file)
@@ -86,6 +86,7 @@ namespace llvm {
     SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG);
     SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
     SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG);
+    SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG);
 
     SDValue LowerCCCCallTo(SDValue Op, SelectionDAG &DAG,
                            unsigned CC);