| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=aarch64-none-linux-gnu < %s -o -| FileCheck %s |
| |
| define i32 @lsr_bfi(i32 %a) { |
| ; CHECK-LABEL: lsr_bfi: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: lsr w8, w0, #20 |
| ; CHECK-NEXT: bfi w0, w8, #4, #4 |
| ; CHECK-NEXT: ret |
| %and1 = and i32 %a, -241 |
| %1 = lshr i32 %a, 16 |
| %shl = and i32 %1, 240 |
| %or = or i32 %shl, %and1 |
| ret i32 %or |
| } |
| |
| define i32 @negative_lsr_bfi0(i32 %a) { |
| ; CHECK-LABEL: negative_lsr_bfi0: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: and w0, w0, #0xffffff0f |
| ; CHECK-NEXT: ret |
| %and1 = and i32 %a, -241 |
| %1 = lshr i32 %a, 28 |
| %shl = and i32 %1, 240 |
| %or = or i32 %shl, %and1 |
| ret i32 %or |
| } |
| |
| define i32 @negative_lsr_bfi1(i32 %a) { |
| ; CHECK-LABEL: negative_lsr_bfi1: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: lsr w8, w0, #16 |
| ; CHECK-NEXT: lsr w9, w8, #4 |
| ; CHECK-NEXT: bfi w0, w9, #4, #4 |
| ; CHECK-NEXT: add w0, w0, w8 |
| ; CHECK-NEXT: ret |
| %and1 = and i32 %a, -241 |
| %1 = lshr i32 %a, 16 |
| %shl = and i32 %1, 240 |
| %or = or i32 %shl, %and1 |
| %add = add i32 %or, %1 |
| ret i32 %add |
| } |
| |
| define i64 @lsr_bfix(i64 %a) { |
| ; CHECK-LABEL: lsr_bfix: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: lsr x8, x0, #20 |
| ; CHECK-NEXT: bfi x0, x8, #4, #4 |
| ; CHECK-NEXT: ret |
| %and1 = and i64 %a, -241 |
| %1 = lshr i64 %a, 16 |
| %shl = and i64 %1, 240 |
| %or = or i64 %shl, %and1 |
| ret i64 %or |
| } |
| |
| define i64 @negative_lsr_bfix0(i64 %a) { |
| ; CHECK-LABEL: negative_lsr_bfix0: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: and x0, x0, #0xffffffffffffff0f |
| ; CHECK-NEXT: ret |
| %and1 = and i64 %a, -241 |
| %1 = lshr i64 %a, 60 |
| %shl = and i64 %1, 240 |
| %or = or i64 %shl, %and1 |
| ret i64 %or |
| } |
| |
| define i64 @negative_lsr_bfix1(i64 %a) { |
| ; CHECK-LABEL: negative_lsr_bfix1: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: lsr x8, x0, #16 |
| ; CHECK-NEXT: lsr x9, x8, #4 |
| ; CHECK-NEXT: bfi x0, x9, #4, #4 |
| ; CHECK-NEXT: add x0, x0, x8 |
| ; CHECK-NEXT: ret |
| %and1 = and i64 %a, -241 |
| %1 = lshr i64 %a, 16 |
| %shl = and i64 %1, 240 |
| %or = or i64 %shl, %and1 |
| %add = add i64 %or, %1 |
| ret i64 %add |
| } |