mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-24 05:09:34 +00:00
[X86]: Updated r272801 to promote 16 bit compares with immediate operand
to 32 bits. This is in response to a comment by Eli Friedman. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272814 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b372f89f41
commit
42abc92144
@ -3927,6 +3927,26 @@ bool X86::isCalleePop(CallingConv::ID CallingConv,
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Return true if the condition is an unsigned comparison operation.
|
||||
static bool isX86CCUnsigned(unsigned X86CC) {
|
||||
switch (X86CC) {
|
||||
default:
|
||||
llvm_unreachable("Invalid integer condition!");
|
||||
case X86::COND_E:
|
||||
case X86::COND_NE:
|
||||
case X86::COND_B:
|
||||
case X86::COND_A:
|
||||
case X86::COND_BE:
|
||||
case X86::COND_AE:
|
||||
return true;
|
||||
case X86::COND_G:
|
||||
case X86::COND_GE:
|
||||
case X86::COND_L:
|
||||
case X86::COND_LE:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static X86::CondCode TranslateIntegerX86CC(ISD::CondCode SetCCOpcode) {
|
||||
switch (SetCCOpcode) {
|
||||
default: llvm_unreachable("Invalid integer condition!");
|
||||
@ -14746,6 +14766,17 @@ SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
|
||||
|
||||
if ((Op0.getValueType() == MVT::i8 || Op0.getValueType() == MVT::i16 ||
|
||||
Op0.getValueType() == MVT::i32 || Op0.getValueType() == MVT::i64)) {
|
||||
// Only promote the compare up to I32 if it is a 16 bit operation
|
||||
// with an immediate. 16 bit immediates are to be avoided.
|
||||
if ((Op0.getValueType() == MVT::i16 &&
|
||||
(isa<ConstantSDNode>(Op0) || isa<ConstantSDNode>(Op1))) &&
|
||||
!DAG.getMachineFunction().getFunction()->optForMinSize() &&
|
||||
!Subtarget.isAtom()) {
|
||||
unsigned ExtendOp =
|
||||
isX86CCUnsigned(X86CC) ? ISD::ZERO_EXTEND : ISD::SIGN_EXTEND;
|
||||
Op0 = DAG.getNode(ExtendOp, dl, MVT::i32, Op0);
|
||||
Op1 = DAG.getNode(ExtendOp, dl, MVT::i32, Op1);
|
||||
}
|
||||
// Use SUB instead of CMP to enable CSE between SUB and CMP.
|
||||
SDVTList VTs = DAG.getVTList(Op0.getValueType(), MVT::i32);
|
||||
SDValue Sub = DAG.getNode(X86ISD::SUB, dl, VTs,
|
||||
|
@ -41,7 +41,8 @@ bb: ; preds = %entry
|
||||
return: ; preds = %entry
|
||||
ret void
|
||||
; CHECK-LABEL: memcmp2a:
|
||||
; CHECK: cmpw $28527, (%
|
||||
; CHECK: movzwl
|
||||
; CHECK-NEXT: cmpl $28527,
|
||||
}
|
||||
|
||||
|
||||
|
@ -520,7 +520,8 @@ declare hidden fastcc %struct.temp_slot* @find_temp_slot_from_address(%struct.rt
|
||||
; CHECK: testq %rdi, %rdi
|
||||
; CHECK-NEXT: je [[CLEANUP:LBB[0-9_]+]]
|
||||
;
|
||||
; CHECK: cmpw $66, (%rdi)
|
||||
; CHECK: movzwl (%rdi), [[BF_LOAD:%e[a-z]+]]
|
||||
; CHECK-NEXT: cmpl $66, [[BF_LOAD]]
|
||||
; CHECK-NEXT: jne [[CLEANUP]]
|
||||
;
|
||||
; CHECK: movq 8(%rdi), %rdi
|
||||
|
Loading…
x
Reference in New Issue
Block a user