Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/test/CodeGen/X86/shift-amount-mod.ll
Show First 20 Lines • Show All 729 Lines • ▼ Show 20 Lines | |||||
;==============================================================================; | ;==============================================================================; | ||||
; subtraction from negated shift amount | ; subtraction from negated shift amount | ||||
define i32 @reg32_lshr_by_sub_from_negated(i32 %val, i32 %a, i32 %b) nounwind { | define i32 @reg32_lshr_by_sub_from_negated(i32 %val, i32 %a, i32 %b) nounwind { | ||||
; X32-LABEL: reg32_lshr_by_sub_from_negated: | ; X32-LABEL: reg32_lshr_by_sub_from_negated: | ||||
; X32: # %bb.0: | ; X32: # %bb.0: | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ||||
; X32-NEXT: movl $32, %ecx | ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: addl {{[0-9]+}}(%esp), %ecx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: negb %cl | ||||
; X32-NEXT: # kill: def $cl killed $cl killed $ecx | ; X32-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X32-NEXT: shrl %cl, %eax | ; X32-NEXT: shrl %cl, %eax | ||||
; X32-NEXT: retl | ; X32-NEXT: retl | ||||
; | ; | ||||
; X64-LABEL: reg32_lshr_by_sub_from_negated: | ; X64-LABEL: reg32_lshr_by_sub_from_negated: | ||||
; X64: # %bb.0: | ; X64: # %bb.0: | ||||
; X64-NEXT: # kill: def $edx killed $edx def $rdx | |||||
; X64-NEXT: # kill: def $esi killed $esi def $rsi | |||||
; X64-NEXT: movl %edi, %eax | ; X64-NEXT: movl %edi, %eax | ||||
; X64-NEXT: movl $32, %ecx | ; X64-NEXT: leal (%rsi,%rdx), %ecx | ||||
; X64-NEXT: subl %esi, %ecx | ; X64-NEXT: negb %cl | ||||
; X64-NEXT: subl %edx, %ecx | |||||
; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X64-NEXT: shrl %cl, %eax | ; X64-NEXT: shrl %cl, %eax | ||||
; X64-NEXT: retq | ; X64-NEXT: retq | ||||
%nega = sub i32 32, %a | %nega = sub i32 32, %a | ||||
%negasubb = sub i32 %nega, %b | %negasubb = sub i32 %nega, %b | ||||
%shifted = lshr i32 %val, %negasubb | %shifted = lshr i32 %val, %negasubb | ||||
ret i32 %shifted | ret i32 %shifted | ||||
} | } | ||||
define i64 @reg64_lshr_by_sub_from_negated(i64 %val, i64 %a, i64 %b) nounwind { | define i64 @reg64_lshr_by_sub_from_negated(i64 %val, i64 %a, i64 %b) nounwind { | ||||
; X32-LABEL: reg64_lshr_by_sub_from_negated: | ; X32-LABEL: reg64_lshr_by_sub_from_negated: | ||||
; X32: # %bb.0: | ; X32: # %bb.0: | ||||
; X32-NEXT: pushl %esi | ; X32-NEXT: pushl %esi | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %esi | ; X32-NEXT: movl {{[0-9]+}}(%esp), %esi | ||||
; X32-NEXT: movl $64, %ecx | ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: addl {{[0-9]+}}(%esp), %edx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: movb $64, %cl | ||||
; X32-NEXT: subb %dl, %cl | |||||
; X32-NEXT: movl %esi, %edx | ; X32-NEXT: movl %esi, %edx | ||||
; X32-NEXT: shrl %cl, %edx | ; X32-NEXT: shrl %cl, %edx | ||||
; X32-NEXT: shrdl %cl, %esi, %eax | ; X32-NEXT: shrdl %cl, %esi, %eax | ||||
; X32-NEXT: testb $32, %cl | ; X32-NEXT: testb $32, %cl | ||||
; X32-NEXT: je .LBB25_2 | ; X32-NEXT: je .LBB25_2 | ||||
; X32-NEXT: # %bb.1: | ; X32-NEXT: # %bb.1: | ||||
; X32-NEXT: movl %edx, %eax | ; X32-NEXT: movl %edx, %eax | ||||
; X32-NEXT: xorl %edx, %edx | ; X32-NEXT: xorl %edx, %edx | ||||
; X32-NEXT: .LBB25_2: | ; X32-NEXT: .LBB25_2: | ||||
; X32-NEXT: popl %esi | ; X32-NEXT: popl %esi | ||||
; X32-NEXT: retl | ; X32-NEXT: retl | ||||
; | ; | ||||
; X64-LABEL: reg64_lshr_by_sub_from_negated: | ; X64-LABEL: reg64_lshr_by_sub_from_negated: | ||||
; X64: # %bb.0: | ; X64: # %bb.0: | ||||
; X64-NEXT: movq %rdi, %rax | ; X64-NEXT: movq %rdi, %rax | ||||
; X64-NEXT: movl $64, %ecx | ; X64-NEXT: leal (%rdx,%rsi), %ecx | ||||
; X64-NEXT: subl %esi, %ecx | ; X64-NEXT: negb %cl | ||||
; X64-NEXT: subl %edx, %ecx | |||||
; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X64-NEXT: shrq %cl, %rax | ; X64-NEXT: shrq %cl, %rax | ||||
; X64-NEXT: retq | ; X64-NEXT: retq | ||||
%nega = sub i64 64, %a | %nega = sub i64 64, %a | ||||
%negasubb = sub i64 %nega, %b | %negasubb = sub i64 %nega, %b | ||||
%shifted = lshr i64 %val, %negasubb | %shifted = lshr i64 %val, %negasubb | ||||
ret i64 %shifted | ret i64 %shifted | ||||
} | } | ||||
▲ Show 20 Lines • Show All 309 Lines • ▼ Show 20 Lines | ; X64-NEXT: retq | ||||
%shifted = lshr i64 %val, %negaaddbitwidth | %shifted = lshr i64 %val, %negaaddbitwidth | ||||
ret i64 %shifted | ret i64 %shifted | ||||
} | } | ||||
define i32 @reg32_lshr_by_negated_unfolded_sub_b(i32 %val, i32 %a, i32 %b) nounwind { | define i32 @reg32_lshr_by_negated_unfolded_sub_b(i32 %val, i32 %a, i32 %b) nounwind { | ||||
; X32-LABEL: reg32_lshr_by_negated_unfolded_sub_b: | ; X32-LABEL: reg32_lshr_by_negated_unfolded_sub_b: | ||||
; X32: # %bb.0: | ; X32: # %bb.0: | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ||||
; X32-NEXT: xorl %ecx, %ecx | ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: addl {{[0-9]+}}(%esp), %ecx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: negb %cl | ||||
; X32-NEXT: # kill: def $cl killed $cl killed $ecx | ; X32-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X32-NEXT: shrl %cl, %eax | ; X32-NEXT: shrl %cl, %eax | ||||
; X32-NEXT: retl | ; X32-NEXT: retl | ||||
; | ; | ||||
; X64-LABEL: reg32_lshr_by_negated_unfolded_sub_b: | ; X64-LABEL: reg32_lshr_by_negated_unfolded_sub_b: | ||||
; X64: # %bb.0: | ; X64: # %bb.0: | ||||
; X64-NEXT: movl %esi, %ecx | ; X64-NEXT: # kill: def $edx killed $edx def $rdx | ||||
; X64-NEXT: # kill: def $esi killed $esi def $rsi | |||||
; X64-NEXT: movl %edi, %eax | ; X64-NEXT: movl %edi, %eax | ||||
; X64-NEXT: negl %ecx | ; X64-NEXT: leal (%rsi,%rdx), %ecx | ||||
; X64-NEXT: subl %edx, %ecx | ; X64-NEXT: negb %cl | ||||
; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X64-NEXT: shrl %cl, %eax | ; X64-NEXT: shrl %cl, %eax | ||||
; X64-NEXT: retq | ; X64-NEXT: retq | ||||
%nega = sub i32 0, %a | %nega = sub i32 0, %a | ||||
%negaaddbitwidth = add i32 %nega, 32 | %negaaddbitwidth = add i32 %nega, 32 | ||||
%negaaddbitwidthsubb = sub i32 %negaaddbitwidth, %b | %negaaddbitwidthsubb = sub i32 %negaaddbitwidth, %b | ||||
%shifted = lshr i32 %val, %negaaddbitwidthsubb | %shifted = lshr i32 %val, %negaaddbitwidthsubb | ||||
ret i32 %shifted | ret i32 %shifted | ||||
} | } | ||||
define i64 @reg64_lshr_by_negated_unfolded_sub_b(i64 %val, i64 %a, i64 %b) nounwind { | define i64 @reg64_lshr_by_negated_unfolded_sub_b(i64 %val, i64 %a, i64 %b) nounwind { | ||||
; X32-LABEL: reg64_lshr_by_negated_unfolded_sub_b: | ; X32-LABEL: reg64_lshr_by_negated_unfolded_sub_b: | ||||
; X32: # %bb.0: | ; X32: # %bb.0: | ||||
; X32-NEXT: pushl %esi | ; X32-NEXT: pushl %esi | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax | ||||
; X32-NEXT: movl {{[0-9]+}}(%esp), %esi | ; X32-NEXT: movl {{[0-9]+}}(%esp), %esi | ||||
; X32-NEXT: xorl %ecx, %ecx | ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: addl {{[0-9]+}}(%esp), %edx | ||||
; X32-NEXT: subl {{[0-9]+}}(%esp), %ecx | ; X32-NEXT: movb $64, %cl | ||||
; X32-NEXT: addb $64, %cl | ; X32-NEXT: subb %dl, %cl | ||||
; X32-NEXT: movl %esi, %edx | ; X32-NEXT: movl %esi, %edx | ||||
; X32-NEXT: shrl %cl, %edx | ; X32-NEXT: shrl %cl, %edx | ||||
; X32-NEXT: shrdl %cl, %esi, %eax | ; X32-NEXT: shrdl %cl, %esi, %eax | ||||
; X32-NEXT: testb $32, %cl | ; X32-NEXT: testb $32, %cl | ||||
; X32-NEXT: je .LBB37_2 | ; X32-NEXT: je .LBB37_2 | ||||
; X32-NEXT: # %bb.1: | ; X32-NEXT: # %bb.1: | ||||
; X32-NEXT: movl %edx, %eax | ; X32-NEXT: movl %edx, %eax | ||||
; X32-NEXT: xorl %edx, %edx | ; X32-NEXT: xorl %edx, %edx | ||||
; X32-NEXT: .LBB37_2: | ; X32-NEXT: .LBB37_2: | ||||
; X32-NEXT: popl %esi | ; X32-NEXT: popl %esi | ||||
; X32-NEXT: retl | ; X32-NEXT: retl | ||||
; | ; | ||||
; X64-LABEL: reg64_lshr_by_negated_unfolded_sub_b: | ; X64-LABEL: reg64_lshr_by_negated_unfolded_sub_b: | ||||
; X64: # %bb.0: | ; X64: # %bb.0: | ||||
; X64-NEXT: movq %rdi, %rax | ; X64-NEXT: movq %rdi, %rax | ||||
; X64-NEXT: movl $64, %ecx | ; X64-NEXT: leal (%rdx,%rsi), %ecx | ||||
; X64-NEXT: subl %esi, %ecx | ; X64-NEXT: negb %cl | ||||
; X64-NEXT: subl %edx, %ecx | |||||
; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ; X64-NEXT: # kill: def $cl killed $cl killed $ecx | ||||
; X64-NEXT: shrq %cl, %rax | ; X64-NEXT: shrq %cl, %rax | ||||
; X64-NEXT: retq | ; X64-NEXT: retq | ||||
%nega = sub i64 0, %a | %nega = sub i64 0, %a | ||||
%negaaddbitwidth = add i64 %nega, 64 | %negaaddbitwidth = add i64 %nega, 64 | ||||
%negaaddbitwidthsubb = sub i64 %negaaddbitwidth, %b | %negaaddbitwidthsubb = sub i64 %negaaddbitwidth, %b | ||||
%shifted = lshr i64 %val, %negaaddbitwidthsubb | %shifted = lshr i64 %val, %negaaddbitwidthsubb | ||||
ret i64 %shifted | ret i64 %shifted | ||||
▲ Show 20 Lines • Show All 385 Lines • Show Last 20 Lines |