[X86] Permit reading of the FLAGS register without it being previously defined
We modeled the RDFLAGS{32,64} operations as "using" {E,R}FLAGS. While technically correct, this is not be desirable for folks who want to examine aspects of the FLAGS register which are not related to computation like whether or not CPUID is a valid instruction. Differential Revision: http://reviews.llvm.org/D17782 llvm-svn: 262465
This commit is contained in:
parent
d4dabb3939
commit
5aadde1ecc
|
@ -23255,7 +23255,12 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
|||
MI->getOpcode() == X86::RDFLAGS32 ? X86::PUSHF32 : X86::PUSHF64;
|
||||
unsigned Pop =
|
||||
MI->getOpcode() == X86::RDFLAGS32 ? X86::POP32r : X86::POP64r;
|
||||
BuildMI(*BB, MI, DL, TII->get(PushF));
|
||||
MachineInstr *Push = BuildMI(*BB, MI, DL, TII->get(PushF));
|
||||
// Permit reads of the FLAGS register without it being defined.
|
||||
// This intrinsic exists to read external processor state in flags, such as
|
||||
// the trap flag, interrupt flag, and direction flag, none of which are
|
||||
// modeled by the backend.
|
||||
Push->getOperand(2).setIsUndef();
|
||||
BuildMI(*BB, MI, DL, TII->get(Pop), MI->getOperand(0).getReg());
|
||||
|
||||
MI->eraseFromParent(); // The pseudo is gone now.
|
||||
|
|
|
@ -1122,12 +1122,12 @@ def PUSH32rmm: I<0xFF, MRM6m, (outs), (ins i32mem:$src), "push{l}\t$src",[],
|
|||
|
||||
let mayLoad = 1, mayStore = 1, usesCustomInserter = 1,
|
||||
SchedRW = [WriteRMW], Defs = [ESP] in {
|
||||
let Uses = [ESP, EFLAGS] in
|
||||
let Uses = [ESP] in
|
||||
def RDFLAGS32 : PseudoI<(outs GR32:$dst), (ins),
|
||||
[(set GR32:$dst, (int_x86_flags_read_u32))]>,
|
||||
Requires<[Not64BitMode]>;
|
||||
|
||||
let Uses = [RSP, EFLAGS] in
|
||||
let Uses = [RSP] in
|
||||
def RDFLAGS64 : PseudoI<(outs GR64:$dst), (ins),
|
||||
[(set GR64:$dst, (int_x86_flags_read_u64))]>,
|
||||
Requires<[In64BitMode]>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs < %s | FileCheck %s
|
||||
target triple = "x86_64-pc-win32"
|
||||
|
||||
declare i64 @llvm.x86.flags.read.u64()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs < %s | FileCheck %s
|
||||
target triple = "i686-pc-win32"
|
||||
|
||||
declare i32 @llvm.x86.flags.read.u32()
|
||||
|
|
Loading…
Reference in New Issue