| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs < %s | FileCheck %s |
| |
| define i64 @cntsb() { |
| ; CHECK-LABEL: cntsb: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x0, #1 |
| ; CHECK-NEXT: ret |
| %1 = call i64 @llvm.aarch64.sme.cntsd() |
| %res = shl nuw nsw i64 %1, 3 |
| ret i64 %res |
| } |
| |
| define i64 @cntsh() { |
| ; CHECK-LABEL: cntsh: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #1 |
| ; CHECK-NEXT: lsr x0, x8, #1 |
| ; CHECK-NEXT: ret |
| %1 = call i64 @llvm.aarch64.sme.cntsd() |
| %res = shl nuw nsw i64 %1, 2 |
| ret i64 %res |
| } |
| |
| define i64 @cntsw() { |
| ; CHECK-LABEL: cntsw: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #1 |
| ; CHECK-NEXT: lsr x0, x8, #2 |
| ; CHECK-NEXT: ret |
| %1 = call i64 @llvm.aarch64.sme.cntsd() |
| %res = shl nuw nsw i64 %1, 1 |
| ret i64 %res |
| } |
| |
| define i64 @cntsd() { |
| ; CHECK-LABEL: cntsd: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #1 |
| ; CHECK-NEXT: lsr x0, x8, #3 |
| ; CHECK-NEXT: ret |
| %res = call i64 @llvm.aarch64.sme.cntsd() |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsb_mul() { |
| ; CHECK-LABEL: sme_cntsb_mul: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x0, #4 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 3 |
| %res = mul nuw nsw i64 %shl, 4 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsh_mul() { |
| ; CHECK-LABEL: sme_cntsh_mul: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x0, #4 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 2 |
| %res = mul nuw nsw i64 %shl, 8 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsw_mul() { |
| ; CHECK-LABEL: sme_cntsw_mul: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x0, #4 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 1 |
| %res = mul nuw nsw i64 %shl, 16 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsd_mul() { |
| ; CHECK-LABEL: sme_cntsd_mul: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x0, #4 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %res = mul nuw nsw i64 %v, 32 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsb_mul_pos() { |
| ; CHECK-LABEL: sme_cntsb_mul_pos: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #24 |
| ; CHECK-NEXT: lsl x0, x8, #2 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 3 |
| %res = mul nuw nsw i64 %shl, 96 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsh_mul_pos() { |
| ; CHECK-LABEL: sme_cntsh_mul_pos: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #3 |
| ; CHECK-NEXT: lsr x0, x8, #1 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 2 |
| %res = mul nuw nsw i64 %shl, 3 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsw_mul_pos() { |
| ; CHECK-LABEL: sme_cntsw_mul_pos: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #31 |
| ; CHECK-NEXT: lsr x0, x8, #1 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 1 |
| %res = mul nuw nsw i64 %shl, 62 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsd_mul_pos() { |
| ; CHECK-LABEL: sme_cntsd_mul_pos: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #31 |
| ; CHECK-NEXT: lsl x0, x8, #2 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %res = mul nuw nsw i64 %v, 992 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsb_mul_neg() { |
| ; CHECK-LABEL: sme_cntsb_mul_neg: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #-24 |
| ; CHECK-NEXT: lsl x0, x8, #2 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 3 |
| %res = mul nuw nsw i64 %shl, -96 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsh_mul_neg() { |
| ; CHECK-LABEL: sme_cntsh_mul_neg: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #-3 |
| ; CHECK-NEXT: lsr x0, x8, #1 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 2 |
| %res = mul nuw nsw i64 %shl, -3 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsw_mul_neg() { |
| ; CHECK-LABEL: sme_cntsw_mul_neg: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #-31 |
| ; CHECK-NEXT: lsl x0, x8, #3 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %shl = shl nuw nsw i64 %v, 1 |
| %res = mul nuw nsw i64 %shl, -992 |
| ret i64 %res |
| } |
| |
| define i64 @sme_cntsd_mul_neg() { |
| ; CHECK-LABEL: sme_cntsd_mul_neg: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #-3 |
| ; CHECK-NEXT: lsr x0, x8, #3 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %res = mul nuw nsw i64 %v, -3 |
| ret i64 %res |
| } |
| |
| ; Negative test for optimization failure |
| define i64 @sme_cntsd_mul_fail() { |
| ; CHECK-LABEL: sme_cntsd_mul_fail: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: rdsvl x8, #1 |
| ; CHECK-NEXT: mov w9, #993 // =0x3e1 |
| ; CHECK-NEXT: lsr x8, x8, #3 |
| ; CHECK-NEXT: mul x0, x8, x9 |
| ; CHECK-NEXT: ret |
| %v = call i64 @llvm.aarch64.sme.cntsd() |
| %res = mul nuw nsw i64 %v, 993 |
| ret i64 %res |
| } |
| |