|
2 | 2 | ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86
|
3 | 3 | ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
|
4 | 4 |
|
5 |
| -define i32 @mask_offset_scale_i32_i64(ptr %base, i32 %i) { |
6 |
| -; X86-LABEL: mask_offset_scale_i32_i64: |
| 5 | +define i32 @mask_add_sext_i32_i64(ptr %base, i32 %i) { |
| 6 | +; X86-LABEL: mask_add_sext_i32_i64: |
| 7 | +; X86: # %bb.0: |
| 8 | +; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax |
| 9 | +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx |
| 10 | +; X86-NEXT: movl 12(%ecx,%eax,4), %eax |
| 11 | +; X86-NEXT: retl |
| 12 | +; |
| 13 | +; X64-LABEL: mask_add_sext_i32_i64: |
| 14 | +; X64: # %bb.0: |
| 15 | +; X64-NEXT: sarl $24, %esi |
| 16 | +; X64-NEXT: addl $3, %esi |
| 17 | +; X64-NEXT: movslq %esi, %rax |
| 18 | +; X64-NEXT: movl (%rdi,%rax,4), %eax |
| 19 | +; X64-NEXT: retq |
| 20 | + %mask = ashr i32 %i, 24 |
| 21 | + %offset = add i32 %mask, 3 |
| 22 | + %sext = sext i32 %offset to i64 |
| 23 | + %gep = getelementptr i32, ptr %base, i64 %sext |
| 24 | + %ret = load i32, ptr %gep |
| 25 | + ret i32 %ret |
| 26 | +} |
| 27 | + |
| 28 | +define i32 @mask_add_zext_i32_i64(ptr %base, i32 %i) { |
| 29 | +; X86-LABEL: mask_add_zext_i32_i64: |
| 30 | +; X86: # %bb.0: |
| 31 | +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| 32 | +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx |
| 33 | +; X86-NEXT: andl $15, %ecx |
| 34 | +; X86-NEXT: movl 12(%eax,%ecx,4), %eax |
| 35 | +; X86-NEXT: retl |
| 36 | +; |
| 37 | +; X64-LABEL: mask_add_zext_i32_i64: |
| 38 | +; X64: # %bb.0: |
| 39 | +; X64-NEXT: # kill: def $esi killed $esi def $rsi |
| 40 | +; X64-NEXT: andl $15, %esi |
| 41 | +; X64-NEXT: addl $3, %esi |
| 42 | +; X64-NEXT: movl (%rdi,%rsi,4), %eax |
| 43 | +; X64-NEXT: retq |
| 44 | + %mask = and i32 %i, 15 |
| 45 | + %offset = add i32 %mask, 3 |
| 46 | + %zext = zext i32 %offset to i64 |
| 47 | + %gep = getelementptr i32, ptr %base, i64 %zext |
| 48 | + %ret = load i32, ptr %gep |
| 49 | + ret i32 %ret |
| 50 | +} |
| 51 | + |
| 52 | +define i32 @mask_offset_scale_zext_i32_i64(ptr %base, i32 %i) { |
| 53 | +; X86-LABEL: mask_offset_scale_zext_i32_i64: |
7 | 54 | ; X86: # %bb.0:
|
8 | 55 | ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
9 | 56 | ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
10 | 57 | ; X86-NEXT: shll $11, %ecx
|
11 | 58 | ; X86-NEXT: movl 48(%eax,%ecx), %eax
|
12 | 59 | ; X86-NEXT: retl
|
13 | 60 | ;
|
14 |
| -; X64-LABEL: mask_offset_scale_i32_i64: |
| 61 | +; X64-LABEL: mask_offset_scale_zext_i32_i64: |
15 | 62 | ; X64: # %bb.0:
|
16 | 63 | ; X64-NEXT: # kill: def $esi killed $esi def $rsi
|
17 | 64 | ; X64-NEXT: andl $65280, %esi # imm = 0xFF00
|
|
0 commit comments