mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-07 14:33:15 +00:00
Pseudo CMOV instructions don't clobber EFLAGS.
The explanation about a 0 argument being materialized as xor is no longer valid. Rematerialization will check if EFLAGS is live before clobbering it. The code produced by X86TargetLowering::EmitLoweredSelect does not clobber EFLAGS. This causes one less testb instruction to be generated in the cmov.ll test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b8e052e123
commit
5047d76575
@ -349,18 +349,11 @@ def TLSCall_64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Conditional Move Pseudo Instructions
|
||||
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
|
||||
// Conditional moves
|
||||
let Uses = [EFLAGS] in {
|
||||
|
||||
// X86 doesn't have 8-bit conditional moves. Use a customInserter to
|
||||
// emit control flow. An alternative to this is to mark i8 SELECT as Promote,
|
||||
// however that requires promoting the operands, and can induce additional
|
||||
// i8 register pressure. Note that CMOV_GR8 is conservatively considered to
|
||||
// clobber EFLAGS, because if one of the operands is zero, the expansion
|
||||
// could involve an xor.
|
||||
let usesCustomInserter = 1, Constraints = "", Defs = [EFLAGS] in {
|
||||
// i8 register pressure.
|
||||
let usesCustomInserter = 1, Uses = [EFLAGS] in {
|
||||
def CMOV_GR8 : I<0, Pseudo,
|
||||
(outs GR8:$dst), (ins GR8:$src1, GR8:$src2, i8imm:$cond),
|
||||
"#CMOV_GR8 PSEUDO!",
|
||||
@ -400,10 +393,7 @@ def CMOV_RFP80 : I<0, Pseudo,
|
||||
(X86cmov RFP80:$src1, RFP80:$src2, imm:$cond,
|
||||
EFLAGS))]>;
|
||||
} // Predicates = [NoCMov]
|
||||
} // UsesCustomInserter = 1, Constraints = "", Defs = [EFLAGS]
|
||||
} // Uses = [EFLAGS]
|
||||
|
||||
} // Constraints = "$src1 = $dst" in
|
||||
} // UsesCustomInserter = 1, Uses = [EFLAGS]
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -90,8 +90,8 @@ bb.i.i.i: ; preds = %entry
|
||||
; CHECK: test4:
|
||||
; CHECK: g_100
|
||||
; CHECK: testb
|
||||
; CHECK: testb %al, %al
|
||||
; CHECK-NEXT: setne %al
|
||||
; CHECK-NOT: xor
|
||||
; CHECK: setne
|
||||
; CHECK-NEXT: testb
|
||||
|
||||
func_4.exit.i: ; preds = %bb.i.i.i, %entry
|
||||
|
@ -47,10 +47,10 @@ return: ; preds = %bb
|
||||
}
|
||||
|
||||
; CHECK: test1:
|
||||
; CHECK: movl %{{.*}}, (%rdi,%rcx,4)
|
||||
; CHECK: movl %{{.*}}, 8(%rdi,%rcx,4)
|
||||
; CHECK: movl %{{.*}}, 4(%rdi,%rcx,4)
|
||||
; CHECK: movl %{{.*}}, 12(%rdi,%rcx,4)
|
||||
; CHECK: movl %{{.*}}, (%[[RDI:...]],%[[RCX:...]],4)
|
||||
; CHECK: movl %{{.*}}, 8(%[[RDI]],%[[RCX]],4)
|
||||
; CHECK: movl %{{.*}}, 4(%[[RDI]],%[[RCX]],4)
|
||||
; CHECK: movl %{{.*}}, 12(%[[RDI]],%[[RCX]],4)
|
||||
|
||||
define void @test1(i32* nocapture %array, i32 %r0, i8 signext %k, i8 signext %i0) nounwind {
|
||||
bb.nph:
|
||||
|
Loading…
x
Reference in New Issue
Block a user