| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s | |
| ; bitextract | |
| define i1 @test_bitextract_b8_off0(b8 %src) { | |
| ; CHECK-LABEL: test_bitextract_b8_off0: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movl %edi, %eax | |
| ; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i1, b8 %src, i32 0 | |
| ret i1 %result | |
| } | |
| define i4 @test_bitextract_b8_nibble_hi(b8 %src) { | |
| ; CHECK-LABEL: test_bitextract_b8_nibble_hi: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movl %edi, %eax | |
| ; CHECK-NEXT: shrb $4, %al | |
| ; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i4, b8 %src, i32 4 | |
| ret i4 %result | |
| } | |
| define i1 @test_bitextract_b8_off_top(b8 %src) { | |
| ; CHECK-LABEL: test_bitextract_b8_off_top: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movl %edi, %eax | |
| ; CHECK-NEXT: shrb $7, %al | |
| ; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i1, b8 %src, i32 7 | |
| ret i1 %result | |
| } | |
| define i8 @test_bitextract_b16_byte_hi(b16 %src) { | |
| ; CHECK-LABEL: test_bitextract_b16_byte_hi: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movl %edi, %eax | |
| ; CHECK-NEXT: shrl $8, %eax | |
| ; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i8, b16 %src, i32 8 | |
| ret i8 %result | |
| } | |
| define i32 @test_bitextract_b64_dword_hi(b64 %src) { | |
| ; CHECK-LABEL: test_bitextract_b64_dword_hi: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movq %rdi, %rax | |
| ; CHECK-NEXT: shrq $32, %rax | |
| ; CHECK-NEXT: # kill: def $eax killed $eax killed $rax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i32, b64 %src, i32 32 | |
| ret i32 %result | |
| } | |
| define i64 @test_bitextract_b128_lo64(b128 %src) { | |
| ; CHECK-LABEL: test_bitextract_b128_lo64: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movq %rdi, %rax | |
| ; CHECK-NEXT: retq | |
| %result = bitextract i64, b128 %src, i32 0 | |
| ret i64 %result | |
| } | |
| define b8 @test_bitinsert_b8_off1(b8 %base, i1 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b8_off1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi | |
| ; CHECK-NEXT: andb $-3, %dil | |
| ; CHECK-NEXT: andb $1, %sil | |
| ; CHECK-NEXT: leal (%rsi,%rsi), %eax | |
| ; CHECK-NEXT: orb %dil, %al | |
| ; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitinsert b8 %base, i1 %val, i32 1 | |
| ret b8 %result | |
| } | |
| define b16 @test_bitinsert_b16_off8(b16 %base, i8 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b16_off8: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: shll $8, %esi | |
| ; CHECK-NEXT: movzbl %dil, %eax | |
| ; CHECK-NEXT: orl %esi, %eax | |
| ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; CHECK-NEXT: retq | |
| %result = bitinsert b16 %base, i8 %val, i32 8 | |
| ret b16 %result | |
| } | |
| ; b32 container: offsets 1, 2, 4, 8, 16 | |
| define b32 @test_bitinsert_b32_off8(b32 %base, i8 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b32_off8: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: andl $-65281, %edi # imm = 0xFFFF00FF | |
| ; CHECK-NEXT: movzbl %sil, %eax | |
| ; CHECK-NEXT: shll $8, %eax | |
| ; CHECK-NEXT: orl %edi, %eax | |
| ; CHECK-NEXT: retq | |
| %result = bitinsert b32 %base, i8 %val, i32 8 | |
| ret b32 %result | |
| } | |
| define b64 @test_bitinsert_b64_off32(b64 %base, i32 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b64_off32: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi | |
| ; CHECK-NEXT: shlq $32, %rsi | |
| ; CHECK-NEXT: movl %edi, %eax | |
| ; CHECK-NEXT: orq %rsi, %rax | |
| ; CHECK-NEXT: retq | |
| %result = bitinsert b64 %base, i32 %val, i32 32 | |
| ret b64 %result | |
| } | |
| ; --- b128 container: offsets 1, 2, 4, 8, 16, 32, 64 --- | |
| define b128 @test_bitinsert_b128_off64(b128 %base, i64 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b128_off64: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movq %rdi, %rax | |
| ; CHECK-NEXT: retq | |
| %result = bitinsert b128 %base, i64 %val, i32 64 | |
| ret b128 %result | |
| } |