[X86] Connect the default fpsr and dirflag clobbers in inline assembly to the registers we have defined for them.
Summary: We don't currently map these constraints to physical register numbers so they don't make it to the MachineIR representation of inline assembly. This could have problems for proper dependency tracking in the machine schedulers though I don't have a test case that shows that. Reviewers: rnk Reviewed By: rnk Subscribers: eraman, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D57641 llvm-svn: 353141
This commit is contained in:
parent
73f499771f
commit
f86eb00f12
|
|
@ -43006,6 +43006,14 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|||
if (StringRef("{flags}").equals_lower(Constraint))
|
||||
return std::make_pair(X86::EFLAGS, &X86::CCRRegClass);
|
||||
|
||||
// dirflag -> DF
|
||||
if (StringRef("{dirflag}").equals_lower(Constraint))
|
||||
return std::make_pair(X86::DF, &X86::DFCCRRegClass);
|
||||
|
||||
// fpsr -> FPSW
|
||||
if (StringRef("{fpsr}").equals_lower(Constraint))
|
||||
return std::make_pair(X86::FPSW, &X86::FPCCRRegClass);
|
||||
|
||||
// 'A' means [ER]AX + [ER]DX.
|
||||
if (Constraint == "A") {
|
||||
if (Subtarget.is64Bit())
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ def ST6 : X86Reg<"st(6)", 6>, DwarfRegNum<[39, 18, 17]>;
|
|||
def ST7 : X86Reg<"st(7)", 7>, DwarfRegNum<[40, 19, 18]>;
|
||||
|
||||
// Floating-point status word
|
||||
def FPSW : X86Reg<"fpsw", 0>;
|
||||
def FPSW : X86Reg<"fpsr", 0>;
|
||||
|
||||
// Status flags register.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
; RUN: llc < %s -mtriple=i686 -stop-after=expand-isel-pseudos | FileCheck %s
|
||||
|
||||
; CHECK: INLINEASM &"", 1, 12, implicit-def early-clobber $df, 12, implicit-def early-clobber $fpsw, 12, implicit-def early-clobber $eflags
|
||||
define void @foo() {
|
||||
entry:
|
||||
call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
|
||||
ret void
|
||||
}
|
||||
Loading…
Reference in New Issue