diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c5c14f02ae5..f988048a106 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -7080,6 +7080,14 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op, } } return; + case 'J': + if (ConstantSDNode *C = dyn_cast(Op)) { + if (C->getZExtValue() <= 63) { + Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType()); + break; + } + } + return; case 'N': if (ConstantSDNode *C = dyn_cast(Op)) { if (C->getZExtValue() <= 255) { diff --git a/test/CodeGen/X86/inline-asm.ll b/test/CodeGen/X86/inline-asm.ll index 54dfe76478a..02988fcc29f 100644 --- a/test/CodeGen/X86/inline-asm.ll +++ b/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 +}