| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s | |
| define i16 @test_bitextract_var(b32 %src, i32 %off) { | |
| ; CHECK-LABEL: test_bitextract_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: srw 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i16, b32 %src, i32 %off | |
| ret i16 %result | |
| } | |
| define i16 @test_bitextract_const(b32 %src) { | |
| ; CHECK-LABEL: test_bitextract_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: srwi 3, 3, 8 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i16, b32 %src, i32 8 | |
| ret i16 %result | |
| } | |
| define i8 @test_bitextract_narrow(b64 %src) { | |
| ; CHECK-LABEL: test_bitextract_narrow: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i8, b64 %src, i32 0 | |
| ret i8 %result | |
| } | |
| define i1 @test_bitextract_b1(b1 %src) { | |
| ; CHECK-LABEL: test_bitextract_b1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i1, b1 %src, i32 0 | |
| ret i1 %result | |
| } | |
| define i8 @test_bitextract_b37(b37 %src, i32 %off) { | |
| ; CHECK-LABEL: test_bitextract_b37: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 3, 3, 27 | |
| ; CHECK-NEXT: srd 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i8, b37 %src, i32 %off | |
| ret i8 %result | |
| } | |
| define i8 @test_bitextract_b37_const(b37 %src) { | |
| ; CHECK-LABEL: test_bitextract_b37_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rldicl 3, 3, 44, 47 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i8, b37 %src, i32 20 | |
| ret i8 %result | |
| } | |
| define i16 @test_bitextract_b87(b87 %src, i32 %off) { | |
| ; CHECK-LABEL: test_bitextract_b87: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 3, 3, 41 | |
| ; CHECK-NEXT: subfic 6, 5, 64 | |
| ; CHECK-NEXT: srd 4, 4, 5 | |
| ; CHECK-NEXT: addi 5, 5, -64 | |
| ; CHECK-NEXT: sld 6, 3, 6 | |
| ; CHECK-NEXT: srd 3, 3, 5 | |
| ; CHECK-NEXT: or 4, 4, 6 | |
| ; CHECK-NEXT: or 3, 4, 3 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i16, b87 %src, i32 %off | |
| ret i16 %result | |
| } | |
| define i32 @test_bitextract_b128(b128 %src, i32 %off) { | |
| ; CHECK-LABEL: test_bitextract_b128: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: subfic 6, 5, 64 | |
| ; CHECK-NEXT: srd 4, 4, 5 | |
| ; CHECK-NEXT: addi 5, 5, -64 | |
| ; CHECK-NEXT: sld 6, 3, 6 | |
| ; CHECK-NEXT: srd 3, 3, 5 | |
| ; CHECK-NEXT: or 4, 4, 6 | |
| ; CHECK-NEXT: or 3, 4, 3 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i32, b128 %src, i32 %off | |
| ret i32 %result | |
| } | |
| define i32 @test_bitextract_b231(b231 %src, i32 %off) { | |
| ; CHECK-LABEL: test_bitextract_b231: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 3, 3, 25 | |
| ; CHECK-NEXT: std 4, -24(1) | |
| ; CHECK-NEXT: addi 4, 1, -32 | |
| ; CHECK-NEXT: xxlxor 0, 0, 0 | |
| ; CHECK-NEXT: li 8, 16 | |
| ; CHECK-NEXT: addi 9, 1, -64 | |
| ; CHECK-NEXT: std 6, -8(1) | |
| ; CHECK-NEXT: std 5, -16(1) | |
| ; CHECK-NEXT: std 3, -32(1) | |
| ; CHECK-NEXT: rlwinm 3, 7, 29, 27, 28 | |
| ; CHECK-NEXT: stxvw4x 0, 9, 8 | |
| ; CHECK-NEXT: stxvw4x 0, 0, 9 | |
| ; CHECK-NEXT: clrlwi 5, 7, 26 | |
| ; CHECK-NEXT: neg 3, 3 | |
| ; CHECK-NEXT: extsw 3, 3 | |
| ; CHECK-NEXT: add 3, 4, 3 | |
| ; CHECK-NEXT: ld 4, 24(3) | |
| ; CHECK-NEXT: ld 3, 16(3) | |
| ; CHECK-NEXT: srd 4, 4, 5 | |
| ; CHECK-NEXT: subfic 5, 5, 64 | |
| ; CHECK-NEXT: sld 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitextract i32, b231 %src, i32 %off | |
| ret i32 %result | |
| } | |
| ; Bitinsert | |
| define b32 @test_bitinsert_var(b32 %base, i16 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lis 6, 0 | |
| ; CHECK-NEXT: clrlwi 4, 4, 16 | |
| ; CHECK-NEXT: ori 6, 6, 65535 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: slw 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, i16 %val, i32 %off | |
| ret b32 %result | |
| } | |
| define b1 @test_bitinsert_b1(b1 %base, i1 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: mr 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b1 %base, i1 %val, i32 0 | |
| ret b1 %result | |
| } | |
| define b37 @test_bitinsert_b37_var(b37 %base, i8 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b37_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 4, 4, 56 | |
| ; CHECK-NEXT: li 6, 255 | |
| ; CHECK-NEXT: sld 4, 4, 5 | |
| ; CHECK-NEXT: sld 5, 6, 5 | |
| ; CHECK-NEXT: li 6, -1 | |
| ; CHECK-NEXT: rldic 6, 6, 0, 27 | |
| ; CHECK-NEXT: xor 5, 5, 6 | |
| ; CHECK-NEXT: and 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b37 %base, i8 %val, i32 %off | |
| ret b37 %result | |
| } | |
| define b87 @test_bitinsert_b87_var(b87 %base, i16 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b87_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 5, 5, 48 | |
| ; CHECK-NEXT: addi 7, 6, -64 | |
| ; CHECK-NEXT: subfic 9, 6, 64 | |
| ; CHECK-NEXT: sld 8, 5, 7 | |
| ; CHECK-NEXT: srd 10, 5, 9 | |
| ; CHECK-NEXT: sld 5, 5, 6 | |
| ; CHECK-NEXT: or 8, 10, 8 | |
| ; CHECK-NEXT: li 10, 0 | |
| ; CHECK-NEXT: ori 10, 10, 65535 | |
| ; CHECK-NEXT: sld 7, 10, 7 | |
| ; CHECK-NEXT: srd 9, 10, 9 | |
| ; CHECK-NEXT: sld 6, 10, 6 | |
| ; CHECK-NEXT: or 7, 9, 7 | |
| ; CHECK-NEXT: andc 4, 4, 6 | |
| ; CHECK-NEXT: xori 7, 7, 65535 | |
| ; CHECK-NEXT: or 4, 4, 5 | |
| ; CHECK-NEXT: xoris 7, 7, 127 | |
| ; CHECK-NEXT: and 3, 3, 7 | |
| ; CHECK-NEXT: or 3, 3, 8 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b87 %base, i16 %val, i32 %off | |
| ret b87 %result | |
| } | |
| define b128 @test_bitinsert_b128_var(b128 %base, i32 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b128_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 5, 5, 32 | |
| ; CHECK-NEXT: addi 7, 6, -64 | |
| ; CHECK-NEXT: subfic 9, 6, 64 | |
| ; CHECK-NEXT: sld 8, 5, 7 | |
| ; CHECK-NEXT: srd 10, 5, 9 | |
| ; CHECK-NEXT: sld 5, 5, 6 | |
| ; CHECK-NEXT: or 8, 10, 8 | |
| ; CHECK-NEXT: li 10, -1 | |
| ; CHECK-NEXT: rldic 10, 10, 0, 32 | |
| ; CHECK-NEXT: sld 7, 10, 7 | |
| ; CHECK-NEXT: srd 9, 10, 9 | |
| ; CHECK-NEXT: sld 6, 10, 6 | |
| ; CHECK-NEXT: or 7, 9, 7 | |
| ; CHECK-NEXT: andc 4, 4, 6 | |
| ; CHECK-NEXT: andc 3, 3, 7 | |
| ; CHECK-NEXT: or 4, 4, 5 | |
| ; CHECK-NEXT: or 3, 3, 8 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b128 %base, i32 %val, i32 %off | |
| ret b128 %result | |
| } | |
| define b231 @test_bitinsert_b231_var(b231 %base, i32 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b231_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: li 9, -1 | |
| ; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: xxlxor 0, 0, 0 | |
| ; CHECK-NEXT: li 10, 48 | |
| ; CHECK-NEXT: addi 11, 1, -192 | |
| ; CHECK-NEXT: li 12, 32 | |
| ; CHECK-NEXT: addi 30, 1, -128 | |
| ; CHECK-NEXT: clrldi 7, 7, 32 | |
| ; CHECK-NEXT: li 0, 0 | |
| ; CHECK-NEXT: rldic 29, 9, 0, 32 | |
| ; CHECK-NEXT: std 28, -32(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: rlwinm 28, 8, 29, 27, 28 | |
| ; CHECK-NEXT: std 24, -64(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 25, -56(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 26, -48(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 27, -40(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: stxvw4x 0, 11, 10 | |
| ; CHECK-NEXT: stxvw4x 0, 11, 12 | |
| ; CHECK-NEXT: stxvw4x 0, 30, 10 | |
| ; CHECK-NEXT: stxvw4x 0, 30, 12 | |
| ; CHECK-NEXT: stxvw4x 0, 0, 11 | |
| ; CHECK-NEXT: clrlwi 8, 8, 26 | |
| ; CHECK-NEXT: mr 10, 28 | |
| ; CHECK-NEXT: stxvw4x 0, 0, 30 | |
| ; CHECK-NEXT: std 0, -176(1) | |
| ; CHECK-NEXT: subfic 27, 8, 64 | |
| ; CHECK-NEXT: rldic 9, 9, 0, 25 | |
| ; CHECK-NEXT: std 7, -168(1) | |
| ; CHECK-NEXT: std 0, -112(1) | |
| ; CHECK-NEXT: std 29, -104(1) | |
| ; CHECK-NEXT: ldux 7, 28, 30 | |
| ; CHECK-NEXT: ld 12, 8(28) | |
| ; CHECK-NEXT: ld 0, 16(28) | |
| ; CHECK-NEXT: ldux 11, 10, 11 | |
| ; CHECK-NEXT: ld 30, 16(10) | |
| ; CHECK-NEXT: srd 26, 0, 27 | |
| ; CHECK-NEXT: sld 25, 12, 8 | |
| ; CHECK-NEXT: ld 29, 8(10) | |
| ; CHECK-NEXT: ld 10, 24(10) | |
| ; CHECK-NEXT: ld 28, 24(28) | |
| ; CHECK-NEXT: srd 24, 30, 27 | |
| ; CHECK-NEXT: sld 30, 30, 8 | |
| ; CHECK-NEXT: sld 7, 7, 8 | |
| ; CHECK-NEXT: or 26, 25, 26 | |
| ; CHECK-NEXT: srd 12, 12, 27 | |
| ; CHECK-NEXT: sld 0, 0, 8 | |
| ; CHECK-NEXT: or 7, 7, 12 | |
| ; CHECK-NEXT: sld 25, 29, 8 | |
| ; CHECK-NEXT: sld 11, 11, 8 | |
| ; CHECK-NEXT: andc 4, 4, 26 | |
| ; CHECK-NEXT: srd 26, 10, 27 | |
| ; CHECK-NEXT: xor 7, 7, 9 | |
| ; CHECK-NEXT: or 25, 25, 24 | |
| ; CHECK-NEXT: ld 24, -64(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 30, 30, 26 | |
| ; CHECK-NEXT: srd 26, 28, 27 | |
| ; CHECK-NEXT: and 3, 3, 7 | |
| ; CHECK-NEXT: sld 7, 10, 8 | |
| ; CHECK-NEXT: sld 8, 28, 8 | |
| ; CHECK-NEXT: or 4, 4, 25 | |
| ; CHECK-NEXT: ld 28, -32(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: ld 25, -56(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 0, 0, 26 | |
| ; CHECK-NEXT: andc 6, 6, 8 | |
| ; CHECK-NEXT: ld 26, -48(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: andc 5, 5, 0 | |
| ; CHECK-NEXT: srd 0, 29, 27 | |
| ; CHECK-NEXT: or 6, 6, 7 | |
| ; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: ld 27, -40(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 11, 11, 0 | |
| ; CHECK-NEXT: or 5, 5, 30 | |
| ; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 3, 3, 11 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b231 %base, i32 %val, i32 %off | |
| ret b231 %result | |
| } | |
| ; different inserted value widths | |
| define b1 @test_bitinsert_b1_var(b1 %base, i1 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b1_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: mr 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b1 %base, i1 %val, i32 %off | |
| ret b1 %result | |
| } | |
| define b8 @test_bitinsert_b8_var(b8 %base, i4 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b8_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrlwi 4, 4, 28 | |
| ; CHECK-NEXT: li 6, 15 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: slw 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b8 %base, i4 %val, i32 %off | |
| ret b8 %result | |
| } | |
| define b8 @test_bitinsert_b8_const(b8 %base, i4 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b8_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rlwimi 3, 4, 3, 25, 28 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b8 %base, i4 %val, i32 3 | |
| ret b8 %result | |
| } | |
| define b21 @test_bitinsert_b21_var(b21 %base, i6 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b21_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrlwi 4, 4, 26 | |
| ; CHECK-NEXT: li 6, 63 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: slw 5, 6, 5 | |
| ; CHECK-NEXT: xori 5, 5, 65535 | |
| ; CHECK-NEXT: xoris 5, 5, 31 | |
| ; CHECK-NEXT: and 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b21 %base, i6 %val, i32 %off | |
| ret b21 %result | |
| } | |
| define b21 @test_bitinsert_b21_const(b21 %base, i6 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b21_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrlwi 5, 3, 18 | |
| ; CHECK-NEXT: rlwimi 5, 4, 14, 12, 17 | |
| ; CHECK-NEXT: rlwimi 3, 5, 0, 12, 10 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b21 %base, i6 %val, i32 14 | |
| ret b21 %result | |
| } | |
| define b123 @test_bitinsert_b123_var(b123 %base, i32 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_b123_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 5, 5, 32 | |
| ; CHECK-NEXT: addi 7, 6, -64 | |
| ; CHECK-NEXT: subfic 9, 6, 64 | |
| ; CHECK-NEXT: sld 8, 5, 7 | |
| ; CHECK-NEXT: srd 10, 5, 9 | |
| ; CHECK-NEXT: sld 5, 5, 6 | |
| ; CHECK-NEXT: or 8, 10, 8 | |
| ; CHECK-NEXT: li 10, -1 | |
| ; CHECK-NEXT: rldic 11, 10, 0, 32 | |
| ; CHECK-NEXT: sld 7, 11, 7 | |
| ; CHECK-NEXT: srd 9, 11, 9 | |
| ; CHECK-NEXT: sld 6, 11, 6 | |
| ; CHECK-NEXT: or 7, 9, 7 | |
| ; CHECK-NEXT: rldic 9, 10, 0, 5 | |
| ; CHECK-NEXT: andc 4, 4, 6 | |
| ; CHECK-NEXT: xor 7, 7, 9 | |
| ; CHECK-NEXT: or 4, 4, 5 | |
| ; CHECK-NEXT: and 3, 3, 7 | |
| ; CHECK-NEXT: or 3, 3, 8 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b123 %base, i32 %val, i32 %off | |
| ret b123 %result | |
| } | |
| define b123 @test_bitinsert_b123_crossword(b123 %base, i32 %val) { | |
| ; CHECK-LABEL: test_bitinsert_b123_crossword: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rotldi 6, 3, 36 | |
| ; CHECK-NEXT: rlwinm 3, 5, 28, 4, 31 | |
| ; CHECK-NEXT: rldimi 4, 5, 60, 0 | |
| ; CHECK-NEXT: rldimi 3, 6, 28, 5 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b123 %base, i32 %val, i32 60 | |
| ret b123 %result | |
| } | |
| define b123 @test_bitinsert_val_b123_full(b123 %base, b123 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b123_full: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: mr 4, 6 | |
| ; CHECK-NEXT: mr 3, 5 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b123 %base, b123 %val, i32 0 | |
| ret b123 %result | |
| } | |
| define b8 @test_bitinsert_val_b8_full(b8 %base, b8 %val) { | |
| ; container == value width: full overwrite | |
| ; CHECK-LABEL: test_bitinsert_val_b8_full: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: mr 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b8 %base, b8 %val, i32 0 | |
| ret b8 %result | |
| } | |
| define b32 @test_bitinsert_val_b8_into_b32_var(b32 %base, b8 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b8_into_b32_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrlwi 4, 4, 24 | |
| ; CHECK-NEXT: li 6, 255 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: slw 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, b8 %val, i32 %off | |
| ret b32 %result | |
| } | |
| define b32 @test_bitinsert_val_b8_into_b32_const_mid(b32 %base, b8 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b8_into_b32_const_mid: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rlwimi 3, 4, 12, 12, 19 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, b8 %val, i32 12 | |
| ret b32 %result | |
| } | |
| define b64 @test_bitinsert_val_b8_into_b64_const_top(b64 %base, b8 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b8_into_b64_const_top: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rldimi 3, 4, 56, 0 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b64 %base, b8 %val, i32 56 | |
| ret b64 %result | |
| } | |
| define b8 @test_bitinsert_val_b1_into_b8(b8 %base, b1 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b1_into_b8: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrlwi 4, 4, 31 | |
| ; CHECK-NEXT: li 6, -2 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: rotlw 5, 6, 5 | |
| ; CHECK-NEXT: and 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b8 %base, b1 %val, i32 %off | |
| ret b8 %result | |
| } | |
| define b32 @test_bitinsert_val_b1_into_b32_const_top(b32 %base, b1 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b1_into_b32_const_top: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rlwimi 3, 4, 31, 0, 0 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, b1 %val, i32 31 | |
| ret b32 %result | |
| } | |
| define b21 @test_bitinsert_val_b21_full(b21 %base, b21 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b21_full: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: mr 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b21 %base, b21 %val, i32 0 | |
| ret b21 %result | |
| } | |
| define b32 @test_bitinsert_val_b21_into_b32_var(b32 %base, b21 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b21_into_b32_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lis 6, 31 | |
| ; CHECK-NEXT: clrlwi 4, 4, 11 | |
| ; CHECK-NEXT: ori 6, 6, 65535 | |
| ; CHECK-NEXT: slw 4, 4, 5 | |
| ; CHECK-NEXT: slw 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, b21 %val, i32 %off | |
| ret b32 %result | |
| } | |
| define b32 @test_bitinsert_val_b21_into_b32_const_top(b32 %base, b21 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b21_into_b32_const_top: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rlwimi 3, 4, 11, 0, 20 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b32 %base, b21 %val, i32 11 | |
| ret b32 %result | |
| } | |
| define b64 @test_bitinsert_val_b21_into_b64_var(b64 %base, b21 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b21_into_b64_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lis 6, 31 | |
| ; CHECK-NEXT: clrldi 4, 4, 43 | |
| ; CHECK-NEXT: ori 6, 6, 65535 | |
| ; CHECK-NEXT: sld 4, 4, 5 | |
| ; CHECK-NEXT: sld 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b64 %base, b21 %val, i32 %off | |
| ret b64 %result | |
| } | |
| define b128 @test_bitinsert_val_b123_into_b128_var(b128 %base, b123 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b123_into_b128_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clrldi 5, 5, 5 | |
| ; CHECK-NEXT: subfic 8, 7, 64 | |
| ; CHECK-NEXT: li 11, -1 | |
| ; CHECK-NEXT: sld 5, 5, 7 | |
| ; CHECK-NEXT: srd 9, 6, 8 | |
| ; CHECK-NEXT: srd 8, 11, 8 | |
| ; CHECK-NEXT: or 5, 5, 9 | |
| ; CHECK-NEXT: addi 9, 7, -64 | |
| ; CHECK-NEXT: sld 10, 6, 9 | |
| ; CHECK-NEXT: sld 9, 11, 9 | |
| ; CHECK-NEXT: or 5, 5, 10 | |
| ; CHECK-NEXT: li 10, -1 | |
| ; CHECK-NEXT: rldic 10, 10, 0, 5 | |
| ; CHECK-NEXT: sld 10, 10, 7 | |
| ; CHECK-NEXT: or 8, 10, 8 | |
| ; CHECK-NEXT: or 8, 8, 9 | |
| ; CHECK-NEXT: andc 3, 3, 8 | |
| ; CHECK-NEXT: or 3, 3, 5 | |
| ; CHECK-NEXT: sld 5, 6, 7 | |
| ; CHECK-NEXT: sld 6, 11, 7 | |
| ; CHECK-NEXT: andc 4, 4, 6 | |
| ; CHECK-NEXT: or 4, 4, 5 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b128 %base, b123 %val, i32 %off | |
| ret b128 %result | |
| } | |
| define b128 @test_bitinsert_val_b123_into_b128_const_top(b128 %base, b123 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b123_into_b128_const_top: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rotldi 3, 6, 5 | |
| ; CHECK-NEXT: rldimi 4, 6, 5, 0 | |
| ; CHECK-NEXT: rldimi 3, 5, 5, 0 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b128 %base, b123 %val, i32 5 | |
| ret b128 %result | |
| } | |
| define b231 @test_bitinsert_val_b123_into_b231_var(b231 %base, b123 %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_val_b123_into_b231_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: li 10, -1 | |
| ; CHECK-NEXT: std 28, -32(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: xxlxor 0, 0, 0 | |
| ; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: li 11, 48 | |
| ; CHECK-NEXT: addi 12, 1, -192 | |
| ; CHECK-NEXT: li 0, 32 | |
| ; CHECK-NEXT: addi 30, 1, -128 | |
| ; CHECK-NEXT: li 29, -1 | |
| ; CHECK-NEXT: clrldi 7, 7, 5 | |
| ; CHECK-NEXT: rldic 28, 10, 0, 5 | |
| ; CHECK-NEXT: std 27, -40(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: rlwinm 27, 9, 29, 27, 28 | |
| ; CHECK-NEXT: std 24, -64(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 25, -56(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: std 26, -48(1) # 8-byte Folded Spill | |
| ; CHECK-NEXT: stxvw4x 0, 12, 11 | |
| ; CHECK-NEXT: stxvw4x 0, 12, 0 | |
| ; CHECK-NEXT: stxvw4x 0, 30, 11 | |
| ; CHECK-NEXT: stxvw4x 0, 30, 0 | |
| ; CHECK-NEXT: stxvw4x 0, 0, 12 | |
| ; CHECK-NEXT: clrlwi 9, 9, 26 | |
| ; CHECK-NEXT: mr 11, 27 | |
| ; CHECK-NEXT: stxvw4x 0, 0, 30 | |
| ; CHECK-NEXT: std 8, -168(1) | |
| ; CHECK-NEXT: std 7, -176(1) | |
| ; CHECK-NEXT: std 29, -104(1) | |
| ; CHECK-NEXT: std 28, -112(1) | |
| ; CHECK-NEXT: ldux 7, 27, 30 | |
| ; CHECK-NEXT: ld 8, 8(27) | |
| ; CHECK-NEXT: ld 0, 16(27) | |
| ; CHECK-NEXT: subfic 28, 9, 64 | |
| ; CHECK-NEXT: ldux 12, 11, 12 | |
| ; CHECK-NEXT: ld 30, 16(11) | |
| ; CHECK-NEXT: ld 29, 8(11) | |
| ; CHECK-NEXT: srd 26, 0, 28 | |
| ; CHECK-NEXT: sld 25, 8, 9 | |
| ; CHECK-NEXT: ld 11, 24(11) | |
| ; CHECK-NEXT: ld 27, 24(27) | |
| ; CHECK-NEXT: srd 24, 30, 28 | |
| ; CHECK-NEXT: sld 30, 30, 9 | |
| ; CHECK-NEXT: sld 0, 0, 9 | |
| ; CHECK-NEXT: sld 7, 7, 9 | |
| ; CHECK-NEXT: or 26, 25, 26 | |
| ; CHECK-NEXT: srd 8, 8, 28 | |
| ; CHECK-NEXT: or 7, 7, 8 | |
| ; CHECK-NEXT: rldic 8, 10, 0, 25 | |
| ; CHECK-NEXT: sld 25, 29, 9 | |
| ; CHECK-NEXT: sld 12, 12, 9 | |
| ; CHECK-NEXT: andc 4, 4, 26 | |
| ; CHECK-NEXT: srd 26, 11, 28 | |
| ; CHECK-NEXT: xor 7, 7, 8 | |
| ; CHECK-NEXT: sld 8, 27, 9 | |
| ; CHECK-NEXT: or 25, 25, 24 | |
| ; CHECK-NEXT: ld 24, -64(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 30, 30, 26 | |
| ; CHECK-NEXT: srd 26, 27, 28 | |
| ; CHECK-NEXT: and 3, 3, 7 | |
| ; CHECK-NEXT: sld 7, 11, 9 | |
| ; CHECK-NEXT: andc 6, 6, 8 | |
| ; CHECK-NEXT: or 4, 4, 25 | |
| ; CHECK-NEXT: ld 27, -40(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: ld 25, -56(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 0, 0, 26 | |
| ; CHECK-NEXT: or 6, 6, 7 | |
| ; CHECK-NEXT: ld 26, -48(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: andc 5, 5, 0 | |
| ; CHECK-NEXT: srd 0, 29, 28 | |
| ; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: ld 28, -32(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 12, 12, 0 | |
| ; CHECK-NEXT: or 5, 5, 30 | |
| ; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload | |
| ; CHECK-NEXT: or 3, 3, 12 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b231 %base, b123 %val, i32 %off | |
| ret b231 %result | |
| } | |
| define b231 @test_bitinsert_val_b123_into_b231_const_wordcross(b231 %base, b123 %val) { | |
| ; CHECK-LABEL: test_bitinsert_val_b123_into_b231_const_wordcross: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rotldi 5, 7, 60 | |
| ; CHECK-NEXT: rldimi 6, 8, 60, 0 | |
| ; CHECK-NEXT: clrldi 3, 3, 25 | |
| ; CHECK-NEXT: rldimi 4, 5, 0, 9 | |
| ; CHECK-NEXT: rotldi 5, 8, 60 | |
| ; CHECK-NEXT: rldimi 5, 7, 60, 0 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b231 %base, b123 %val, i32 60 | |
| ret b231 %result | |
| } | |
| ; pointer values | |
| define b64 @test_bitinsert_ptr_var(b64 %base, ptr %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_ptr_var: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: li 6, -1 | |
| ; CHECK-NEXT: sld 4, 4, 5 | |
| ; CHECK-NEXT: sld 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b64 %base, ptr %val, i32 %off | |
| ret b64 %result | |
| } | |
| define b128 @test_bitinsert_ptr_const(b128 %base, ptr %val) { | |
| ; CHECK-LABEL: test_bitinsert_ptr_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rldimi 4, 5, 32, 0 | |
| ; CHECK-NEXT: rotldi 5, 5, 32 | |
| ; CHECK-NEXT: rldimi 3, 5, 0, 32 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b128 %base, ptr %val, i32 32 | |
| ret b128 %result | |
| } | |
| ; pointers in non-default address spaces | |
| define b64 @test_bitinsert_ptr_addrspace1(b64 %base, ptr addrspace(1) %val, i32 %off) { | |
| ; CHECK-LABEL: test_bitinsert_ptr_addrspace1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: li 6, -1 | |
| ; CHECK-NEXT: sld 4, 4, 5 | |
| ; CHECK-NEXT: sld 5, 6, 5 | |
| ; CHECK-NEXT: andc 3, 3, 5 | |
| ; CHECK-NEXT: or 3, 3, 4 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b64 %base, ptr addrspace(1) %val, i32 %off | |
| ret b64 %result | |
| } | |
| define b128 @test_bitinsert_ptr_addrspace3_const(b128 %base, ptr addrspace(3) %val) { | |
| ; CHECK-LABEL: test_bitinsert_ptr_addrspace3_const: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: rldimi 4, 5, 16, 0 | |
| ; CHECK-NEXT: rotldi 5, 5, 16 | |
| ; CHECK-NEXT: rldimi 3, 5, 0, 48 | |
| ; CHECK-NEXT: blr | |
| %result = bitinsert b128 %base, ptr addrspace(3) %val, i32 16 | |
| ret b128 %result | |
| } |