diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inline-asm.ll | 12 | 
2 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c5c14f02ae5..f988048a106 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -7080,6 +7080,14 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,        }      }      return; +  case 'J': +    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) { +      if (C->getZExtValue() <= 63) { +        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType()); +        break; +      } +    } +    return;    case 'N':      if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {        if (C->getZExtValue() <= 255) { diff --git a/llvm/test/CodeGen/X86/inline-asm.ll b/llvm/test/CodeGen/X86/inline-asm.ll index 54dfe76478a..02988fcc29f 100644 --- a/llvm/test/CodeGen/X86/inline-asm.ll +++ b/llvm/test/CodeGen/X86/inline-asm.ll @@ -1,21 +1,25 @@  ; RUN: llvm-as < %s | llc -march=x86 -define i32 @test1() { +define i32 @test1() nounwind {  	; Dest is AX, dest type = i32.          %tmp4 = call i32 asm sideeffect "FROB $0", "={ax}"()          ret i32 %tmp4  } -define void @test2(i32 %V) { +define void @test2(i32 %V) nounwind {  	; input is AX, in type = i32.          call void asm sideeffect "FROB $0", "{ax}"(i32 %V)          ret void  } -define void @test3() { +define void @test3() nounwind {          ; FP constant as a memory operand.          tail call void asm sideeffect "frob $0", "m"( float 0x41E0000000000000)          ret void  } - +define void @test4() nounwind { +       ; J means a constant in range 0 to 63. +       tail call void asm sideeffect "bork $0", "J"(i32 37) nounwind +       ret void +}  | 

