| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=armv7-linux-gnueabi < %s | FileCheck %s --check-prefix=ARM |
| ; RUN: llc -mtriple=thumbv7m-none-eabi < %s | FileCheck %s --check-prefix=THUMB-M |
| ; RUN: llc -mtriple=thumbv8a-linux-gnueabi < %s | FileCheck %s --check-prefix=THUMB-A |
| |
| ; bitextract |
| define i1 @test_bitextract_b8_off0(b8 %src) { |
| ; ARM-LABEL: test_bitextract_b8_off0: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b8_off0: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b8_off0: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i1, b8 %src, i32 0 |
| ret i1 %result |
| } |
| |
| define i4 @test_bitextract_b8_nibble_hi(b8 %src) { |
| ; ARM-LABEL: test_bitextract_b8_nibble_hi: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: uxtb r0, r0 |
| ; ARM-NEXT: lsr r0, r0, #4 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b8_nibble_hi: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxtb r0, r0 |
| ; THUMB-M-NEXT: lsrs r0, r0, #4 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b8_nibble_hi: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: uxtb r0, r0 |
| ; THUMB-A-NEXT: lsrs r0, r0, #4 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i4, b8 %src, i32 4 |
| ret i4 %result |
| } |
| |
| define i1 @test_bitextract_b8_off_top(b8 %src) { |
| ; ARM-LABEL: test_bitextract_b8_off_top: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: uxtb r0, r0 |
| ; ARM-NEXT: lsr r0, r0, #7 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b8_off_top: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxtb r0, r0 |
| ; THUMB-M-NEXT: lsrs r0, r0, #7 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b8_off_top: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: uxtb r0, r0 |
| ; THUMB-A-NEXT: lsrs r0, r0, #7 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i1, b8 %src, i32 7 |
| ret i1 %result |
| } |
| |
| define i8 @test_bitextract_b16_byte_hi(b16 %src) { |
| ; ARM-LABEL: test_bitextract_b16_byte_hi: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: uxth r0, r0 |
| ; ARM-NEXT: lsr r0, r0, #8 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b16_byte_hi: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxth r0, r0 |
| ; THUMB-M-NEXT: lsrs r0, r0, #8 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b16_byte_hi: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: uxth r0, r0 |
| ; THUMB-A-NEXT: lsrs r0, r0, #8 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i8, b16 %src, i32 8 |
| ret i8 %result |
| } |
| |
| define i32 @test_bitextract_b64_dword_hi(b64 %src) { |
| ; ARM-LABEL: test_bitextract_b64_dword_hi: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r0, r1 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b64_dword_hi: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r0, r1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b64_dword_hi: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r0, r1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i32, b64 %src, i32 32 |
| ret i32 %result |
| } |
| |
| define i64 @test_bitextract_b128_lo64(b128 %src) { |
| ; ARM-LABEL: test_bitextract_b128_lo64: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_b128_lo64: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_b128_lo64: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract i64, b128 %src, i32 0 |
| ret i64 %result |
| } |
| |
| define b8 @test_bitinsert_b8_off1(b8 %base, i1 %val) { |
| ; ARM-LABEL: test_bitinsert_b8_off1: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: and r1, r1, #1 |
| ; ARM-NEXT: bic r0, r0, #2 |
| ; ARM-NEXT: orr r0, r0, r1, lsl #1 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_b8_off1: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: and r1, r1, #1 |
| ; THUMB-M-NEXT: bic r0, r0, #2 |
| ; THUMB-M-NEXT: orr.w r0, r0, r1, lsl #1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_b8_off1: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: and r1, r1, #1 |
| ; THUMB-A-NEXT: bic r0, r0, #2 |
| ; THUMB-A-NEXT: orr.w r0, r0, r1, lsl #1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b8 %base, i1 %val, i32 1 |
| ret b8 %result |
| } |
| |
| define b16 @test_bitinsert_b16_off8(b16 %base, i8 %val) { |
| ; ARM-LABEL: test_bitinsert_b16_off8: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: uxtb r0, r0 |
| ; ARM-NEXT: orr r0, r0, r1, lsl #8 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_b16_off8: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxtb r0, r0 |
| ; THUMB-M-NEXT: orr.w r0, r0, r1, lsl #8 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_b16_off8: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: uxtb r0, r0 |
| ; THUMB-A-NEXT: orr.w r0, r0, r1, lsl #8 |
| ; THUMB-A-NEXT: bx lr |
| %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) { |
| ; ARM-LABEL: test_bitinsert_b32_off8: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: uxtb r1, r1 |
| ; ARM-NEXT: bic r0, r0, #65280 |
| ; ARM-NEXT: orr r0, r0, r1, lsl #8 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_b32_off8: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxtb r1, r1 |
| ; THUMB-M-NEXT: bic r0, r0, #65280 |
| ; THUMB-M-NEXT: orr.w r0, r0, r1, lsl #8 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_b32_off8: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: uxtb r1, r1 |
| ; THUMB-A-NEXT: bic r0, r0, #65280 |
| ; THUMB-A-NEXT: orr.w r0, r0, r1, lsl #8 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b32 %base, i8 %val, i32 8 |
| ret b32 %result |
| } |
| |
| define b64 @test_bitinsert_b64_off32(b64 %base, i32 %val) { |
| ; ARM-LABEL: test_bitinsert_b64_off32: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r1, r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_b64_off32: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r1, r2 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_b64_off32: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r1, r2 |
| ; THUMB-A-NEXT: bx lr |
| %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) { |
| ; ARM-LABEL: test_bitinsert_b128_off64: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: ldm sp, {r2, r3} |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_b128_off64: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: ldrd r2, r3, [sp] |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_b128_off64: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: ldrd r2, r3, [sp] |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b128 %base, i64 %val, i32 64 |
| ret b128 %result |
| } |