| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=SDAG-X64 | |
| ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=SDAG-X64 | |
| ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=FAST-X64 | |
| ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=FAST-X64 | |
| ; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=GISEL-X64 | |
| ; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=GISEL-X64 | |
| ; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=SDAG-X86 | |
| ; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=SDAG-X86-CMOV | |
| ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=FAST-X86 | |
| ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=FAST-X86-CMOV | |
| ; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=GISEL-X86 | |
| ; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=GISEL-X86-CMOV | |
| ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+ndd | FileCheck %s --check-prefix=NDD | |
| ; Test conditional move for the supported types (i16, i32, and i32) and | |
| ; conditon input (argument or cmp). | |
| ; When cmov is not available (i8 type or X86), the branch is expected. | |
| define zeroext i8 @select_cmov_i8(i1 zeroext %cond, i8 zeroext %a, i8 zeroext %b) { | |
| ; SDAG-X64-LABEL: select_cmov_i8: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movl %esi, %eax | |
| ; SDAG-X64-NEXT: testl %edi, %edi | |
| ; SDAG-X64-NEXT: cmovel %edx, %eax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmov_i8: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: testb $1, %dil | |
| ; FAST-X64-NEXT: jne LBB0_2 | |
| ; FAST-X64-NEXT: ## %bb.1: | |
| ; FAST-X64-NEXT: movl %edx, %esi | |
| ; FAST-X64-NEXT: LBB0_2: | |
| ; FAST-X64-NEXT: movzbl %sil, %eax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmov_i8: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movl %edx, %eax | |
| ; GISEL-X64-NEXT: testl %edi, %edi | |
| ; GISEL-X64-NEXT: cmovnew %si, %ax | |
| ; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmov_i8: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-NEXT: jne LBB0_1 | |
| ; SDAG-X86-NEXT: ## %bb.2: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movzbl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; SDAG-X86-NEXT: LBB0_1: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movzbl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmov_i8: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: movzbl (%ecx), %eax | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmov_i8: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-NEXT: jne LBB0_1 | |
| ; FAST-X86-NEXT: ## %bb.2: | |
| ; FAST-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: movzbl %al, %eax | |
| ; FAST-X86-NEXT: retl | |
| ; FAST-X86-NEXT: LBB0_1: | |
| ; FAST-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: movzbl %al, %eax | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmov_i8: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-CMOV-NEXT: jne LBB0_1 | |
| ; FAST-X86-CMOV-NEXT: ## %bb.2: | |
| ; FAST-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: movzbl %al, %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; FAST-X86-CMOV-NEXT: LBB0_1: | |
| ; FAST-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: movzbl %al, %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmov_i8: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: testl %eax, %eax | |
| ; GISEL-X86-NEXT: je LBB0_1 | |
| ; GISEL-X86-NEXT: ## %bb.2: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: ## kill: def $al killed $al killed $eax | |
| ; GISEL-X86-NEXT: retl | |
| ; GISEL-X86-NEXT: LBB0_1: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: ## kill: def $al killed $al killed $eax | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmov_i8: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-CMOV-NEXT: cmovnew %dx, %ax | |
| ; GISEL-X86-CMOV-NEXT: ## kill: def $al killed $al killed $eax | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmov_i8: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: testb $1, %dil | |
| ; NDD-NEXT: jne LBB0_2 | |
| ; NDD-NEXT: ## %bb.1: | |
| ; NDD-NEXT: movl %edx, %esi | |
| ; NDD-NEXT: LBB0_2: | |
| ; NDD-NEXT: movzbl %sil, %eax | |
| ; NDD-NEXT: retq | |
| %1 = select i1 %cond, i8 %a, i8 %b | |
| ret i8 %1 | |
| } | |
| define zeroext i16 @select_cmov_i16(i1 zeroext %cond, i16 zeroext %a, i16 zeroext %b) { | |
| ; SDAG-X64-LABEL: select_cmov_i16: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movl %esi, %eax | |
| ; SDAG-X64-NEXT: testl %edi, %edi | |
| ; SDAG-X64-NEXT: cmovel %edx, %eax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmov_i16: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: testb $1, %dil | |
| ; FAST-X64-NEXT: cmovew %dx, %si | |
| ; FAST-X64-NEXT: movzwl %si, %eax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmov_i16: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movl %edx, %eax | |
| ; GISEL-X64-NEXT: testl %edi, %edi | |
| ; GISEL-X64-NEXT: cmovnew %si, %ax | |
| ; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmov_i16: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-NEXT: jne LBB1_1 | |
| ; SDAG-X86-NEXT: ## %bb.2: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movzwl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; SDAG-X86-NEXT: LBB1_1: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movzwl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmov_i16: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: movzwl (%ecx), %eax | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmov_i16: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-NEXT: jne LBB1_1 | |
| ; FAST-X86-NEXT: ## %bb.2: | |
| ; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: movzwl %ax, %eax | |
| ; FAST-X86-NEXT: retl | |
| ; FAST-X86-NEXT: LBB1_1: | |
| ; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: movzwl %ax, %eax | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmov_i16: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-CMOV-NEXT: cmovew {{[0-9]+}}(%esp), %ax | |
| ; FAST-X86-CMOV-NEXT: movzwl %ax, %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmov_i16: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: testl %eax, %eax | |
| ; GISEL-X86-NEXT: je LBB1_1 | |
| ; GISEL-X86-NEXT: ## %bb.2: | |
| ; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X86-NEXT: retl | |
| ; GISEL-X86-NEXT: LBB1_1: | |
| ; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmov_i16: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-CMOV-NEXT: cmovnew %dx, %ax | |
| ; GISEL-X86-CMOV-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmov_i16: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: testb $1, %dil | |
| ; NDD-NEXT: cmovnew %si, %dx, %ax | |
| ; NDD-NEXT: movzwl %ax, %eax | |
| ; NDD-NEXT: retq | |
| %1 = select i1 %cond, i16 %a, i16 %b | |
| ret i16 %1 | |
| } | |
| define zeroext i16 @select_cmp_cmov_i16(i16 zeroext %a, i16 zeroext %b) { | |
| ; SDAG-X64-LABEL: select_cmp_cmov_i16: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movl %esi, %eax | |
| ; SDAG-X64-NEXT: cmpw %ax, %di | |
| ; SDAG-X64-NEXT: cmovbl %edi, %eax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmp_cmov_i16: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: cmpw %si, %di | |
| ; FAST-X64-NEXT: cmovbw %di, %si | |
| ; FAST-X64-NEXT: movzwl %si, %eax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmp_cmov_i16: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movl %edi, %eax | |
| ; GISEL-X64-NEXT: xorl %ecx, %ecx | |
| ; GISEL-X64-NEXT: cmpw %si, %ax | |
| ; GISEL-X64-NEXT: setb %cl | |
| ; GISEL-X64-NEXT: andl $1, %ecx | |
| ; GISEL-X64-NEXT: cmovew %si, %ax | |
| ; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmp_cmov_i16: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: cmpw %cx, %ax | |
| ; SDAG-X86-NEXT: jb LBB2_2 | |
| ; SDAG-X86-NEXT: ## %bb.1: | |
| ; SDAG-X86-NEXT: movl %ecx, %eax | |
| ; SDAG-X86-NEXT: LBB2_2: | |
| ; SDAG-X86-NEXT: movzwl %ax, %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i16: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmpw %ax, %cx | |
| ; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax | |
| ; SDAG-X86-CMOV-NEXT: movzwl %ax, %eax | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmp_cmov_i16: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: cmpw %cx, %ax | |
| ; FAST-X86-NEXT: jb LBB2_2 | |
| ; FAST-X86-NEXT: ## %bb.1: | |
| ; FAST-X86-NEXT: movl %ecx, %eax | |
| ; FAST-X86-NEXT: LBB2_2: | |
| ; FAST-X86-NEXT: movzwl %ax, %eax | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmp_cmov_i16: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-CMOV-NEXT: cmpw %ax, %cx | |
| ; FAST-X86-CMOV-NEXT: cmovbw %cx, %ax | |
| ; FAST-X86-CMOV-NEXT: movzwl %ax, %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmp_cmov_i16: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: xorl %edx, %edx | |
| ; GISEL-X86-NEXT: cmpw %ax, %cx | |
| ; GISEL-X86-NEXT: setb %dl | |
| ; GISEL-X86-NEXT: andl $1, %edx | |
| ; GISEL-X86-NEXT: je LBB2_2 | |
| ; GISEL-X86-NEXT: ## %bb.1: | |
| ; GISEL-X86-NEXT: movl %ecx, %eax | |
| ; GISEL-X86-NEXT: LBB2_2: | |
| ; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i16: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: xorl %edx, %edx | |
| ; GISEL-X86-CMOV-NEXT: cmpw %cx, %ax | |
| ; GISEL-X86-CMOV-NEXT: setb %dl | |
| ; GISEL-X86-CMOV-NEXT: andl $1, %edx | |
| ; GISEL-X86-CMOV-NEXT: cmovew %cx, %ax | |
| ; GISEL-X86-CMOV-NEXT: ## kill: def $ax killed $ax killed $eax | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmp_cmov_i16: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: cmpw %si, %di | |
| ; NDD-NEXT: cmovbw %di, %si, %ax | |
| ; NDD-NEXT: movzwl %ax, %eax | |
| ; NDD-NEXT: retq | |
| %1 = icmp ult i16 %a, %b | |
| %2 = select i1 %1, i16 %a, i16 %b | |
| ret i16 %2 | |
| } | |
| define i32 @select_cmov_i32(i1 zeroext %cond, i32 %a, i32 %b) { | |
| ; SDAG-X64-LABEL: select_cmov_i32: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movl %esi, %eax | |
| ; SDAG-X64-NEXT: testl %edi, %edi | |
| ; SDAG-X64-NEXT: cmovel %edx, %eax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmov_i32: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: movl %esi, %eax | |
| ; FAST-X64-NEXT: testb $1, %dil | |
| ; FAST-X64-NEXT: cmovel %edx, %eax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmov_i32: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movl %edx, %eax | |
| ; GISEL-X64-NEXT: testl %edi, %edi | |
| ; GISEL-X64-NEXT: cmovnel %esi, %eax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmov_i32: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-NEXT: jne LBB3_1 | |
| ; SDAG-X86-NEXT: ## %bb.2: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; SDAG-X86-NEXT: LBB3_1: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movl (%eax), %eax | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmov_i32: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: movl (%ecx), %eax | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmov_i32: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-NEXT: jne LBB3_1 | |
| ; FAST-X86-NEXT: ## %bb.2: | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: retl | |
| ; FAST-X86-NEXT: LBB3_1: | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmov_i32: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmov_i32: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: testl %eax, %eax | |
| ; GISEL-X86-NEXT: je LBB3_1 | |
| ; GISEL-X86-NEXT: ## %bb.2: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: retl | |
| ; GISEL-X86-NEXT: LBB3_1: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmov_i32: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmov_i32: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: testb $1, %dil | |
| ; NDD-NEXT: cmovnel %esi, %edx, %eax | |
| ; NDD-NEXT: retq | |
| %1 = select i1 %cond, i32 %a, i32 %b | |
| ret i32 %1 | |
| } | |
| define i32 @select_cmp_cmov_i32(i32 %a, i32 %b) { | |
| ; SDAG-X64-LABEL: select_cmp_cmov_i32: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movl %esi, %eax | |
| ; SDAG-X64-NEXT: cmpl %esi, %edi | |
| ; SDAG-X64-NEXT: cmovbl %edi, %eax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmp_cmov_i32: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: movl %esi, %eax | |
| ; FAST-X64-NEXT: cmpl %esi, %edi | |
| ; FAST-X64-NEXT: cmovbl %edi, %eax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmp_cmov_i32: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movl %edi, %eax | |
| ; GISEL-X64-NEXT: xorl %ecx, %ecx | |
| ; GISEL-X64-NEXT: cmpl %esi, %edi | |
| ; GISEL-X64-NEXT: setb %cl | |
| ; GISEL-X64-NEXT: andl $1, %ecx | |
| ; GISEL-X64-NEXT: cmovel %esi, %eax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmp_cmov_i32: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: cmpl %ecx, %eax | |
| ; SDAG-X86-NEXT: jb LBB4_2 | |
| ; SDAG-X86-NEXT: ## %bb.1: | |
| ; SDAG-X86-NEXT: movl %ecx, %eax | |
| ; SDAG-X86-NEXT: LBB4_2: | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i32: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmpl %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmp_cmov_i32: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: cmpl %ecx, %eax | |
| ; FAST-X86-NEXT: jb LBB4_2 | |
| ; FAST-X86-NEXT: ## %bb.1: | |
| ; FAST-X86-NEXT: movl %ecx, %eax | |
| ; FAST-X86-NEXT: LBB4_2: | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmp_cmov_i32: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-CMOV-NEXT: cmpl %eax, %ecx | |
| ; FAST-X86-CMOV-NEXT: cmovbl %ecx, %eax | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmp_cmov_i32: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: xorl %edx, %edx | |
| ; GISEL-X86-NEXT: cmpl %eax, %ecx | |
| ; GISEL-X86-NEXT: setb %dl | |
| ; GISEL-X86-NEXT: andl $1, %edx | |
| ; GISEL-X86-NEXT: je LBB4_2 | |
| ; GISEL-X86-NEXT: ## %bb.1: | |
| ; GISEL-X86-NEXT: movl %ecx, %eax | |
| ; GISEL-X86-NEXT: LBB4_2: | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i32: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: xorl %edx, %edx | |
| ; GISEL-X86-CMOV-NEXT: cmpl %ecx, %eax | |
| ; GISEL-X86-CMOV-NEXT: setb %dl | |
| ; GISEL-X86-CMOV-NEXT: andl $1, %edx | |
| ; GISEL-X86-CMOV-NEXT: cmovel %ecx, %eax | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmp_cmov_i32: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: cmpl %esi, %edi | |
| ; NDD-NEXT: cmovbl %edi, %esi, %eax | |
| ; NDD-NEXT: retq | |
| %1 = icmp ult i32 %a, %b | |
| %2 = select i1 %1, i32 %a, i32 %b | |
| ret i32 %2 | |
| } | |
| define i64 @select_cmov_i64(i1 zeroext %cond, i64 %a, i64 %b) { | |
| ; SDAG-X64-LABEL: select_cmov_i64: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movq %rsi, %rax | |
| ; SDAG-X64-NEXT: testl %edi, %edi | |
| ; SDAG-X64-NEXT: cmoveq %rdx, %rax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmov_i64: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: movq %rsi, %rax | |
| ; FAST-X64-NEXT: testb $1, %dil | |
| ; FAST-X64-NEXT: cmoveq %rdx, %rax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmov_i64: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movq %rdx, %rax | |
| ; GISEL-X64-NEXT: testl %edi, %edi | |
| ; GISEL-X64-NEXT: cmovneq %rsi, %rax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmov_i64: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-NEXT: jne LBB5_1 | |
| ; SDAG-X86-NEXT: ## %bb.2: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-NEXT: jmp LBB5_3 | |
| ; SDAG-X86-NEXT: LBB5_1: | |
| ; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-NEXT: LBB5_3: | |
| ; SDAG-X86-NEXT: movl (%ecx), %eax | |
| ; SDAG-X86-NEXT: movl 4(%ecx), %edx | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmov_i64: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: movl (%ecx), %eax | |
| ; SDAG-X86-CMOV-NEXT: movl 4(%ecx), %edx | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmov_i64: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp) | |
| ; FAST-X86-NEXT: jne LBB5_1 | |
| ; FAST-X86-NEXT: ## %bb.2: | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: retl | |
| ; FAST-X86-NEXT: LBB5_1: | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmov_i64: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp) | |
| ; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmov_i64: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-NEXT: je LBB5_1 | |
| ; GISEL-X86-NEXT: ## %bb.2: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-NEXT: jne LBB5_5 | |
| ; GISEL-X86-NEXT: LBB5_4: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-NEXT: retl | |
| ; GISEL-X86-NEXT: LBB5_1: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-NEXT: je LBB5_4 | |
| ; GISEL-X86-NEXT: LBB5_5: | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmov_i64: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmov_i64: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: testb $1, %dil | |
| ; NDD-NEXT: cmovneq %rsi, %rdx, %rax | |
| ; NDD-NEXT: retq | |
| %1 = select i1 %cond, i64 %a, i64 %b | |
| ret i64 %1 | |
| } | |
| define i64 @select_cmp_cmov_i64(i64 %a, i64 %b) nounwind { | |
| ; SDAG-X64-LABEL: select_cmp_cmov_i64: | |
| ; SDAG-X64: ## %bb.0: | |
| ; SDAG-X64-NEXT: movq %rsi, %rax | |
| ; SDAG-X64-NEXT: cmpq %rsi, %rdi | |
| ; SDAG-X64-NEXT: cmovbq %rdi, %rax | |
| ; SDAG-X64-NEXT: retq | |
| ; | |
| ; FAST-X64-LABEL: select_cmp_cmov_i64: | |
| ; FAST-X64: ## %bb.0: | |
| ; FAST-X64-NEXT: movq %rsi, %rax | |
| ; FAST-X64-NEXT: cmpq %rsi, %rdi | |
| ; FAST-X64-NEXT: cmovbq %rdi, %rax | |
| ; FAST-X64-NEXT: retq | |
| ; | |
| ; GISEL-X64-LABEL: select_cmp_cmov_i64: | |
| ; GISEL-X64: ## %bb.0: | |
| ; GISEL-X64-NEXT: movq %rdi, %rax | |
| ; GISEL-X64-NEXT: xorl %ecx, %ecx | |
| ; GISEL-X64-NEXT: cmpq %rsi, %rdi | |
| ; GISEL-X64-NEXT: setb %cl | |
| ; GISEL-X64-NEXT: andl $1, %ecx | |
| ; GISEL-X64-NEXT: cmoveq %rsi, %rax | |
| ; GISEL-X64-NEXT: retq | |
| ; | |
| ; SDAG-X86-LABEL: select_cmp_cmov_i64: | |
| ; SDAG-X86: ## %bb.0: | |
| ; SDAG-X86-NEXT: pushl %edi | |
| ; SDAG-X86-NEXT: pushl %esi | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; SDAG-X86-NEXT: cmpl %ecx, %eax | |
| ; SDAG-X86-NEXT: movl %edx, %edi | |
| ; SDAG-X86-NEXT: sbbl %esi, %edi | |
| ; SDAG-X86-NEXT: jb LBB6_2 | |
| ; SDAG-X86-NEXT: ## %bb.1: | |
| ; SDAG-X86-NEXT: movl %ecx, %eax | |
| ; SDAG-X86-NEXT: movl %esi, %edx | |
| ; SDAG-X86-NEXT: LBB6_2: | |
| ; SDAG-X86-NEXT: popl %esi | |
| ; SDAG-X86-NEXT: popl %edi | |
| ; SDAG-X86-NEXT: retl | |
| ; | |
| ; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i64: | |
| ; SDAG-X86-CMOV: ## %bb.0: | |
| ; SDAG-X86-CMOV-NEXT: pushl %edi | |
| ; SDAG-X86-CMOV-NEXT: pushl %esi | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; SDAG-X86-CMOV-NEXT: cmpl %eax, %ecx | |
| ; SDAG-X86-CMOV-NEXT: movl %esi, %edi | |
| ; SDAG-X86-CMOV-NEXT: sbbl %edx, %edi | |
| ; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax | |
| ; SDAG-X86-CMOV-NEXT: cmovbl %esi, %edx | |
| ; SDAG-X86-CMOV-NEXT: popl %esi | |
| ; SDAG-X86-CMOV-NEXT: popl %edi | |
| ; SDAG-X86-CMOV-NEXT: retl | |
| ; | |
| ; FAST-X86-LABEL: select_cmp_cmov_i64: | |
| ; FAST-X86: ## %bb.0: | |
| ; FAST-X86-NEXT: pushl %edi | |
| ; FAST-X86-NEXT: pushl %esi | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-NEXT: cmpl %esi, %eax | |
| ; FAST-X86-NEXT: movl %edx, %edi | |
| ; FAST-X86-NEXT: sbbl %ecx, %edi | |
| ; FAST-X86-NEXT: jb LBB6_2 | |
| ; FAST-X86-NEXT: ## %bb.1: | |
| ; FAST-X86-NEXT: movl %esi, %eax | |
| ; FAST-X86-NEXT: movl %ecx, %edx | |
| ; FAST-X86-NEXT: LBB6_2: | |
| ; FAST-X86-NEXT: popl %esi | |
| ; FAST-X86-NEXT: popl %edi | |
| ; FAST-X86-NEXT: retl | |
| ; | |
| ; FAST-X86-CMOV-LABEL: select_cmp_cmov_i64: | |
| ; FAST-X86-CMOV: ## %bb.0: | |
| ; FAST-X86-CMOV-NEXT: pushl %edi | |
| ; FAST-X86-CMOV-NEXT: pushl %esi | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; FAST-X86-CMOV-NEXT: cmpl %eax, %esi | |
| ; FAST-X86-CMOV-NEXT: movl %ecx, %edi | |
| ; FAST-X86-CMOV-NEXT: sbbl %edx, %edi | |
| ; FAST-X86-CMOV-NEXT: cmovbl %esi, %eax | |
| ; FAST-X86-CMOV-NEXT: cmovbl %ecx, %edx | |
| ; FAST-X86-CMOV-NEXT: popl %esi | |
| ; FAST-X86-CMOV-NEXT: popl %edi | |
| ; FAST-X86-CMOV-NEXT: retl | |
| ; | |
| ; GISEL-X86-LABEL: select_cmp_cmov_i64: | |
| ; GISEL-X86: ## %bb.0: | |
| ; GISEL-X86-NEXT: pushl %ebp | |
| ; GISEL-X86-NEXT: pushl %ebx | |
| ; GISEL-X86-NEXT: pushl %edi | |
| ; GISEL-X86-NEXT: pushl %esi | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-NEXT: cmpl %eax, %esi | |
| ; GISEL-X86-NEXT: setb %bl | |
| ; GISEL-X86-NEXT: xorl %ecx, %ecx | |
| ; GISEL-X86-NEXT: cmpl %edx, %ebp | |
| ; GISEL-X86-NEXT: setb %bh | |
| ; GISEL-X86-NEXT: sete %cl | |
| ; GISEL-X86-NEXT: testl %ecx, %ecx | |
| ; GISEL-X86-NEXT: je LBB6_2 | |
| ; GISEL-X86-NEXT: ## %bb.1: | |
| ; GISEL-X86-NEXT: movb %bl, %bh | |
| ; GISEL-X86-NEXT: LBB6_2: | |
| ; GISEL-X86-NEXT: movzbl %bh, %edi | |
| ; GISEL-X86-NEXT: andl $1, %edi | |
| ; GISEL-X86-NEXT: je LBB6_4 | |
| ; GISEL-X86-NEXT: ## %bb.3: | |
| ; GISEL-X86-NEXT: movl %esi, %eax | |
| ; GISEL-X86-NEXT: LBB6_4: | |
| ; GISEL-X86-NEXT: testl %edi, %edi | |
| ; GISEL-X86-NEXT: je LBB6_6 | |
| ; GISEL-X86-NEXT: ## %bb.5: | |
| ; GISEL-X86-NEXT: movl %ebp, %edx | |
| ; GISEL-X86-NEXT: LBB6_6: | |
| ; GISEL-X86-NEXT: popl %esi | |
| ; GISEL-X86-NEXT: popl %edi | |
| ; GISEL-X86-NEXT: popl %ebx | |
| ; GISEL-X86-NEXT: popl %ebp | |
| ; GISEL-X86-NEXT: retl | |
| ; | |
| ; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i64: | |
| ; GISEL-X86-CMOV: ## %bb.0: | |
| ; GISEL-X86-CMOV-NEXT: pushl %ebp | |
| ; GISEL-X86-CMOV-NEXT: pushl %ebx | |
| ; GISEL-X86-CMOV-NEXT: pushl %edi | |
| ; GISEL-X86-CMOV-NEXT: pushl %esi | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ebp | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edi | |
| ; GISEL-X86-CMOV-NEXT: xorl %ecx, %ecx | |
| ; GISEL-X86-CMOV-NEXT: cmpl %esi, %ebp | |
| ; GISEL-X86-CMOV-NEXT: setb %cl | |
| ; GISEL-X86-CMOV-NEXT: xorl %ebx, %ebx | |
| ; GISEL-X86-CMOV-NEXT: xorl %eax, %eax | |
| ; GISEL-X86-CMOV-NEXT: cmpl %edi, %edx | |
| ; GISEL-X86-CMOV-NEXT: setb %bl | |
| ; GISEL-X86-CMOV-NEXT: sete %al | |
| ; GISEL-X86-CMOV-NEXT: testl %eax, %eax | |
| ; GISEL-X86-CMOV-NEXT: cmovnew %cx, %bx | |
| ; GISEL-X86-CMOV-NEXT: andl $1, %ebx | |
| ; GISEL-X86-CMOV-NEXT: cmovel %esi, %ebp | |
| ; GISEL-X86-CMOV-NEXT: cmovel %edi, %edx | |
| ; GISEL-X86-CMOV-NEXT: movl %ebp, %eax | |
| ; GISEL-X86-CMOV-NEXT: popl %esi | |
| ; GISEL-X86-CMOV-NEXT: popl %edi | |
| ; GISEL-X86-CMOV-NEXT: popl %ebx | |
| ; GISEL-X86-CMOV-NEXT: popl %ebp | |
| ; GISEL-X86-CMOV-NEXT: retl | |
| ; | |
| ; NDD-LABEL: select_cmp_cmov_i64: | |
| ; NDD: ## %bb.0: | |
| ; NDD-NEXT: cmpq %rsi, %rdi | |
| ; NDD-NEXT: cmovbq %rdi, %rsi, %rax | |
| ; NDD-NEXT: retq | |
| %1 = icmp ult i64 %a, %b | |
| %2 = select i1 %1, i64 %a, i64 %b | |
| ret i64 %2 | |
| } | |