545 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -force-streaming -verify-machineinstrs < %s | FileCheck %s3 4target triple = "aarch64-linux"5 6; Widening7define void @mop4a_za32_s8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {8; CHECK-LABEL: mop4a_za32_s8:9; CHECK: // %bb.0:10; CHECK-NEXT: mov z25.d, z3.d11; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z112; CHECK-NEXT: mov z24.d, z2.d13; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z114; CHECK-NEXT: smop4a za0.s, { z0.b, z1.b }, { z24.b, z25.b }15; CHECK-NEXT: ret16 call void @llvm.aarch64.sme.smop4a.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)17 ret void18}19 20define void @mop4s_za32_s8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {21; CHECK-LABEL: mop4s_za32_s8:22; CHECK: // %bb.0:23; CHECK-NEXT: mov z25.d, z3.d24; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z125; CHECK-NEXT: mov z24.d, z2.d26; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z127; CHECK-NEXT: smop4s za0.s, { z0.b, z1.b }, { z24.b, z25.b }28; CHECK-NEXT: ret29 call void @llvm.aarch64.sme.smop4s.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)30 ret void31}32 33define void @mop4a_za32_u8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {34; CHECK-LABEL: mop4a_za32_u8:35; CHECK: // %bb.0:36; CHECK-NEXT: mov z25.d, z3.d37; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z138; CHECK-NEXT: mov z24.d, z2.d39; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z140; CHECK-NEXT: umop4a za0.s, { z0.b, z1.b }, { z24.b, z25.b }41; CHECK-NEXT: ret42 call void @llvm.aarch64.sme.umop4a.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)43 ret void44}45 46define void @mop4s_za32_u8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {47; CHECK-LABEL: mop4s_za32_u8:48; CHECK: // %bb.0:49; CHECK-NEXT: mov z25.d, z3.d50; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z151; CHECK-NEXT: mov z24.d, z2.d52; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z153; CHECK-NEXT: umop4s za0.s, { z0.b, z1.b }, { z24.b, z25.b }54; CHECK-NEXT: ret55 call void @llvm.aarch64.sme.umop4s.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)56 ret void57}58 59define void @mop4a_za32_s8_u8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {60; CHECK-LABEL: mop4a_za32_s8_u8:61; CHECK: // %bb.0:62; CHECK-NEXT: mov z25.d, z3.d63; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z164; CHECK-NEXT: mov z24.d, z2.d65; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z166; CHECK-NEXT: sumop4a za0.s, { z0.b, z1.b }, { z24.b, z25.b }67; CHECK-NEXT: ret68 call void @llvm.aarch64.sme.sumop4a.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)69 ret void70}71 72define void @mop4s_za32_s8_u8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {73; CHECK-LABEL: mop4s_za32_s8_u8:74; CHECK: // %bb.0:75; CHECK-NEXT: mov z25.d, z3.d76; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z177; CHECK-NEXT: mov z24.d, z2.d78; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z179; CHECK-NEXT: sumop4s za0.s, { z0.b, z1.b }, { z24.b, z25.b }80; CHECK-NEXT: ret81 call void @llvm.aarch64.sme.sumop4s.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)82 ret void83}84 85define void @mop4a_za32_u8_s8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {86; CHECK-LABEL: mop4a_za32_u8_s8:87; CHECK: // %bb.0:88; CHECK-NEXT: mov z25.d, z3.d89; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z190; CHECK-NEXT: mov z24.d, z2.d91; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z192; CHECK-NEXT: usmop4a za0.s, { z0.b, z1.b }, { z24.b, z25.b }93; CHECK-NEXT: ret94 call void @llvm.aarch64.sme.usmop4a.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)95 ret void96}97 98define void @mop4s_za32_u8_s8(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {99; CHECK-LABEL: mop4s_za32_u8_s8:100; CHECK: // %bb.0:101; CHECK-NEXT: mov z25.d, z3.d102; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1103; CHECK-NEXT: mov z24.d, z2.d104; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1105; CHECK-NEXT: usmop4s za0.s, { z0.b, z1.b }, { z24.b, z25.b }106; CHECK-NEXT: ret107 call void @llvm.aarch64.sme.usmop4s.wide.2x2.nxv16i8(i32 0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)108 ret void109}110 111 112define void @mop4a_za32_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {113; CHECK-LABEL: mop4a_za32_s16:114; CHECK: // %bb.0:115; CHECK-NEXT: mov z25.d, z3.d116; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1117; CHECK-NEXT: mov z24.d, z2.d118; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1119; CHECK-NEXT: smop4a za0.s, { z0.h, z1.h }, { z24.h, z25.h }120; CHECK-NEXT: ret121 call void @llvm.aarch64.sme.smop4a.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)122 ret void123}124 125define void @mop4s_za32_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {126; CHECK-LABEL: mop4s_za32_s16:127; CHECK: // %bb.0:128; CHECK-NEXT: mov z25.d, z3.d129; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1130; CHECK-NEXT: mov z24.d, z2.d131; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1132; CHECK-NEXT: smop4s za0.s, { z0.h, z1.h }, { z24.h, z25.h }133; CHECK-NEXT: ret134 call void @llvm.aarch64.sme.smop4s.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)135 ret void136}137 138define void @mop4a_za32_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {139; CHECK-LABEL: mop4a_za32_u16:140; CHECK: // %bb.0:141; CHECK-NEXT: mov z25.d, z3.d142; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1143; CHECK-NEXT: mov z24.d, z2.d144; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1145; CHECK-NEXT: umop4a za0.s, { z0.h, z1.h }, { z24.h, z25.h }146; CHECK-NEXT: ret147 call void @llvm.aarch64.sme.umop4a.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)148 ret void149}150 151define void @mop4s_za32_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {152; CHECK-LABEL: mop4s_za32_u16:153; CHECK: // %bb.0:154; CHECK-NEXT: mov z25.d, z3.d155; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1156; CHECK-NEXT: mov z24.d, z2.d157; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1158; CHECK-NEXT: umop4s za0.s, { z0.h, z1.h }, { z24.h, z25.h }159; CHECK-NEXT: ret160 call void @llvm.aarch64.sme.umop4s.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)161 ret void162}163 164define void @mop4a_za32_f16(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {165; CHECK-LABEL: mop4a_za32_f16:166; CHECK: // %bb.0:167; CHECK-NEXT: mov z25.d, z3.d168; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1169; CHECK-NEXT: mov z24.d, z2.d170; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1171; CHECK-NEXT: fmop4a za0.s, { z0.h, z1.h }, { z24.h, z25.h }172; CHECK-NEXT: ret173 call void @llvm.aarch64.sme.mop4a.wide.2x2.nxv8f16(i32 0, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)174 ret void175}176 177define void @mop4s_za32_f16(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {178; CHECK-LABEL: mop4s_za32_f16:179; CHECK: // %bb.0:180; CHECK-NEXT: mov z25.d, z3.d181; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1182; CHECK-NEXT: mov z24.d, z2.d183; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1184; CHECK-NEXT: fmop4s za0.s, { z0.h, z1.h }, { z24.h, z25.h }185; CHECK-NEXT: ret186 call void @llvm.aarch64.sme.mop4s.wide.2x2.nxv8f16(i32 0, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)187 ret void188}189 190define void @mop4a_za32_bf16(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {191; CHECK-LABEL: mop4a_za32_bf16:192; CHECK: // %bb.0:193; CHECK-NEXT: mov z25.d, z3.d194; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1195; CHECK-NEXT: mov z24.d, z2.d196; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1197; CHECK-NEXT: bfmop4a za0.s, { z0.h, z1.h }, { z24.h, z25.h }198; CHECK-NEXT: ret199 call void @llvm.aarch64.sme.mop4a.wide.2x2.nxv8bf16(i32 0, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)200 ret void201}202 203define void @mop4s_za32_bf16(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {204; CHECK-LABEL: mop4s_za32_bf16:205; CHECK: // %bb.0:206; CHECK-NEXT: mov z25.d, z3.d207; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1208; CHECK-NEXT: mov z24.d, z2.d209; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1210; CHECK-NEXT: bfmop4s za0.s, { z0.h, z1.h }, { z24.h, z25.h }211; CHECK-NEXT: ret212 call void @llvm.aarch64.sme.mop4s.wide.2x2.nxv8bf16(i32 0, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)213 ret void214}215 216define void @mop4a_za64_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {217; CHECK-LABEL: mop4a_za64_s16:218; CHECK: // %bb.0:219; CHECK-NEXT: mov z25.d, z3.d220; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1221; CHECK-NEXT: mov z24.d, z2.d222; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1223; CHECK-NEXT: smop4a za0.d, { z0.h, z1.h }, { z24.h, z25.h }224; CHECK-NEXT: ret225 call void @llvm.aarch64.sme.smop4a.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)226 ret void227}228 229define void @mop4s_za64_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {230; CHECK-LABEL: mop4s_za64_s16:231; CHECK: // %bb.0:232; CHECK-NEXT: mov z25.d, z3.d233; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1234; CHECK-NEXT: mov z24.d, z2.d235; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1236; CHECK-NEXT: smop4s za0.d, { z0.h, z1.h }, { z24.h, z25.h }237; CHECK-NEXT: ret238 call void @llvm.aarch64.sme.smop4s.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)239 ret void240}241 242define void @mop4a_za64_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {243; CHECK-LABEL: mop4a_za64_u16:244; CHECK: // %bb.0:245; CHECK-NEXT: mov z25.d, z3.d246; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1247; CHECK-NEXT: mov z24.d, z2.d248; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1249; CHECK-NEXT: umop4a za0.d, { z0.h, z1.h }, { z24.h, z25.h }250; CHECK-NEXT: ret251 call void @llvm.aarch64.sme.umop4a.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)252 ret void253}254 255define void @mop4s_za64_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {256; CHECK-LABEL: mop4s_za64_u16:257; CHECK: // %bb.0:258; CHECK-NEXT: mov z25.d, z3.d259; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1260; CHECK-NEXT: mov z24.d, z2.d261; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1262; CHECK-NEXT: umop4s za0.d, { z0.h, z1.h }, { z24.h, z25.h }263; CHECK-NEXT: ret264 call void @llvm.aarch64.sme.umop4s.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)265 ret void266}267 268define void @mop4a_za64_s16_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {269; CHECK-LABEL: mop4a_za64_s16_u16:270; CHECK: // %bb.0:271; CHECK-NEXT: mov z25.d, z3.d272; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1273; CHECK-NEXT: mov z24.d, z2.d274; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1275; CHECK-NEXT: sumop4a za0.d, { z0.h, z1.h }, { z24.h, z25.h }276; CHECK-NEXT: ret277 call void @llvm.aarch64.sme.sumop4a.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)278 ret void279}280 281define void @mop4s_za64_s16_u16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {282; CHECK-LABEL: mop4s_za64_s16_u16:283; CHECK: // %bb.0:284; CHECK-NEXT: mov z25.d, z3.d285; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1286; CHECK-NEXT: mov z24.d, z2.d287; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1288; CHECK-NEXT: sumop4s za0.d, { z0.h, z1.h }, { z24.h, z25.h }289; CHECK-NEXT: ret290 call void @llvm.aarch64.sme.sumop4s.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)291 ret void292}293 294define void @mop4a_za64_u16_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {295; CHECK-LABEL: mop4a_za64_u16_s16:296; CHECK: // %bb.0:297; CHECK-NEXT: mov z25.d, z3.d298; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1299; CHECK-NEXT: mov z24.d, z2.d300; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1301; CHECK-NEXT: usmop4a za0.d, { z0.h, z1.h }, { z24.h, z25.h }302; CHECK-NEXT: ret303 call void @llvm.aarch64.sme.usmop4a.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)304 ret void305}306 307define void @mop4s_za64_u16_s16(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {308; CHECK-LABEL: mop4s_za64_u16_s16:309; CHECK: // %bb.0:310; CHECK-NEXT: mov z25.d, z3.d311; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1312; CHECK-NEXT: mov z24.d, z2.d313; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1314; CHECK-NEXT: usmop4s za0.d, { z0.h, z1.h }, { z24.h, z25.h }315; CHECK-NEXT: ret316 call void @llvm.aarch64.sme.usmop4s.za64.wide.2x2.nxv8i16(i32 0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)317 ret void318}319 320; Non-widening321define void @mop4a_za16_f16(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {322; CHECK-LABEL: mop4a_za16_f16:323; CHECK: // %bb.0:324; CHECK-NEXT: mov z25.d, z3.d325; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1326; CHECK-NEXT: mov z24.d, z2.d327; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1328; CHECK-NEXT: fmop4a za0.h, { z0.h, z1.h }, { z24.h, z25.h }329; CHECK-NEXT: ret330 call void @llvm.aarch64.sme.mop4a.2x2.nxv8f16(i32 0, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)331 ret void332}333 334define void @mop4s_za16_f16(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {335; CHECK-LABEL: mop4s_za16_f16:336; CHECK: // %bb.0:337; CHECK-NEXT: mov z25.d, z3.d338; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1339; CHECK-NEXT: mov z24.d, z2.d340; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1341; CHECK-NEXT: fmop4s za0.h, { z0.h, z1.h }, { z24.h, z25.h }342; CHECK-NEXT: ret343 call void @llvm.aarch64.sme.mop4s.2x2.nxv8f16(i32 0, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)344 ret void345}346 347define void @mop4a_za32_f32(<vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2) #0 {348; CHECK-LABEL: mop4a_za32_f32:349; CHECK: // %bb.0:350; CHECK-NEXT: mov z25.d, z3.d351; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1352; CHECK-NEXT: mov z24.d, z2.d353; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1354; CHECK-NEXT: fmop4a za0.s, { z0.s, z1.s }, { z24.s, z25.s }355; CHECK-NEXT: ret356 call void @llvm.aarch64.sme.mop4a.2x2.nxv4f32(i32 0, <vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2)357 ret void358}359 360define void @mop4s_za32_f32(<vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2) #0 {361; CHECK-LABEL: mop4s_za32_f32:362; CHECK: // %bb.0:363; CHECK-NEXT: mov z25.d, z3.d364; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1365; CHECK-NEXT: mov z24.d, z2.d366; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1367; CHECK-NEXT: fmop4s za0.s, { z0.s, z1.s }, { z24.s, z25.s }368; CHECK-NEXT: ret369 call void @llvm.aarch64.sme.mop4s.2x2.nxv4f32(i32 0, <vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2)370 ret void371}372 373define void @mop4a_za64_f64(<vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2) #0 {374; CHECK-LABEL: mop4a_za64_f64:375; CHECK: // %bb.0:376; CHECK-NEXT: mov z25.d, z3.d377; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1378; CHECK-NEXT: mov z24.d, z2.d379; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1380; CHECK-NEXT: fmop4a za0.d, { z0.d, z1.d }, { z24.d, z25.d }381; CHECK-NEXT: ret382 call void @llvm.aarch64.sme.mop4a.2x2.nxv2f64(i32 0, <vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2)383 ret void384}385 386define void @mop4s_za64_f64(<vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2) #0 {387; CHECK-LABEL: mop4s_za64_f64:388; CHECK: // %bb.0:389; CHECK-NEXT: mov z25.d, z3.d390; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1391; CHECK-NEXT: mov z24.d, z2.d392; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1393; CHECK-NEXT: fmop4s za0.d, { z0.d, z1.d }, { z24.d, z25.d }394; CHECK-NEXT: ret395 call void @llvm.aarch64.sme.mop4s.2x2.nxv2f64(i32 0, <vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2)396 ret void397}398 399define void @mop4a_za16_bf16(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {400; CHECK-LABEL: mop4a_za16_bf16:401; CHECK: // %bb.0:402; CHECK-NEXT: mov z25.d, z3.d403; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1404; CHECK-NEXT: mov z24.d, z2.d405; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1406; CHECK-NEXT: bfmop4a za0.h, { z0.h, z1.h }, { z24.h, z25.h }407; CHECK-NEXT: ret408 call void @llvm.aarch64.sme.mop4a.2x2.nxv8bf16(i32 0, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)409 ret void410}411 412define void @mop4s_za16_bf16(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {413; CHECK-LABEL: mop4s_za16_bf16:414; CHECK: // %bb.0:415; CHECK-NEXT: mov z25.d, z3.d416; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1417; CHECK-NEXT: mov z24.d, z2.d418; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1419; CHECK-NEXT: bfmop4s za0.h, { z0.h, z1.h }, { z24.h, z25.h }420; CHECK-NEXT: ret421 call void @llvm.aarch64.sme.mop4s.2x2.nxv8bf16(i32 0, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)422 ret void423}424 425; Tile limits426 427define void @mop4s_za32_s8_limit(<vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) #0 {428; CHECK-LABEL: mop4s_za32_s8_limit:429; CHECK: // %bb.0:430; CHECK-NEXT: mov z25.d, z3.d431; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1432; CHECK-NEXT: mov z24.d, z2.d433; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1434; CHECK-NEXT: smop4s za3.s, { z0.b, z1.b }, { z24.b, z25.b }435; CHECK-NEXT: ret436 call void @llvm.aarch64.sme.smop4s.wide.2x2.nxv16i8(i32 3, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)437 ret void438}439 440define void @mop4s_za32_s16_limit(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {441; CHECK-LABEL: mop4s_za32_s16_limit:442; CHECK: // %bb.0:443; CHECK-NEXT: mov z25.d, z3.d444; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1445; CHECK-NEXT: mov z24.d, z2.d446; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1447; CHECK-NEXT: smop4s za3.s, { z0.h, z1.h }, { z24.h, z25.h }448; CHECK-NEXT: ret449 call void @llvm.aarch64.sme.smop4s.wide.2x2.nxv8i16(i32 3, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)450 ret void451}452 453define void @mop4s_za32_f16_limit(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {454; CHECK-LABEL: mop4s_za32_f16_limit:455; CHECK: // %bb.0:456; CHECK-NEXT: mov z25.d, z3.d457; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1458; CHECK-NEXT: mov z24.d, z2.d459; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1460; CHECK-NEXT: fmop4s za3.s, { z0.h, z1.h }, { z24.h, z25.h }461; CHECK-NEXT: ret462 call void @llvm.aarch64.sme.mop4s.wide.2x2.nxv8f16(i32 3, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)463 ret void464}465 466define void @mop4s_za32_bf16_limit(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {467; CHECK-LABEL: mop4s_za32_bf16_limit:468; CHECK: // %bb.0:469; CHECK-NEXT: mov z25.d, z3.d470; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1471; CHECK-NEXT: mov z24.d, z2.d472; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1473; CHECK-NEXT: bfmop4s za3.s, { z0.h, z1.h }, { z24.h, z25.h }474; CHECK-NEXT: ret475 call void @llvm.aarch64.sme.mop4s.wide.2x2.nxv8bf16(i32 3, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)476 ret void477}478 479define void @mop4s_za64_s16_limit(<vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) #0 {480; CHECK-LABEL: mop4s_za64_s16_limit:481; CHECK: // %bb.0:482; CHECK-NEXT: mov z25.d, z3.d483; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1484; CHECK-NEXT: mov z24.d, z2.d485; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1486; CHECK-NEXT: smop4s za7.d, { z0.h, z1.h }, { z24.h, z25.h }487; CHECK-NEXT: ret488 call void @llvm.aarch64.sme.smop4s.za64.wide.2x2.nxv8i16(i32 7, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)489 ret void490}491 492define void @mop4s_za64_f64_limit(<vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2) #0 {493; CHECK-LABEL: mop4s_za64_f64_limit:494; CHECK: // %bb.0:495; CHECK-NEXT: mov z25.d, z3.d496; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1497; CHECK-NEXT: mov z24.d, z2.d498; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1499; CHECK-NEXT: fmop4s za7.d, { z0.d, z1.d }, { z24.d, z25.d }500; CHECK-NEXT: ret501 call void @llvm.aarch64.sme.mop4s.2x2.nxv2f64(i32 7, <vscale x 2 x double> %zn1, <vscale x 2 x double> %zn2, <vscale x 2 x double> %zm1, <vscale x 2 x double> %zm2)502 ret void503}504 505define void @mop4s_za32_f32_limit(<vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2) #0 {506; CHECK-LABEL: mop4s_za32_f32_limit:507; CHECK: // %bb.0:508; CHECK-NEXT: mov z25.d, z3.d509; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1510; CHECK-NEXT: mov z24.d, z2.d511; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1512; CHECK-NEXT: fmop4s za3.s, { z0.s, z1.s }, { z24.s, z25.s }513; CHECK-NEXT: ret514 call void @llvm.aarch64.sme.mop4s.2x2.nxv4f32(i32 3, <vscale x 4 x float> %zn1, <vscale x 4 x float> %zn2, <vscale x 4 x float> %zm1, <vscale x 4 x float> %zm2)515 ret void516}517 518define void @mop4s_za16_f16_limit(<vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2) #0 {519; CHECK-LABEL: mop4s_za16_f16_limit:520; CHECK: // %bb.0:521; CHECK-NEXT: mov z25.d, z3.d522; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1523; CHECK-NEXT: mov z24.d, z2.d524; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1525; CHECK-NEXT: fmop4s za1.h, { z0.h, z1.h }, { z24.h, z25.h }526; CHECK-NEXT: ret527 call void @llvm.aarch64.sme.mop4s.2x2.nxv8f16(i32 1, <vscale x 8 x half> %zn1, <vscale x 8 x half> %zn2, <vscale x 8 x half> %zm1, <vscale x 8 x half> %zm2)528 ret void529}530 531define void @mop4s_za16_bf16_limit(<vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2) #0 {532; CHECK-LABEL: mop4s_za16_bf16_limit:533; CHECK: // %bb.0:534; CHECK-NEXT: mov z25.d, z3.d535; CHECK-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1536; CHECK-NEXT: mov z24.d, z2.d537; CHECK-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1538; CHECK-NEXT: bfmop4s za1.h, { z0.h, z1.h }, { z24.h, z25.h }539; CHECK-NEXT: ret540 call void @llvm.aarch64.sme.mop4s.2x2.nxv8bf16(i32 1, <vscale x 8 x bfloat> %zn1, <vscale x 8 x bfloat> %zn2, <vscale x 8 x bfloat> %zm1, <vscale x 8 x bfloat> %zm2)541 ret void542}543 544attributes #0 = {nounwind "target-features" = "+sme-i16i64,+sme-f64f64,+sme-b16b16,+sme2p1,+bf16,+sme-f16f16,+sme-mop4" }545