Commit 539eba23 authored by Tanya Lattner's avatar Tanya Lattner
Browse files

Merging from mainline.

llvm-svn: 37212
parent 16c912d5
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -3326,31 +3326,39 @@ isOperandValidForConstraint(SDOperand Op, char Letter, SelectionDAG &DAG) {
  case 'N':
  case 'O':
  case 'P': {
    if (!isa<ConstantSDNode>(Op)) return SDOperand(0,0);// Must be an immediate.
    unsigned Value = cast<ConstantSDNode>(Op)->getValue();
    ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op);
    if (!CST) return SDOperand(0, 0); // Must be an immediate to match.
    unsigned Value = CST->getValue();
    switch (Letter) {
    default: assert(0 && "Unknown constraint letter!");
    case 'I':  // "I" is a signed 16-bit constant.
      if ((short)Value == (int)Value) return Op;
      if ((short)Value == (int)Value)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'J':  // "J" is a constant with only the high-order 16 bits nonzero.
    case 'L':  // "L" is a signed 16-bit constant shifted left 16 bits.
      if ((short)Value == 0) return Op;
      if ((short)Value == 0)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'K':  // "K" is a constant with only the low-order 16 bits nonzero.
      if ((Value >> 16) == 0) return Op;
      if ((Value >> 16) == 0)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'M':  // "M" is a constant that is greater than 31.
      if (Value > 31) return Op;
      if (Value > 31)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'N':  // "N" is a positive constant that is an exact power of two.
      if ((int)Value > 0 && isPowerOf2_32(Value)) return Op;
      if ((int)Value > 0 && isPowerOf2_32(Value))
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'O':  // "O" is the constant zero. 
      if (Value == 0) return Op;
      if (Value == 0)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    case 'P':  // "P" is a constant whose negation is a signed 16-bit constant.
      if ((short)-Value == (int)-Value) return Op;
      if ((short)-Value == (int)-Value)
        return DAG.getTargetConstant(Value, Op.getValueType());
      break;
    }
    break;
+4 −3
Original line number Diff line number Diff line
@@ -4725,18 +4725,19 @@ isOperandValidForConstraint(SDOperand Op, char Constraint, SelectionDAG &DAG) {
  case 'I':
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
      if (C->getValue() <= 31)
        return Op;
        return DAG.getTargetConstant(C->getValue(), Op.getValueType());
    }
    return SDOperand(0,0);
  case 'N':
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
      if (C->getValue() <= 255)
        return Op;
        return DAG.getTargetConstant(C->getValue(), Op.getValueType());
    }
    return SDOperand(0,0);
  case 'i': {
    // Literal immediates are always ok.
    if (isa<ConstantSDNode>(Op)) return Op;
    if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op))
      return DAG.getTargetConstant(CST->getValue(), Op.getValueType());

    // If we are in non-pic codegen mode, we allow the address of a global (with
    // an optional displacement) to be used with 'i'.