; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -force-streaming < %s | FileCheck %s ; lookup table expand one register define {, , , } @luti4_i16( %x) { ; CHECK-LABEL: luti4_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: luti4 { z0.h - z3.h }, zt0, z0[1] ; CHECK-NEXT: ret %res = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8i16(i32 0, %x, i32 1) ret {, , , } %res } define {, , , } @luti4_i32( %x) { ; CHECK-LABEL: luti4_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: luti4 { z0.s - z3.s }, zt0, z0[1] ; CHECK-NEXT: ret %res = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4i32(i32 0, %x, i32 1) ret {, , , } %res } define {, , , } @luti4_bf16( %x) { ; CHECK-LABEL: luti4_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: luti4 { z0.h - z3.h }, zt0, z0[1] ; CHECK-NEXT: ret %res = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8bf16(i32 0, %x, i32 1) ret {, , , } %res } define {, , , } @luti4_f16( %x) { ; CHECK-LABEL: luti4_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: luti4 { z0.h - z3.h }, zt0, z0[1] ; CHECK-NEXT: ret %res = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8f16(i32 0, %x, i32 1) ret {, , , } %res } define {, , , } @luti4_f32( %x) { ; CHECK-LABEL: luti4_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: luti4 { z0.s - z3.s }, zt0, z0[1] ; CHECK-NEXT: ret %res = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4f32(i32 0, %x, i32 1) ret {, , , } %res } ; Tests multiple identical luti4 intrinsics with ZT0 loads interspersed, are not CSD'd. define void @test_multiple_luti4_zt_i8(ptr %ptrA, ptr %ptrB, %x) { ; CHECK-LABEL: test_multiple_luti4_zt_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr zt0, [x0] ; CHECK-NEXT: luti4 { z4.s - z7.s }, zt0, z0[1] ; CHECK-NEXT: // fake_use: $z4 ; CHECK-NEXT: ldr zt0, [x1] ; CHECK-NEXT: luti4 { z0.s - z3.s }, zt0, z0[1] ; CHECK-NEXT: // fake_use: $z0 ; CHECK-NEXT: ret tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr %ptrA) %res1 = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4f32(i32 0, %x, i32 1) tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr %ptrB) %res2 = call {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4f32(i32 0, %x, i32 1) call void (...) @llvm.fake.use({, , , } %res1) call void (...) @llvm.fake.use({, , , } %res2) ret void } declare {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8i16(i32, , i32) declare {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4i32(i32, , i32) declare {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8bf16(i32, , i32) declare {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv8f16(i32, , i32) declare {, , , } @llvm.aarch64.sme.luti4.lane.zt.x4.nxv4f32(i32, , i32)