diff options
Diffstat (limited to 'llvm/test/CodeGen/X86/clz.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/clz.ll | 196 |
1 files changed, 110 insertions, 86 deletions
diff --git a/llvm/test/CodeGen/X86/clz.ll b/llvm/test/CodeGen/X86/clz.ll index 40bbac220ec..cffc6732728 100644 --- a/llvm/test/CodeGen/X86/clz.ll +++ b/llvm/test/CodeGen/X86/clz.ll @@ -279,28 +279,32 @@ define i64 @ctlz_i64(i64 %x) { define i8 @ctlz_i8_zero_test(i8 %n) { ; X32-LABEL: ctlz_i8_zero_test: ; X32: # BB#0: -; X32-NEXT: movb {{[0-9]+}}(%esp), %cl -; X32-NEXT: movb $8, %al -; X32-NEXT: testb %cl, %cl -; X32-NEXT: je .LBB8_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: movzbl %cl, %eax +; X32-NEXT: movb {{[0-9]+}}(%esp), %al +; X32-NEXT: testb %al, %al +; X32-NEXT: je .LBB8_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: movzbl %al, %eax ; X32-NEXT: bsrl %eax, %eax ; X32-NEXT: xorl $7, %eax -; X32-NEXT: .LBB8_2: # %cond.end +; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> +; X32-NEXT: retl +; X32-NEXT: .LBB8_1: +; X32-NEXT: movb $8, %al ; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; X32-NEXT: retl ; ; X64-LABEL: ctlz_i8_zero_test: ; X64: # BB#0: -; X64-NEXT: movb $8, %al ; X64-NEXT: testb %dil, %dil -; X64-NEXT: je .LBB8_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB8_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: movzbl %dil, %eax ; X64-NEXT: bsrl %eax, %eax ; X64-NEXT: xorl $7, %eax -; X64-NEXT: .LBB8_2: # %cond.end +; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> +; X64-NEXT: retq +; X64-NEXT: .LBB8_1: +; X64-NEXT: movb $8, %al ; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; X64-NEXT: retq ; @@ -327,26 +331,30 @@ define i8 @ctlz_i8_zero_test(i8 %n) { define i16 @ctlz_i16_zero_test(i16 %n) { ; X32-LABEL: ctlz_i16_zero_test: ; X32: # BB#0: -; X32-NEXT: movzwl {{[0-9]+}}(%esp), %ecx -; X32-NEXT: movw $16, %ax -; X32-NEXT: testw %cx, %cx -; X32-NEXT: je .LBB9_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsrw %cx, %ax +; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X32-NEXT: testw %ax, %ax +; X32-NEXT: je .LBB9_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsrw %ax, %ax ; X32-NEXT: xorl $15, %eax -; X32-NEXT: .LBB9_2: # %cond.end +; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> +; X32-NEXT: retl +; X32-NEXT: .LBB9_1: +; X32-NEXT: movw $16, %ax ; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> ; X32-NEXT: retl ; ; X64-LABEL: ctlz_i16_zero_test: ; X64: # BB#0: -; X64-NEXT: movw $16, %ax ; X64-NEXT: testw %di, %di -; X64-NEXT: je .LBB9_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB9_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsrw %di, %ax ; X64-NEXT: xorl $15, %eax -; X64-NEXT: .LBB9_2: # %cond.end +; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> +; X64-NEXT: retq +; X64-NEXT: .LBB9_1: +; X64-NEXT: movw $16, %ax ; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> ; X64-NEXT: retq ; @@ -367,25 +375,27 @@ define i16 @ctlz_i16_zero_test(i16 %n) { define i32 @ctlz_i32_zero_test(i32 %n) { ; X32-LABEL: ctlz_i32_zero_test: ; X32: # BB#0: -; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X32-NEXT: movl $32, %eax -; X32-NEXT: testl %ecx, %ecx -; X32-NEXT: je .LBB10_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsrl %ecx, %eax +; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: testl %eax, %eax +; X32-NEXT: je .LBB10_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsrl %eax, %eax ; X32-NEXT: xorl $31, %eax -; X32-NEXT: .LBB10_2: # %cond.end +; X32-NEXT: retl +; X32-NEXT: .LBB10_1: +; X32-NEXT: movl $32, %eax ; X32-NEXT: retl ; ; X64-LABEL: ctlz_i32_zero_test: ; X64: # BB#0: -; X64-NEXT: movl $32, %eax ; X64-NEXT: testl %edi, %edi -; X64-NEXT: je .LBB10_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB10_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsrl %edi, %eax ; X64-NEXT: xorl $31, %eax -; X64-NEXT: .LBB10_2: # %cond.end +; X64-NEXT: retq +; X64-NEXT: .LBB10_1: +; X64-NEXT: movl $32, %eax ; X64-NEXT: retq ; ; X32-CLZ-LABEL: ctlz_i32_zero_test: @@ -464,26 +474,30 @@ define i64 @ctlz_i64_zero_test(i64 %n) { define i8 @cttz_i8_zero_test(i8 %n) { ; X32-LABEL: cttz_i8_zero_test: ; X32: # BB#0: -; X32-NEXT: movb {{[0-9]+}}(%esp), %cl -; X32-NEXT: movb $8, %al -; X32-NEXT: testb %cl, %cl -; X32-NEXT: je .LBB12_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: movzbl %cl, %eax +; X32-NEXT: movb {{[0-9]+}}(%esp), %al +; X32-NEXT: testb %al, %al +; X32-NEXT: je .LBB12_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: movzbl %al, %eax ; X32-NEXT: bsfl %eax, %eax -; X32-NEXT: .LBB12_2: # %cond.end +; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> +; X32-NEXT: retl +; X32-NEXT: .LBB12_1 +; X32-NEXT: movb $8, %al ; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; X32-NEXT: retl ; ; X64-LABEL: cttz_i8_zero_test: ; X64: # BB#0: -; X64-NEXT: movb $8, %al ; X64-NEXT: testb %dil, %dil -; X64-NEXT: je .LBB12_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB12_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: movzbl %dil, %eax ; X64-NEXT: bsfl %eax, %eax -; X64-NEXT: .LBB12_2: # %cond.end +; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> +; X64-NEXT: retq +; X64-NEXT: .LBB12_1: +; X64-NEXT: movb $8, %al ; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; X64-NEXT: retq ; @@ -510,23 +524,25 @@ define i8 @cttz_i8_zero_test(i8 %n) { define i16 @cttz_i16_zero_test(i16 %n) { ; X32-LABEL: cttz_i16_zero_test: ; X32: # BB#0: -; X32-NEXT: movzwl {{[0-9]+}}(%esp), %ecx +; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X32-NEXT: testw %ax, %ax +; X32-NEXT: je .LBB13_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsfw %ax, %ax +; X32-NEXT: retl +; X32-NEXT: .LBB13_1 ; X32-NEXT: movw $16, %ax -; X32-NEXT: testw %cx, %cx -; X32-NEXT: je .LBB13_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsfw %cx, %ax -; X32-NEXT: .LBB13_2: # %cond.end ; X32-NEXT: retl ; ; X64-LABEL: cttz_i16_zero_test: ; X64: # BB#0: -; X64-NEXT: movw $16, %ax ; X64-NEXT: testw %di, %di -; X64-NEXT: je .LBB13_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB13_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsfw %di, %ax -; X64-NEXT: .LBB13_2: # %cond.end +; X64-NEXT: retq +; X64-NEXT: .LBB13_1: +; X64-NEXT: movw $16, %ax ; X64-NEXT: retq ; ; X32-CLZ-LABEL: cttz_i16_zero_test: @@ -546,23 +562,25 @@ define i16 @cttz_i16_zero_test(i16 %n) { define i32 @cttz_i32_zero_test(i32 %n) { ; X32-LABEL: cttz_i32_zero_test: ; X32: # BB#0: -; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: testl %eax, %eax +; X32-NEXT: je .LBB14_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsfl %eax, %eax +; X32-NEXT: retl +; X32-NEXT: .LBB14_1 ; X32-NEXT: movl $32, %eax -; X32-NEXT: testl %ecx, %ecx -; X32-NEXT: je .LBB14_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsfl %ecx, %eax -; X32-NEXT: .LBB14_2: # %cond.end ; X32-NEXT: retl ; ; X64-LABEL: cttz_i32_zero_test: ; X64: # BB#0: -; X64-NEXT: movl $32, %eax ; X64-NEXT: testl %edi, %edi -; X64-NEXT: je .LBB14_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB14_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsfl %edi, %eax -; X64-NEXT: .LBB14_2: # %cond.end +; X64-NEXT: retq +; X64-NEXT: .LBB14_1: +; X64-NEXT: movl $32, %eax ; X64-NEXT: retq ; ; X32-CLZ-LABEL: cttz_i32_zero_test: @@ -642,25 +660,27 @@ define i64 @cttz_i64_zero_test(i64 %n) { define i32 @ctlz_i32_fold_cmov(i32 %n) { ; X32-LABEL: ctlz_i32_fold_cmov: ; X32: # BB#0: -; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X32-NEXT: orl $1, %ecx -; X32-NEXT: movl $32, %eax -; X32-NEXT: je .LBB16_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsrl %ecx, %eax +; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: orl $1, %eax +; X32-NEXT: je .LBB16_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsrl %eax, %eax ; X32-NEXT: xorl $31, %eax -; X32-NEXT: .LBB16_2: # %cond.end +; X32-NEXT: retl +; X32-NEXT: .LBB16_1 +; X32-NEXT: movl $32, %eax ; X32-NEXT: retl ; ; X64-LABEL: ctlz_i32_fold_cmov: ; X64: # BB#0: ; X64-NEXT: orl $1, %edi -; X64-NEXT: movl $32, %eax -; X64-NEXT: je .LBB16_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB16_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsrl %edi, %eax ; X64-NEXT: xorl $31, %eax -; X64-NEXT: .LBB16_2: # %cond.end +; X64-NEXT: retq +; X64-NEXT: .LBB16_1: +; X64-NEXT: movl $32, %eax ; X64-NEXT: retq ; ; X32-CLZ-LABEL: ctlz_i32_fold_cmov: @@ -716,26 +736,30 @@ define i32 @ctlz_bsr(i32 %n) { define i32 @ctlz_bsr_zero_test(i32 %n) { ; X32-LABEL: ctlz_bsr_zero_test: ; X32: # BB#0: -; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X32-NEXT: movl $32, %eax -; X32-NEXT: testl %ecx, %ecx -; X32-NEXT: je .LBB18_2 -; X32-NEXT: # BB#1: # %cond.false -; X32-NEXT: bsrl %ecx, %eax +; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: testl %eax, %eax +; X32-NEXT: je .LBB18_1 +; X32-NEXT: # BB#2: # %cond.false +; X32-NEXT: bsrl %eax, %eax ; X32-NEXT: xorl $31, %eax -; X32-NEXT: .LBB18_2: # %cond.end +; X32-NEXT: xorl $31, %eax +; X32-NEXT: retl +; X32-NEXT: .LBB18_1: +; X32-NEXT: movl $32, %eax ; X32-NEXT: xorl $31, %eax ; X32-NEXT: retl ; ; X64-LABEL: ctlz_bsr_zero_test: ; X64: # BB#0: -; X64-NEXT: movl $32, %eax ; X64-NEXT: testl %edi, %edi -; X64-NEXT: je .LBB18_2 -; X64-NEXT: # BB#1: # %cond.false +; X64-NEXT: je .LBB18_1 +; X64-NEXT: # BB#2: # %cond.false ; X64-NEXT: bsrl %edi, %eax ; X64-NEXT: xorl $31, %eax -; X64-NEXT: .LBB18_2: # %cond.end +; X64-NEXT: xorl $31, %eax +; X64-NEXT: retq +; X64-NEXT: .LBB18_1: +; X64-NEXT: movl $32, %eax ; X64-NEXT: xorl $31, %eax ; X64-NEXT: retq ; |