Skip to content

Commit

Permalink
[X86] Extend boolean arguments to inline-asm according to getBooleanType
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D60208

llvm-svn: 357615
  • Loading branch information
Krzysztof Parzyszek committed Apr 3, 2019
1 parent 27a83e9 commit 4841643
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
9 changes: 7 additions & 2 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -43505,8 +43505,13 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
case 'i': {
// Literal immediates are always ok.
if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op)) {
// Widen to 64 bits here to get it sign extended.
Result = DAG.getTargetConstant(CST->getSExtValue(), SDLoc(Op), MVT::i64);
bool IsBool = CST->getConstantIntValue()->getBitWidth() == 1;
BooleanContent BCont = getBooleanContents(MVT::i64);
ISD::NodeType ExtOpc = IsBool ? getExtendForContent(BCont)
: ISD::SIGN_EXTEND;
int64_t ExtVal = ExtOpc == ISD::ZERO_EXTEND ? CST->getZExtValue()
: CST->getSExtValue();
Result = DAG.getTargetConstant(ExtVal, SDLoc(Op), MVT::i64);
break;
}

Expand Down
15 changes: 15 additions & 0 deletions llvm/test/CodeGen/X86/inline-asm-i-constraint-i1.ll
@@ -0,0 +1,15 @@
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s

; Make sure that boolean immediates are properly (zero) extended.
; CHECK: .Ltmp[[N:[0-9]+]]:
; CHECK-NEXT: .quad (42+1)-.Ltmp[[N]]

target triple = "x86_64-unknown-linux-gnu"

define i32 @foo() #0 {
entry:
tail call void asm sideeffect ".quad 42 + ${0:c} - .\0A\09", "i,~{dirflag},~{fpsr},~{flags}"(i1 true) #0
ret i32 1
}

attributes #0 = { nounwind }

0 comments on commit 4841643

Please sign in to comment.