| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86 |
| |
| ; Incremental updates of the instruction depths should be enough for this test |
| ; case. |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=haswell -machine-combiner-inc-threshold=0| FileCheck %s --check-prefix=X64-HSW |
| |
| ; Function Attrs: norecurse nounwind readnone uwtable |
| define i32 @mult(i32, i32) local_unnamed_addr #0 { |
| ; X86-LABEL: mult: |
| ; X86: # %bb.0: |
| ; X86-NEXT: pushl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: .cfi_offset %esi, -8 |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx |
| ; X86-NEXT: cmpl $1, %edx |
| ; X86-NEXT: movl $1, %eax |
| ; X86-NEXT: movl $1, %esi |
| ; X86-NEXT: jg .LBB0_2 |
| ; X86-NEXT: # %bb.1: |
| ; X86-NEXT: movl %edx, %esi |
| ; X86-NEXT: .LBB0_2: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx |
| ; X86-NEXT: testl %edx, %edx |
| ; X86-NEXT: je .LBB0_4 |
| ; X86-NEXT: # %bb.3: |
| ; X86-NEXT: movl %esi, %eax |
| ; X86-NEXT: .LBB0_4: |
| ; X86-NEXT: decl %ecx |
| ; X86-NEXT: cmpl $31, %ecx |
| ; X86-NEXT: ja .LBB0_39 |
| ; X86-NEXT: # %bb.5: |
| ; X86-NEXT: jmpl *.LJTI0_0(,%ecx,4) |
| ; X86-NEXT: .LBB0_6: |
| ; X86-NEXT: addl %eax, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_39: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: xorl %eax, %eax |
| ; X86-NEXT: .LBB0_40: |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_7: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_8: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: shll $2, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_9: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_10: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: addl %eax, %eax |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_11: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (,%eax,8), %ecx |
| ; X86-NEXT: jmp .LBB0_12 |
| ; X86-NEXT: .LBB0_13: |
| ; X86-NEXT: shll $3, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_14: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,8), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_15: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: addl %eax, %eax |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_16: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %ecx |
| ; X86-NEXT: leal (%eax,%ecx,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_17: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: shll $2, %eax |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_18: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,2), %ecx |
| ; X86-NEXT: leal (%eax,%ecx,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_19: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: movl %eax, %ecx |
| ; X86-NEXT: shll $4, %ecx |
| ; X86-NEXT: subl %eax, %ecx |
| ; X86-NEXT: jmp .LBB0_12 |
| ; X86-NEXT: .LBB0_21: |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_22: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: shll $4, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_23: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: movl %eax, %ecx |
| ; X86-NEXT: shll $4, %ecx |
| ; X86-NEXT: addl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_24: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: addl %eax, %eax |
| ; X86-NEXT: leal (%eax,%eax,8), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_25: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,8), %ecx |
| ; X86-NEXT: leal (%eax,%ecx,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_26: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: shll $2, %eax |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_27: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %ecx |
| ; X86-NEXT: leal (%eax,%ecx,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_28: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %ecx |
| ; X86-NEXT: leal (%eax,%ecx,4), %ecx |
| ; X86-NEXT: addl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_29: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,2), %ecx |
| ; X86-NEXT: shll $3, %ecx |
| ; X86-NEXT: jmp .LBB0_12 |
| ; X86-NEXT: .LBB0_30: |
| ; X86-NEXT: shll $3, %eax |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_31: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: leal (%eax,%eax,4), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_32: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,4), %ecx |
| ; X86-NEXT: leal (%ecx,%ecx,4), %ecx |
| ; X86-NEXT: addl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_33: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,8), %eax |
| ; X86-NEXT: leal (%eax,%eax,2), %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_34: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,8), %ecx |
| ; X86-NEXT: leal (%ecx,%ecx,2), %ecx |
| ; X86-NEXT: addl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_35: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: leal (%eax,%eax,8), %ecx |
| ; X86-NEXT: leal (%ecx,%ecx,2), %ecx |
| ; X86-NEXT: addl %eax, %ecx |
| ; X86-NEXT: addl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_36: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: movl %eax, %ecx |
| ; X86-NEXT: shll $5, %ecx |
| ; X86-NEXT: subl %eax, %ecx |
| ; X86-NEXT: jmp .LBB0_12 |
| ; X86-NEXT: .LBB0_37: |
| ; X86-NEXT: movl %eax, %ecx |
| ; X86-NEXT: shll $5, %ecx |
| ; X86-NEXT: .LBB0_12: |
| ; X86-NEXT: subl %eax, %ecx |
| ; X86-NEXT: movl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB0_38: |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: shll $5, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; |
| ; X64-HSW-LABEL: mult: |
| ; X64-HSW: # %bb.0: |
| ; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi |
| ; X64-HSW-NEXT: cmpl $1, %esi |
| ; X64-HSW-NEXT: movl $1, %ecx |
| ; X64-HSW-NEXT: movl %esi, %eax |
| ; X64-HSW-NEXT: cmovgl %ecx, %eax |
| ; X64-HSW-NEXT: testl %esi, %esi |
| ; X64-HSW-NEXT: cmovel %ecx, %eax |
| ; X64-HSW-NEXT: addl $-1, %edi |
| ; X64-HSW-NEXT: cmpl $31, %edi |
| ; X64-HSW-NEXT: ja .LBB0_36 |
| ; X64-HSW-NEXT: # %bb.1: |
| ; X64-HSW-NEXT: jmpq *.LJTI0_0(,%rdi,8) |
| ; X64-HSW-NEXT: .LBB0_2: |
| ; X64-HSW-NEXT: addl %eax, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_36: |
| ; X64-HSW-NEXT: xorl %eax, %eax |
| ; X64-HSW-NEXT: .LBB0_37: |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_3: |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_4: |
| ; X64-HSW-NEXT: shll $2, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_5: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_6: |
| ; X64-HSW-NEXT: addl %eax, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_7: |
| ; X64-HSW-NEXT: leal (,%rax,8), %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_8 |
| ; X64-HSW-NEXT: .LBB0_9: |
| ; X64-HSW-NEXT: shll $3, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_10: |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_11: |
| ; X64-HSW-NEXT: addl %eax, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_12: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx |
| ; X64-HSW-NEXT: leal (%rax,%rcx,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_13: |
| ; X64-HSW-NEXT: shll $2, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_14: |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %ecx |
| ; X64-HSW-NEXT: leal (%rax,%rcx,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_15: |
| ; X64-HSW-NEXT: movl %eax, %ecx |
| ; X64-HSW-NEXT: shll $4, %ecx |
| ; X64-HSW-NEXT: subl %eax, %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_8 |
| ; X64-HSW-NEXT: .LBB0_17: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_18: |
| ; X64-HSW-NEXT: shll $4, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_19: |
| ; X64-HSW-NEXT: movl %eax, %ecx |
| ; X64-HSW-NEXT: shll $4, %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_20 |
| ; X64-HSW-NEXT: .LBB0_21: |
| ; X64-HSW-NEXT: addl %eax, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_22: |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx |
| ; X64-HSW-NEXT: leal (%rax,%rcx,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_23: |
| ; X64-HSW-NEXT: shll $2, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_24: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx |
| ; X64-HSW-NEXT: leal (%rax,%rcx,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_25: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx |
| ; X64-HSW-NEXT: leal (%rax,%rcx,4), %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_20 |
| ; X64-HSW-NEXT: .LBB0_26: |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %ecx |
| ; X64-HSW-NEXT: shll $3, %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_8 |
| ; X64-HSW-NEXT: .LBB0_27: |
| ; X64-HSW-NEXT: shll $3, %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_28: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_29: |
| ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx |
| ; X64-HSW-NEXT: leal (%rcx,%rcx,4), %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_20 |
| ; X64-HSW-NEXT: .LBB0_30: |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %eax |
| ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_31: |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx |
| ; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_20 |
| ; X64-HSW-NEXT: .LBB0_32: |
| ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx |
| ; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx |
| ; X64-HSW-NEXT: addl %eax, %ecx |
| ; X64-HSW-NEXT: .LBB0_20: |
| ; X64-HSW-NEXT: addl %eax, %ecx |
| ; X64-HSW-NEXT: movl %ecx, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_33: |
| ; X64-HSW-NEXT: movl %eax, %ecx |
| ; X64-HSW-NEXT: shll $5, %ecx |
| ; X64-HSW-NEXT: subl %eax, %ecx |
| ; X64-HSW-NEXT: jmp .LBB0_8 |
| ; X64-HSW-NEXT: .LBB0_34: |
| ; X64-HSW-NEXT: movl %eax, %ecx |
| ; X64-HSW-NEXT: shll $5, %ecx |
| ; X64-HSW-NEXT: .LBB0_8: |
| ; X64-HSW-NEXT: subl %eax, %ecx |
| ; X64-HSW-NEXT: movl %ecx, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| ; X64-HSW-NEXT: .LBB0_35: |
| ; X64-HSW-NEXT: shll $5, %eax |
| ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-HSW-NEXT: retq |
| %3 = icmp eq i32 %1, 0 |
| %4 = icmp sgt i32 %1, 1 |
| %5 = or i1 %3, %4 |
| %6 = select i1 %5, i32 1, i32 %1 |
| switch i32 %0, label %69 [ |
| i32 1, label %70 |
| i32 2, label %7 |
| i32 3, label %9 |
| i32 4, label %11 |
| i32 5, label %13 |
| i32 6, label %15 |
| i32 7, label %17 |
| i32 8, label %19 |
| i32 9, label %21 |
| i32 10, label %23 |
| i32 11, label %25 |
| i32 12, label %27 |
| i32 13, label %29 |
| i32 14, label %31 |
| i32 15, label %33 |
| i32 16, label %35 |
| i32 17, label %37 |
| i32 18, label %39 |
| i32 19, label %41 |
| i32 20, label %43 |
| i32 21, label %45 |
| i32 22, label %47 |
| i32 23, label %49 |
| i32 24, label %51 |
| i32 25, label %53 |
| i32 26, label %55 |
| i32 27, label %57 |
| i32 28, label %59 |
| i32 29, label %61 |
| i32 30, label %63 |
| i32 31, label %65 |
| i32 32, label %67 |
| ] |
| |
| ; <label>:7: ; preds = %2 |
| %8 = shl nsw i32 %6, 1 |
| br label %70 |
| |
| ; <label>:9: ; preds = %2 |
| %10 = mul nsw i32 %6, 3 |
| br label %70 |
| |
| ; <label>:11: ; preds = %2 |
| %12 = shl nsw i32 %6, 2 |
| br label %70 |
| |
| ; <label>:13: ; preds = %2 |
| %14 = mul nsw i32 %6, 5 |
| br label %70 |
| |
| ; <label>:15: ; preds = %2 |
| %16 = mul nsw i32 %6, 6 |
| br label %70 |
| |
| ; <label>:17: ; preds = %2 |
| %18 = mul nsw i32 %6, 7 |
| br label %70 |
| |
| ; <label>:19: ; preds = %2 |
| %20 = shl nsw i32 %6, 3 |
| br label %70 |
| |
| ; <label>:21: ; preds = %2 |
| %22 = mul nsw i32 %6, 9 |
| br label %70 |
| |
| ; <label>:23: ; preds = %2 |
| %24 = mul nsw i32 %6, 10 |
| br label %70 |
| |
| ; <label>:25: ; preds = %2 |
| %26 = mul nsw i32 %6, 11 |
| br label %70 |
| |
| ; <label>:27: ; preds = %2 |
| %28 = mul nsw i32 %6, 12 |
| br label %70 |
| |
| ; <label>:29: ; preds = %2 |
| %30 = mul nsw i32 %6, 13 |
| br label %70 |
| |
| ; <label>:31: ; preds = %2 |
| %32 = mul nsw i32 %6, 14 |
| br label %70 |
| |
| ; <label>:33: ; preds = %2 |
| %34 = mul nsw i32 %6, 15 |
| br label %70 |
| |
| ; <label>:35: ; preds = %2 |
| %36 = shl nsw i32 %6, 4 |
| br label %70 |
| |
| ; <label>:37: ; preds = %2 |
| %38 = mul nsw i32 %6, 17 |
| br label %70 |
| |
| ; <label>:39: ; preds = %2 |
| %40 = mul nsw i32 %6, 18 |
| br label %70 |
| |
| ; <label>:41: ; preds = %2 |
| %42 = mul nsw i32 %6, 19 |
| br label %70 |
| |
| ; <label>:43: ; preds = %2 |
| %44 = mul nsw i32 %6, 20 |
| br label %70 |
| |
| ; <label>:45: ; preds = %2 |
| %46 = mul nsw i32 %6, 21 |
| br label %70 |
| |
| ; <label>:47: ; preds = %2 |
| %48 = mul nsw i32 %6, 22 |
| br label %70 |
| |
| ; <label>:49: ; preds = %2 |
| %50 = mul nsw i32 %6, 23 |
| br label %70 |
| |
| ; <label>:51: ; preds = %2 |
| %52 = mul nsw i32 %6, 24 |
| br label %70 |
| |
| ; <label>:53: ; preds = %2 |
| %54 = mul nsw i32 %6, 25 |
| br label %70 |
| |
| ; <label>:55: ; preds = %2 |
| %56 = mul nsw i32 %6, 26 |
| br label %70 |
| |
| ; <label>:57: ; preds = %2 |
| %58 = mul nsw i32 %6, 27 |
| br label %70 |
| |
| ; <label>:59: ; preds = %2 |
| %60 = mul nsw i32 %6, 28 |
| br label %70 |
| |
| ; <label>:61: ; preds = %2 |
| %62 = mul nsw i32 %6, 29 |
| br label %70 |
| |
| ; <label>:63: ; preds = %2 |
| %64 = mul nsw i32 %6, 30 |
| br label %70 |
| |
| ; <label>:65: ; preds = %2 |
| %66 = mul nsw i32 %6, 31 |
| br label %70 |
| |
| ; <label>:67: ; preds = %2 |
| %68 = shl nsw i32 %6, 5 |
| br label %70 |
| |
| ; <label>:69: ; preds = %2 |
| br label %70 |
| |
| ; <label>:70: ; preds = %2, %69, %67, %65, %63, %61, %59, %57, %55, %53, %51, %49, %47, %45, %43, %41, %39, %37, %35, %33, %31, %29, %27, %25, %23, %21, %19, %17, %15, %13, %11, %9, %7 |
| %71 = phi i32 [ %8, %7 ], [ %10, %9 ], [ %12, %11 ], [ %14, %13 ], [ %16, %15 ], [ %18, %17 ], [ %20, %19 ], [ %22, %21 ], [ %24, %23 ], [ %26, %25 ], [ %28, %27 ], [ %30, %29 ], [ %32, %31 ], [ %34, %33 ], [ %36, %35 ], [ %38, %37 ], [ %40, %39 ], [ %42, %41 ], [ %44, %43 ], [ %46, %45 ], [ %48, %47 ], [ %50, %49 ], [ %52, %51 ], [ %54, %53 ], [ %56, %55 ], [ %58, %57 ], [ %60, %59 ], [ %62, %61 ], [ %64, %63 ], [ %66, %65 ], [ %68, %67 ], [ 0, %69 ], [ %6, %2 ] |
| ret i32 %71 |
| } |
| |
| ; Function Attrs: norecurse nounwind readnone uwtable |
| define i32 @foo() local_unnamed_addr #0 { |
| ; X86-LABEL: foo: |
| ; X86: # %bb.0: |
| ; X86-NEXT: pushl %ebx |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: pushl %edi |
| ; X86-NEXT: .cfi_def_cfa_offset 12 |
| ; X86-NEXT: pushl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 16 |
| ; X86-NEXT: .cfi_offset %esi, -16 |
| ; X86-NEXT: .cfi_offset %edi, -12 |
| ; X86-NEXT: .cfi_offset %ebx, -8 |
| ; X86-NEXT: pushl $0 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $1 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %esi |
| ; X86-NEXT: xorl $1, %esi |
| ; X86-NEXT: pushl $1 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $2 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $2, %edi |
| ; X86-NEXT: pushl $1 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $3 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $3, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $2 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $4 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $4, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $2 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $5 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $5, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $3 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $6 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $6, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $3 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $7 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $7, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $4 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $8 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $8, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $4 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $9 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $9, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $5 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $10 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $10, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $5 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $11 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $11, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $6 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $12 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $12, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $6 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $13 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $13, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $7 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $14 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $14, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $7 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $15 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $15, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $8 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $16 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $16, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $8 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $17 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $17, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $9 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $18 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $18, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $9 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $19 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $19, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $10 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $20 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $20, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $10 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $21 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $21, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $11 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $22 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $22, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $11 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $23 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $23, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $12 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $24 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $24, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $12 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $25 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $25, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $13 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $26 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $26, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $13 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $27 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $27, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $14 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $28 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $28, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $14 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $29 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $29, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: pushl $15 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $30 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %edi |
| ; X86-NEXT: xorl $30, %edi |
| ; X86-NEXT: orl %ebx, %edi |
| ; X86-NEXT: pushl $15 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $31 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: movl %eax, %ebx |
| ; X86-NEXT: xorl $31, %ebx |
| ; X86-NEXT: orl %edi, %ebx |
| ; X86-NEXT: orl %esi, %ebx |
| ; X86-NEXT: pushl $16 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: pushl $32 |
| ; X86-NEXT: .cfi_adjust_cfa_offset 4 |
| ; X86-NEXT: calll mult |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: .cfi_adjust_cfa_offset -8 |
| ; X86-NEXT: xorl $32, %eax |
| ; X86-NEXT: xorl %ecx, %ecx |
| ; X86-NEXT: orl %ebx, %eax |
| ; X86-NEXT: setne %cl |
| ; X86-NEXT: negl %ecx |
| ; X86-NEXT: movl %ecx, %eax |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: .cfi_def_cfa_offset 12 |
| ; X86-NEXT: popl %edi |
| ; X86-NEXT: .cfi_def_cfa_offset 8 |
| ; X86-NEXT: popl %ebx |
| ; X86-NEXT: .cfi_def_cfa_offset 4 |
| ; X86-NEXT: retl |
| ; |
| ; X64-HSW-LABEL: foo: |
| ; X64-HSW: # %bb.0: |
| ; X64-HSW-NEXT: pushq %rbp |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 16 |
| ; X64-HSW-NEXT: pushq %r15 |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 24 |
| ; X64-HSW-NEXT: pushq %r14 |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 32 |
| ; X64-HSW-NEXT: pushq %rbx |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 40 |
| ; X64-HSW-NEXT: pushq %rax |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 48 |
| ; X64-HSW-NEXT: .cfi_offset %rbx, -40 |
| ; X64-HSW-NEXT: .cfi_offset %r14, -32 |
| ; X64-HSW-NEXT: .cfi_offset %r15, -24 |
| ; X64-HSW-NEXT: .cfi_offset %rbp, -16 |
| ; X64-HSW-NEXT: movl $1, %edi |
| ; X64-HSW-NEXT: xorl %esi, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $1, %ebx |
| ; X64-HSW-NEXT: movl $2, %edi |
| ; X64-HSW-NEXT: movl $1, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $2, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $3, %edi |
| ; X64-HSW-NEXT: movl $1, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r14d |
| ; X64-HSW-NEXT: xorl $3, %r14d |
| ; X64-HSW-NEXT: movl $4, %edi |
| ; X64-HSW-NEXT: movl $2, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $4, %ebx |
| ; X64-HSW-NEXT: orl %r14d, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $5, %edi |
| ; X64-HSW-NEXT: movl $2, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r14d |
| ; X64-HSW-NEXT: xorl $5, %r14d |
| ; X64-HSW-NEXT: movl $6, %edi |
| ; X64-HSW-NEXT: movl $3, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $6, %ebp |
| ; X64-HSW-NEXT: orl %r14d, %ebp |
| ; X64-HSW-NEXT: movl $7, %edi |
| ; X64-HSW-NEXT: movl $3, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r14d |
| ; X64-HSW-NEXT: xorl $7, %r14d |
| ; X64-HSW-NEXT: orl %ebp, %r14d |
| ; X64-HSW-NEXT: orl %ebx, %r14d |
| ; X64-HSW-NEXT: movl $8, %edi |
| ; X64-HSW-NEXT: movl $4, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $8, %ebx |
| ; X64-HSW-NEXT: movl $9, %edi |
| ; X64-HSW-NEXT: movl $4, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $9, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $10, %edi |
| ; X64-HSW-NEXT: movl $5, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $10, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $11, %edi |
| ; X64-HSW-NEXT: movl $5, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r15d |
| ; X64-HSW-NEXT: xorl $11, %r15d |
| ; X64-HSW-NEXT: orl %ebx, %r15d |
| ; X64-HSW-NEXT: orl %r14d, %r15d |
| ; X64-HSW-NEXT: movl $12, %edi |
| ; X64-HSW-NEXT: movl $6, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $12, %ebx |
| ; X64-HSW-NEXT: movl $13, %edi |
| ; X64-HSW-NEXT: movl $6, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $13, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $14, %edi |
| ; X64-HSW-NEXT: movl $7, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $14, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $15, %edi |
| ; X64-HSW-NEXT: movl $7, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $15, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $16, %edi |
| ; X64-HSW-NEXT: movl $8, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r14d |
| ; X64-HSW-NEXT: xorl $16, %r14d |
| ; X64-HSW-NEXT: orl %ebp, %r14d |
| ; X64-HSW-NEXT: orl %r15d, %r14d |
| ; X64-HSW-NEXT: movl $17, %edi |
| ; X64-HSW-NEXT: movl $8, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $17, %ebp |
| ; X64-HSW-NEXT: movl $18, %edi |
| ; X64-HSW-NEXT: movl $9, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $18, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $19, %edi |
| ; X64-HSW-NEXT: movl $9, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $19, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $20, %edi |
| ; X64-HSW-NEXT: movl $10, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $20, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $21, %edi |
| ; X64-HSW-NEXT: movl $10, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $21, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $22, %edi |
| ; X64-HSW-NEXT: movl $11, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r15d |
| ; X64-HSW-NEXT: xorl $22, %r15d |
| ; X64-HSW-NEXT: orl %ebp, %r15d |
| ; X64-HSW-NEXT: orl %r14d, %r15d |
| ; X64-HSW-NEXT: movl $23, %edi |
| ; X64-HSW-NEXT: movl $11, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $23, %ebp |
| ; X64-HSW-NEXT: movl $24, %edi |
| ; X64-HSW-NEXT: movl $12, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $24, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $25, %edi |
| ; X64-HSW-NEXT: movl $12, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $25, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $26, %edi |
| ; X64-HSW-NEXT: movl $13, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $26, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $27, %edi |
| ; X64-HSW-NEXT: movl $13, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $27, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: movl $28, %edi |
| ; X64-HSW-NEXT: movl $14, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $28, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $29, %edi |
| ; X64-HSW-NEXT: movl $14, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebp |
| ; X64-HSW-NEXT: xorl $29, %ebp |
| ; X64-HSW-NEXT: orl %ebx, %ebp |
| ; X64-HSW-NEXT: orl %r15d, %ebp |
| ; X64-HSW-NEXT: movl $30, %edi |
| ; X64-HSW-NEXT: movl $15, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %r14d |
| ; X64-HSW-NEXT: xorl $30, %r14d |
| ; X64-HSW-NEXT: movl $31, %edi |
| ; X64-HSW-NEXT: movl $15, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: movl %eax, %ebx |
| ; X64-HSW-NEXT: xorl $31, %ebx |
| ; X64-HSW-NEXT: orl %r14d, %ebx |
| ; X64-HSW-NEXT: orl %ebp, %ebx |
| ; X64-HSW-NEXT: movl $32, %edi |
| ; X64-HSW-NEXT: movl $16, %esi |
| ; X64-HSW-NEXT: callq mult |
| ; X64-HSW-NEXT: xorl $32, %eax |
| ; X64-HSW-NEXT: xorl %ecx, %ecx |
| ; X64-HSW-NEXT: orl %ebx, %eax |
| ; X64-HSW-NEXT: setne %cl |
| ; X64-HSW-NEXT: negl %ecx |
| ; X64-HSW-NEXT: movl %ecx, %eax |
| ; X64-HSW-NEXT: addq $8, %rsp |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 40 |
| ; X64-HSW-NEXT: popq %rbx |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 32 |
| ; X64-HSW-NEXT: popq %r14 |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 24 |
| ; X64-HSW-NEXT: popq %r15 |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 16 |
| ; X64-HSW-NEXT: popq %rbp |
| ; X64-HSW-NEXT: .cfi_def_cfa_offset 8 |
| ; X64-HSW-NEXT: retq |
| %1 = tail call i32 @mult(i32 1, i32 0) |
| %2 = icmp ne i32 %1, 1 |
| %3 = tail call i32 @mult(i32 2, i32 1) |
| %4 = icmp ne i32 %3, 2 |
| %5 = or i1 %2, %4 |
| %6 = tail call i32 @mult(i32 3, i32 1) |
| %7 = icmp ne i32 %6, 3 |
| %8 = or i1 %5, %7 |
| %9 = tail call i32 @mult(i32 4, i32 2) |
| %10 = icmp ne i32 %9, 4 |
| %11 = or i1 %8, %10 |
| %12 = tail call i32 @mult(i32 5, i32 2) |
| %13 = icmp ne i32 %12, 5 |
| %14 = or i1 %11, %13 |
| %15 = tail call i32 @mult(i32 6, i32 3) |
| %16 = icmp ne i32 %15, 6 |
| %17 = or i1 %14, %16 |
| %18 = tail call i32 @mult(i32 7, i32 3) |
| %19 = icmp ne i32 %18, 7 |
| %20 = or i1 %17, %19 |
| %21 = tail call i32 @mult(i32 8, i32 4) |
| %22 = icmp ne i32 %21, 8 |
| %23 = or i1 %20, %22 |
| %24 = tail call i32 @mult(i32 9, i32 4) |
| %25 = icmp ne i32 %24, 9 |
| %26 = or i1 %23, %25 |
| %27 = tail call i32 @mult(i32 10, i32 5) |
| %28 = icmp ne i32 %27, 10 |
| %29 = or i1 %26, %28 |
| %30 = tail call i32 @mult(i32 11, i32 5) |
| %31 = icmp ne i32 %30, 11 |
| %32 = or i1 %29, %31 |
| %33 = tail call i32 @mult(i32 12, i32 6) |
| %34 = icmp ne i32 %33, 12 |
| %35 = or i1 %32, %34 |
| %36 = tail call i32 @mult(i32 13, i32 6) |
| %37 = icmp ne i32 %36, 13 |
| %38 = or i1 %35, %37 |
| %39 = tail call i32 @mult(i32 14, i32 7) |
| %40 = icmp ne i32 %39, 14 |
| %41 = or i1 %38, %40 |
| %42 = tail call i32 @mult(i32 15, i32 7) |
| %43 = icmp ne i32 %42, 15 |
| %44 = or i1 %41, %43 |
| %45 = tail call i32 @mult(i32 16, i32 8) |
| %46 = icmp ne i32 %45, 16 |
| %47 = or i1 %44, %46 |
| %48 = tail call i32 @mult(i32 17, i32 8) |
| %49 = icmp ne i32 %48, 17 |
| %50 = or i1 %47, %49 |
| %51 = tail call i32 @mult(i32 18, i32 9) |
| %52 = icmp ne i32 %51, 18 |
| %53 = or i1 %50, %52 |
| %54 = tail call i32 @mult(i32 19, i32 9) |
| %55 = icmp ne i32 %54, 19 |
| %56 = or i1 %53, %55 |
| %57 = tail call i32 @mult(i32 20, i32 10) |
| %58 = icmp ne i32 %57, 20 |
| %59 = or i1 %56, %58 |
| %60 = tail call i32 @mult(i32 21, i32 10) |
| %61 = icmp ne i32 %60, 21 |
| %62 = or i1 %59, %61 |
| %63 = tail call i32 @mult(i32 22, i32 11) |
| %64 = icmp ne i32 %63, 22 |
| %65 = or i1 %62, %64 |
| %66 = tail call i32 @mult(i32 23, i32 11) |
| %67 = icmp ne i32 %66, 23 |
| %68 = or i1 %65, %67 |
| %69 = tail call i32 @mult(i32 24, i32 12) |
| %70 = icmp ne i32 %69, 24 |
| %71 = or i1 %68, %70 |
| %72 = tail call i32 @mult(i32 25, i32 12) |
| %73 = icmp ne i32 %72, 25 |
| %74 = or i1 %71, %73 |
| %75 = tail call i32 @mult(i32 26, i32 13) |
| %76 = icmp ne i32 %75, 26 |
| %77 = or i1 %74, %76 |
| %78 = tail call i32 @mult(i32 27, i32 13) |
| %79 = icmp ne i32 %78, 27 |
| %80 = or i1 %77, %79 |
| %81 = tail call i32 @mult(i32 28, i32 14) |
| %82 = icmp ne i32 %81, 28 |
| %83 = or i1 %80, %82 |
| %84 = tail call i32 @mult(i32 29, i32 14) |
| %85 = icmp ne i32 %84, 29 |
| %86 = or i1 %83, %85 |
| %87 = tail call i32 @mult(i32 30, i32 15) |
| %88 = icmp ne i32 %87, 30 |
| %89 = or i1 %86, %88 |
| %90 = tail call i32 @mult(i32 31, i32 15) |
| %91 = icmp ne i32 %90, 31 |
| %92 = or i1 %89, %91 |
| %93 = tail call i32 @mult(i32 32, i32 16) |
| %94 = icmp ne i32 %93, 32 |
| %95 = or i1 %92, %94 |
| %96 = sext i1 %95 to i32 |
| ret i32 %96 |
| } |
| |
| attributes #0 = { norecurse nounwind readnone uwtable } |