Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -32477,6 +32477,27 @@ } } + if (N->getValueType(0) == MVT::i16) { + // Try to promote 16-bit cmovs to 32-bit for a shorter encoding. + if (!MayFoldLoad(FalseOp) && !MayFoldLoad(TrueOp)) { + if (isa(FalseOp)) + FalseOp = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i32, FalseOp); + else + FalseOp = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, FalseOp); + if (isa(TrueOp)) + TrueOp = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i32, TrueOp); + else + TrueOp = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, TrueOp); + SDValue Ops[] = {FalseOp, TrueOp, DAG.getConstant(CC, DL, MVT::i8), Cond}; + SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, MVT::i32, Ops); + SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, Cmov); + // Don't add to worklist or the truncate will strip the sign_extends on + // the constants. + DCI.CombineTo(N, Trunc, false); + return SDValue(N, 0); + } + } + return SDValue(); } @@ -36071,42 +36092,42 @@ return R.getValue(1); } -// If we face {ANY,SIGN,ZERO}_EXTEND that is applied to a CMOV with constant +// If we face SIGN_EXTEND that is applied to a CMOV with constant // operands and the result of CMOV is not used anywhere else - promote CMOV // itself instead of promoting its result. This could be beneficial, because: // 1) X86TargetLowering::EmitLoweredSelect later can do merging of two // (or more) pseudo-CMOVs only when they go one-after-another and // getting rid of result extension code after CMOV will help that. // 2) Promotion of constant CMOV arguments is free, hence the -// {ANY,SIGN,ZERO}_EXTEND will just be deleted. -// 3) 16-bit CMOV encoding is 4 bytes, 32-bit CMOV is 3-byte, so this -// promotion is also good in terms of code-size. -// (64-bit CMOV is 4-bytes, that's why we don't do 32-bit => 64-bit -// promotion). -static SDValue combineToExtendCMOV(SDNode *Extend, SelectionDAG &DAG) { +// SIGN_EXTEND will just be deleted. +// We only need to handle i32->i64 because i16 cmovs are already promoted +// to i32 in combineSelect. +// We're only concerned about sign extend because zero extend i32->i64 doesn't +// require an instruction. It's implicit in the 32-bit operation. +static SDValue combineToSignExtendCMOV(SDNode *Extend, SelectionDAG &DAG) { SDValue CMovN = Extend->getOperand(0); if (CMovN.getOpcode() != X86ISD::CMOV) return SDValue(); EVT TargetVT = Extend->getValueType(0); - unsigned ExtendOpcode = Extend->getOpcode(); + assert(Extend->getOpcode() == ISD::SIGN_EXTEND && "Unexpected extend"); SDLoc DL(Extend); EVT VT = CMovN.getValueType(); SDValue CMovOp0 = CMovN.getOperand(0); SDValue CMovOp1 = CMovN.getOperand(1); - bool DoPromoteCMOV = - (VT == MVT::i16 && (TargetVT == MVT::i32 || TargetVT == MVT::i64)) && - CMovN.hasOneUse() && - (isa(CMovOp0.getNode()) && - isa(CMovOp1.getNode())); + bool DoPromoteCMOV = VT == MVT::i32 && TargetVT == MVT::i64 && + + CMovN.hasOneUse() && + (isa(CMovOp0.getNode()) && + isa(CMovOp1.getNode())); if (!DoPromoteCMOV) return SDValue(); - CMovOp0 = DAG.getNode(ExtendOpcode, DL, TargetVT, CMovOp0); - CMovOp1 = DAG.getNode(ExtendOpcode, DL, TargetVT, CMovOp1); + CMovOp0 = DAG.getNode(ISD::SIGN_EXTEND, DL, TargetVT, CMovOp0); + CMovOp1 = DAG.getNode(ISD::SIGN_EXTEND, DL, TargetVT, CMovOp1); return DAG.getNode(X86ISD::CMOV, DL, TargetVT, CMovOp0, CMovOp1, CMovN.getOperand(2), CMovN.getOperand(3)); @@ -36358,7 +36379,7 @@ if (SDValue DivRem8 = getDivRem8(N, DAG)) return DivRem8; - if (SDValue NewCMov = combineToExtendCMOV(N, DAG)) + if (SDValue NewCMov = combineToSignExtendCMOV(N, DAG)) return NewCMov; if (!DCI.isBeforeLegalizeOps()) @@ -36566,9 +36587,6 @@ } } - if (SDValue NewCMov = combineToExtendCMOV(N, DAG)) - return NewCMov; - if (DCI.isBeforeLegalizeOps()) if (SDValue V = combineExtSetcc(N, DAG, Subtarget)) return V; Index: test/CodeGen/X86/avx512-insert-extract.ll =================================================================== --- test/CodeGen/X86/avx512-insert-extract.ll +++ test/CodeGen/X86/avx512-insert-extract.ll @@ -287,8 +287,9 @@ ; CHECK: ## %bb.0: ; CHECK-NEXT: xorl %ecx, %ecx ; CHECK-NEXT: cmpb $0, (%rdi) -; CHECK-NEXT: movw $-1, %ax -; CHECK-NEXT: cmovew %cx, %ax +; CHECK-NEXT: movl $65535, %eax ## imm = 0xFFFF +; CHECK-NEXT: cmovel %ecx, %eax +; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq %x = load i1 , i1 * %addr, align 1 %x1 = insertelement <16 x i1> undef, i1 %x, i32 10 Index: test/CodeGen/X86/avx512-mask-op.ll =================================================================== --- test/CodeGen/X86/avx512-mask-op.ll +++ test/CodeGen/X86/avx512-mask-op.ll @@ -818,9 +818,9 @@ ; KNL-LABEL: test15: ; KNL: ## %bb.0: ; KNL-NEXT: cmpl %esi, %edi -; KNL-NEXT: movw $21845, %ax ## imm = 0x5555 -; KNL-NEXT: movw $1, %cx -; KNL-NEXT: cmovgw %ax, %cx +; KNL-NEXT: movl $21845, %eax ## imm = 0x5555 +; KNL-NEXT: movl $1, %ecx +; KNL-NEXT: cmovgl %eax, %ecx ; KNL-NEXT: kmovw %ecx, %k1 ; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ; KNL-NEXT: vpmovdb %zmm0, %xmm0 @@ -830,9 +830,9 @@ ; SKX-LABEL: test15: ; SKX: ## %bb.0: ; SKX-NEXT: cmpl %esi, %edi -; SKX-NEXT: movw $21845, %ax ## imm = 0x5555 -; SKX-NEXT: movw $1, %cx -; SKX-NEXT: cmovgw %ax, %cx +; SKX-NEXT: movl $21845, %eax ## imm = 0x5555 +; SKX-NEXT: movl $1, %ecx +; SKX-NEXT: cmovgl %eax, %ecx ; SKX-NEXT: kmovd %ecx, %k0 ; SKX-NEXT: vpmovm2b %k0, %xmm0 ; SKX-NEXT: retq @@ -840,9 +840,9 @@ ; AVX512BW-LABEL: test15: ; AVX512BW: ## %bb.0: ; AVX512BW-NEXT: cmpl %esi, %edi -; AVX512BW-NEXT: movw $21845, %ax ## imm = 0x5555 -; AVX512BW-NEXT: movw $1, %cx -; AVX512BW-NEXT: cmovgw %ax, %cx +; AVX512BW-NEXT: movl $21845, %eax ## imm = 0x5555 +; AVX512BW-NEXT: movl $1, %ecx +; AVX512BW-NEXT: cmovgl %eax, %ecx ; AVX512BW-NEXT: kmovd %ecx, %k0 ; AVX512BW-NEXT: vpmovm2b %k0, %zmm0 ; AVX512BW-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0 @@ -852,9 +852,9 @@ ; AVX512DQ-LABEL: test15: ; AVX512DQ: ## %bb.0: ; AVX512DQ-NEXT: cmpl %esi, %edi -; AVX512DQ-NEXT: movw $21845, %ax ## imm = 0x5555 -; AVX512DQ-NEXT: movw $1, %cx -; AVX512DQ-NEXT: cmovgw %ax, %cx +; AVX512DQ-NEXT: movl $21845, %eax ## imm = 0x5555 +; AVX512DQ-NEXT: movl $1, %ecx +; AVX512DQ-NEXT: cmovgl %eax, %ecx ; AVX512DQ-NEXT: kmovw %ecx, %k0 ; AVX512DQ-NEXT: vpmovm2d %k0, %zmm0 ; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 Index: test/CodeGen/X86/avx512-schedule.ll =================================================================== --- test/CodeGen/X86/avx512-schedule.ll +++ test/CodeGen/X86/avx512-schedule.ll @@ -7201,10 +7201,10 @@ ; GENERIC-LABEL: vmov_test15: ; GENERIC: # %bb.0: ; GENERIC-NEXT: cmpl %esi, %edi # sched: [1:0.33] -; GENERIC-NEXT: movw $21845, %ax # imm = 0x5555 +; GENERIC-NEXT: movl $21845, %eax # imm = 0x5555 ; GENERIC-NEXT: # sched: [1:0.33] -; GENERIC-NEXT: movw $1, %cx # sched: [1:0.33] -; GENERIC-NEXT: cmovgw %ax, %cx # sched: [2:0.67] +; GENERIC-NEXT: movl $1, %ecx # sched: [1:0.33] +; GENERIC-NEXT: cmovgl %eax, %ecx # sched: [2:0.67] ; GENERIC-NEXT: kmovd %ecx, %k0 # sched: [1:0.33] ; GENERIC-NEXT: vpmovm2b %k0, %xmm0 # sched: [1:0.33] ; GENERIC-NEXT: retq # sched: [1:1.00] @@ -7212,10 +7212,10 @@ ; SKX-LABEL: vmov_test15: ; SKX: # %bb.0: ; SKX-NEXT: cmpl %esi, %edi # sched: [1:0.25] -; SKX-NEXT: movw $21845, %ax # imm = 0x5555 +; SKX-NEXT: movl $21845, %eax # imm = 0x5555 ; SKX-NEXT: # sched: [1:0.25] -; SKX-NEXT: movw $1, %cx # sched: [1:0.25] -; SKX-NEXT: cmovgw %ax, %cx # sched: [1:0.50] +; SKX-NEXT: movl $1, %ecx # sched: [1:0.25] +; SKX-NEXT: cmovgl %eax, %ecx # sched: [1:0.50] ; SKX-NEXT: kmovd %ecx, %k0 # sched: [1:1.00] ; SKX-NEXT: vpmovm2b %k0, %xmm0 # sched: [1:0.25] ; SKX-NEXT: retq # sched: [7:1.00] Index: test/CodeGen/X86/bool-simplify.ll =================================================================== --- test/CodeGen/X86/bool-simplify.ll +++ test/CodeGen/X86/bool-simplify.ll @@ -53,7 +53,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: rdrandw %cx -; CHECK-NEXT: cmovbw %di, %ax +; CHECK-NEXT: cmovbl %edi, %eax ; CHECK-NEXT: addl %ecx, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq @@ -105,7 +105,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: rdseedw %cx -; CHECK-NEXT: cmovbw %di, %ax +; CHECK-NEXT: cmovbl %edi, %eax ; CHECK-NEXT: addl %ecx, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq Index: test/CodeGen/X86/cmov-promotion.ll =================================================================== --- test/CodeGen/X86/cmov-promotion.ll +++ test/CodeGen/X86/cmov-promotion.ll @@ -90,18 +90,18 @@ ; CMOV-LABEL: cmov_zpromotion_16_to_32: ; CMOV: # %bb.0: ; CMOV-NEXT: testb $1, %dil -; CMOV-NEXT: movl $12414, %ecx # imm = 0x307E -; CMOV-NEXT: movl $65535, %eax # imm = 0xFFFF -; CMOV-NEXT: cmovnel %ecx, %eax +; CMOV-NEXT: movl $65535, %ecx # imm = 0xFFFF +; CMOV-NEXT: movl $12414, %eax # imm = 0x307E +; CMOV-NEXT: cmovel %ecx, %eax ; CMOV-NEXT: retq ; ; NO_CMOV-LABEL: cmov_zpromotion_16_to_32: ; NO_CMOV: # %bb.0: ; NO_CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) -; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E -; NO_CMOV-NEXT: jne .LBB3_2 -; NO_CMOV-NEXT: # %bb.1: ; NO_CMOV-NEXT: movl $65535, %eax # imm = 0xFFFF +; NO_CMOV-NEXT: je .LBB3_2 +; NO_CMOV-NEXT: # %bb.1: +; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E ; NO_CMOV-NEXT: .LBB3_2: ; NO_CMOV-NEXT: retl %t0 = select i1 %c, i16 12414, i16 -1 @@ -113,18 +113,18 @@ ; CMOV-LABEL: cmov_zpromotion_16_to_64: ; CMOV: # %bb.0: ; CMOV-NEXT: testb $1, %dil -; CMOV-NEXT: movl $12414, %ecx # imm = 0x307E -; CMOV-NEXT: movl $65535, %eax # imm = 0xFFFF -; CMOV-NEXT: cmovneq %rcx, %rax +; CMOV-NEXT: movl $65535, %ecx # imm = 0xFFFF +; CMOV-NEXT: movl $12414, %eax # imm = 0x307E +; CMOV-NEXT: cmovel %ecx, %eax ; CMOV-NEXT: retq ; ; NO_CMOV-LABEL: cmov_zpromotion_16_to_64: ; NO_CMOV: # %bb.0: ; NO_CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) -; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E -; NO_CMOV-NEXT: jne .LBB4_2 -; NO_CMOV-NEXT: # %bb.1: ; NO_CMOV-NEXT: movl $65535, %eax # imm = 0xFFFF +; NO_CMOV-NEXT: je .LBB4_2 +; NO_CMOV-NEXT: # %bb.1: +; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E ; NO_CMOV-NEXT: .LBB4_2: ; NO_CMOV-NEXT: xorl %edx, %edx ; NO_CMOV-NEXT: retl @@ -246,18 +246,18 @@ ; CMOV-LABEL: cmov_spromotion_16_to_32: ; CMOV: # %bb.0: ; CMOV-NEXT: testb $1, %dil -; CMOV-NEXT: movl $12414, %ecx # imm = 0x307E -; CMOV-NEXT: movl $-1, %eax -; CMOV-NEXT: cmovnel %ecx, %eax +; CMOV-NEXT: movl $-1, %ecx +; CMOV-NEXT: movl $12414, %eax # imm = 0x307E +; CMOV-NEXT: cmovel %ecx, %eax ; CMOV-NEXT: retq ; ; NO_CMOV-LABEL: cmov_spromotion_16_to_32: ; NO_CMOV: # %bb.0: ; NO_CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) -; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E -; NO_CMOV-NEXT: jne .LBB9_2 -; NO_CMOV-NEXT: # %bb.1: ; NO_CMOV-NEXT: movl $-1, %eax +; NO_CMOV-NEXT: je .LBB9_2 +; NO_CMOV-NEXT: # %bb.1: +; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E ; NO_CMOV-NEXT: .LBB9_2: ; NO_CMOV-NEXT: retl %t0 = select i1 %c, i16 12414, i16 -1 @@ -277,10 +277,10 @@ ; NO_CMOV-LABEL: cmov_spromotion_16_to_64: ; NO_CMOV: # %bb.0: ; NO_CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) -; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E -; NO_CMOV-NEXT: jne .LBB10_2 -; NO_CMOV-NEXT: # %bb.1: ; NO_CMOV-NEXT: movl $-1, %eax +; NO_CMOV-NEXT: je .LBB10_2 +; NO_CMOV-NEXT: # %bb.1: +; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E ; NO_CMOV-NEXT: .LBB10_2: ; NO_CMOV-NEXT: movl %eax, %edx ; NO_CMOV-NEXT: sarl $31, %edx @@ -294,10 +294,9 @@ ; CMOV-LABEL: cmov_spromotion_32_to_64: ; CMOV: # %bb.0: ; CMOV-NEXT: testb $1, %dil -; CMOV-NEXT: movl $12414, %eax # imm = 0x307E -; CMOV-NEXT: movl $-1, %ecx -; CMOV-NEXT: cmovnel %eax, %ecx -; CMOV-NEXT: movslq %ecx, %rax +; CMOV-NEXT: movl $12414, %ecx # imm = 0x307E +; CMOV-NEXT: movq $-1, %rax +; CMOV-NEXT: cmovneq %rcx, %rax ; CMOV-NEXT: retq ; ; NO_CMOV-LABEL: cmov_spromotion_32_to_64: Index: test/CodeGen/X86/iabs.ll =================================================================== --- test/CodeGen/X86/iabs.ll +++ test/CodeGen/X86/iabs.ll @@ -46,17 +46,19 @@ ; ; X86-CMOV-LABEL: test_i16: ; X86-CMOV: # %bb.0: -; X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %ecx +; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-CMOV-NEXT: movl %ecx, %eax ; X86-CMOV-NEXT: negw %ax -; X86-CMOV-NEXT: cmovlw %cx, %ax +; X86-CMOV-NEXT: cmovll %ecx, %eax +; X86-CMOV-NEXT: # kill: def $ax killed $ax killed $eax ; X86-CMOV-NEXT: retl ; ; X64-LABEL: test_i16: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax ; X64-NEXT: negw %ax -; X64-NEXT: cmovlw %di, %ax +; X64-NEXT: cmovll %edi, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq %tmp1neg = sub i16 0, %a %b = icmp sgt i16 %a, -1 Index: test/CodeGen/X86/select.ll =================================================================== --- test/CodeGen/X86/select.ll +++ test/CodeGen/X86/select.ll @@ -37,51 +37,36 @@ ; PR2139 define i32 @test2() nounwind { -; GENERIC-LABEL: test2: -; GENERIC: ## %bb.0: ## %entry -; GENERIC-NEXT: pushq %rax -; GENERIC-NEXT: callq _return_false -; GENERIC-NEXT: xorl %ecx, %ecx -; GENERIC-NEXT: testb $1, %al -; GENERIC-NEXT: movl $536870432, %eax ## imm = 0x1FFFFE20 -; GENERIC-NEXT: cmovnel %ecx, %eax -; GENERIC-NEXT: shll $3, %eax -; GENERIC-NEXT: cmpl $32768, %eax ## imm = 0x8000 -; GENERIC-NEXT: jge LBB1_1 -; GENERIC-NEXT: ## %bb.2: ## %bb91 -; GENERIC-NEXT: xorl %eax, %eax -; GENERIC-NEXT: popq %rcx -; GENERIC-NEXT: retq -; GENERIC-NEXT: LBB1_1: ## %bb90 -; -; ATOM-LABEL: test2: -; ATOM: ## %bb.0: ## %entry -; ATOM-NEXT: pushq %rax -; ATOM-NEXT: callq _return_false -; ATOM-NEXT: xorl %ecx, %ecx -; ATOM-NEXT: movl $536870432, %edx ## imm = 0x1FFFFE20 -; ATOM-NEXT: testb $1, %al -; ATOM-NEXT: cmovnel %ecx, %edx -; ATOM-NEXT: shll $3, %edx -; ATOM-NEXT: cmpl $32768, %edx ## imm = 0x8000 -; ATOM-NEXT: jge LBB1_1 -; ATOM-NEXT: ## %bb.2: ## %bb91 -; ATOM-NEXT: xorl %eax, %eax -; ATOM-NEXT: popq %rcx -; ATOM-NEXT: retq -; ATOM-NEXT: LBB1_1: ## %bb90 +; CHECK-LABEL: test2: +; CHECK: ## %bb.0: ## %entry +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: callq _return_false +; CHECK-NEXT: xorl %ecx, %ecx +; CHECK-NEXT: testb $1, %al +; CHECK-NEXT: movl $65056, %eax ## imm = 0xFE20 +; CHECK-NEXT: cmovnel %ecx, %eax +; CHECK-NEXT: cwtl +; CHECK-NEXT: shll $3, %eax +; CHECK-NEXT: cmpl $32768, %eax ## imm = 0x8000 +; CHECK-NEXT: jge LBB1_1 +; CHECK-NEXT: ## %bb.2: ## %bb91 +; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: popq %rcx +; CHECK-NEXT: retq +; CHECK-NEXT: LBB1_1: ## %bb90 ; ; MCU-LABEL: test2: ; MCU: # %bb.0: # %entry ; MCU-NEXT: calll return_false -; MCU-NEXT: xorl %ecx, %ecx ; MCU-NEXT: testb $1, %al -; MCU-NEXT: jne .LBB1_2 +; MCU-NEXT: movl $65056, %eax # imm = 0xFE20 +; MCU-NEXT: je .LBB1_2 ; MCU-NEXT: # %bb.1: # %entry -; MCU-NEXT: movl $536870432, %ecx # imm = 0x1FFFFE20 +; MCU-NEXT: xorl %eax, %eax ; MCU-NEXT: .LBB1_2: # %entry -; MCU-NEXT: shll $3, %ecx -; MCU-NEXT: cmpl $32768, %ecx # imm = 0x8000 +; MCU-NEXT: cwtl +; MCU-NEXT: shll $3, %eax +; MCU-NEXT: cmpl $32768, %eax # imm = 0x8000 ; MCU-NEXT: jge .LBB1_3 ; MCU-NEXT: # %bb.4: # %bb91 ; MCU-NEXT: xorl %eax, %eax @@ -937,8 +922,8 @@ ; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF ; GENERIC-NEXT: cmovlel %edi, %eax ; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x8000 -; GENERIC-NEXT: movw $-32768, %cx ## imm = 0x8000 -; GENERIC-NEXT: cmovgew %ax, %cx +; GENERIC-NEXT: movl $32768, %ecx ## imm = 0x8000 +; GENERIC-NEXT: cmovgel %eax, %ecx ; GENERIC-NEXT: movw %cx, (%rsi) ; GENERIC-NEXT: retq ; @@ -947,9 +932,9 @@ ; ATOM-NEXT: cmpl $32767, %edi ## imm = 0x7FFF ; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF ; ATOM-NEXT: cmovlel %edi, %eax -; ATOM-NEXT: movw $-32768, %cx ## imm = 0x8000 +; ATOM-NEXT: movl $32768, %ecx ## imm = 0x8000 ; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x8000 -; ATOM-NEXT: cmovgew %ax, %cx +; ATOM-NEXT: cmovgel %eax, %ecx ; ATOM-NEXT: movw %cx, (%rsi) ; ATOM-NEXT: retq ; @@ -962,7 +947,7 @@ ; MCU-NEXT: movl %eax, %ecx ; MCU-NEXT: .LBB23_2: ; MCU-NEXT: cmpl $-32768, %ecx # imm = 0x8000 -; MCU-NEXT: movw $-32768, %ax # imm = 0x8000 +; MCU-NEXT: movl $32768, %eax # imm = 0x8000 ; MCU-NEXT: jl .LBB23_4 ; MCU-NEXT: # %bb.3: ; MCU-NEXT: movl %ecx, %eax @@ -1062,8 +1047,8 @@ ; CHECK-NEXT: movl %edi, %eax ; CHECK-NEXT: xorl $43, %eax ; CHECK-NEXT: testb $1, %sil -; CHECK-NEXT: cmovnew %ax, %di -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: cmovel %edi, %eax +; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq ; ; MCU-LABEL: select_xor_1: Index: test/CodeGen/X86/setcc-lowering.ll =================================================================== --- test/CodeGen/X86/setcc-lowering.ll +++ test/CodeGen/X86/setcc-lowering.ll @@ -73,7 +73,7 @@ ; KNL-32-NEXT: vptestmd %zmm0, %zmm0, %k0 ; KNL-32-NEXT: movl {{[0-9]+}}(%esp), %eax ; KNL-32-NEXT: movl {{[0-9]+}}(%esp), %ecx -; KNL-32-NEXT: movw $-1, %dx +; KNL-32-NEXT: movl $65535, %edx # imm = 0xFFFF ; KNL-32-NEXT: .p2align 4, 0x90 ; KNL-32-NEXT: .LBB1_1: # %for_loop599 ; KNL-32-NEXT: # =>This Inner Loop Header: Depth=1 @@ -81,7 +81,7 @@ ; KNL-32-NEXT: movl %eax, %esi ; KNL-32-NEXT: sbbl $0, %esi ; KNL-32-NEXT: movl $0, %esi -; KNL-32-NEXT: cmovlw %dx, %si +; KNL-32-NEXT: cmovll %edx, %esi ; KNL-32-NEXT: kmovw %esi, %k1 ; KNL-32-NEXT: kandw %k0, %k1, %k1 ; KNL-32-NEXT: kortestw %k1, %k1 Index: test/CodeGen/X86/vector-compare-all_of.ll =================================================================== --- test/CodeGen/X86/vector-compare-all_of.ll +++ test/CodeGen/X86/vector-compare-all_of.ll @@ -87,9 +87,8 @@ ; SSE-NEXT: movmskps %xmm2, %eax ; SSE-NEXT: xorl %ecx, %ecx ; SSE-NEXT: cmpl $15, %eax -; SSE-NEXT: movl $-1, %eax -; SSE-NEXT: cmovnel %ecx, %eax -; SSE-NEXT: cltq +; SSE-NEXT: movq $-1, %rax +; SSE-NEXT: cmovneq %rcx, %rax ; SSE-NEXT: retq ; ; AVX-LABEL: test_v4f64_legal_sext: @@ -100,9 +99,8 @@ ; AVX-NEXT: vmovmskps %xmm0, %eax ; AVX-NEXT: xorl %ecx, %ecx ; AVX-NEXT: cmpl $15, %eax -; AVX-NEXT: movl $-1, %eax -; AVX-NEXT: cmovnel %ecx, %eax -; AVX-NEXT: cltq +; AVX-NEXT: movq $-1, %rax +; AVX-NEXT: cmovneq %rcx, %rax ; AVX-NEXT: vzeroupper ; AVX-NEXT: retq ; @@ -369,9 +367,8 @@ ; SSE-NEXT: movmskps %xmm0, %eax ; SSE-NEXT: xorl %ecx, %ecx ; SSE-NEXT: cmpl $15, %eax -; SSE-NEXT: movl $-1, %eax -; SSE-NEXT: cmovnel %ecx, %eax -; SSE-NEXT: cltq +; SSE-NEXT: movq $-1, %rax +; SSE-NEXT: cmovneq %rcx, %rax ; SSE-NEXT: retq ; ; AVX1-LABEL: test_v4i64_legal_sext: @@ -384,9 +381,8 @@ ; AVX1-NEXT: vmovmskps %xmm0, %eax ; AVX1-NEXT: xorl %ecx, %ecx ; AVX1-NEXT: cmpl $15, %eax -; AVX1-NEXT: movl $-1, %eax -; AVX1-NEXT: cmovnel %ecx, %eax -; AVX1-NEXT: cltq +; AVX1-NEXT: movq $-1, %rax +; AVX1-NEXT: cmovneq %rcx, %rax ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -398,9 +394,8 @@ ; AVX2-NEXT: vmovmskps %xmm0, %eax ; AVX2-NEXT: xorl %ecx, %ecx ; AVX2-NEXT: cmpl $15, %eax -; AVX2-NEXT: movl $-1, %eax -; AVX2-NEXT: cmovnel %ecx, %eax -; AVX2-NEXT: cltq +; AVX2-NEXT: movq $-1, %rax +; AVX2-NEXT: cmovneq %rcx, %rax ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ;