667 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 -mattr=+sve2p1 < %s | FileCheck %s3; RUN: llc -mtriple=aarch64 -mattr=+sve,+sme2 < %s | FileCheck %s4; RUN: llc -mtriple=aarch64 -mattr=+sme2p1 -force-streaming < %s | FileCheck %s5; RUN: llc -mtriple=aarch64 -mattr=+sme,+sve2p1 -force-streaming < %s | FileCheck %s6 7; == WHILEGE ==8 9define <vscale x 16 x i1> @whilege_x2_nxv16i1(i64 %m, i64 %n) nounwind {10; CHECK-LABEL: whilege_x2_nxv16i1:11; CHECK: // %bb.0:12; CHECK-NEXT: whilege { p0.b, p1.b }, x0, x113; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p114; CHECK-NEXT: ret15 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilege.x2.nxv16i1(i64 %m, i64 %n)16 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 017 ret <vscale x 16 x i1> %res18}19 20define <vscale x 8 x i1> @whilege_x2_nxv8i1(i64 %m, i64 %n) nounwind {21; CHECK-LABEL: whilege_x2_nxv8i1:22; CHECK: // %bb.0:23; CHECK-NEXT: whilege { p0.h, p1.h }, x0, x124; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p125; CHECK-NEXT: ret26 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilege.x2.nxv8i1(i64 %m, i64 %n)27 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 028 ret <vscale x 8 x i1> %res29}30 31define <vscale x 4 x i1> @whilege_x2_nxv4i1(i64 %m, i64 %n) nounwind {32; CHECK-LABEL: whilege_x2_nxv4i1:33; CHECK: // %bb.0:34; CHECK-NEXT: whilege { p0.s, p1.s }, x0, x135; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p136; CHECK-NEXT: ret37 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilege.x2.nxv4i1(i64 %m, i64 %n)38 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 039 ret <vscale x 4 x i1> %res40}41 42define <vscale x 2 x i1> @whilege_x2_nxv2i1(i64 %m, i64 %n) nounwind {43; CHECK-LABEL: whilege_x2_nxv2i1:44; CHECK: // %bb.0:45; CHECK-NEXT: whilege { p0.d, p1.d }, x0, x146; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p147; CHECK-NEXT: ret48 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilege.x2.nxv2i1(i64 %m, i64 %n)49 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 050 ret <vscale x 2 x i1> %res51}52 53 54; == WHILEGT ==55 56define <vscale x 16 x i1> @whilegt_x2_nxv16i1(i64 %m, i64 %n) nounwind {57; CHECK-LABEL: whilegt_x2_nxv16i1:58; CHECK: // %bb.0:59; CHECK-NEXT: whilegt { p0.b, p1.b }, x0, x160; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p161; CHECK-NEXT: ret62 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv16i1(i64 %m, i64 %n)63 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 064 ret <vscale x 16 x i1> %res65}66 67define <vscale x 8 x i1> @whilegt_x2_nxv8i1(i64 %m, i64 %n) nounwind {68; CHECK-LABEL: whilegt_x2_nxv8i1:69; CHECK: // %bb.0:70; CHECK-NEXT: whilegt { p0.h, p1.h }, x0, x171; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p172; CHECK-NEXT: ret73 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv8i1(i64 %m, i64 %n)74 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 075 ret <vscale x 8 x i1> %res76}77 78define <vscale x 4 x i1> @whilegt_x2_nxv4i1(i64 %m, i64 %n) nounwind {79; CHECK-LABEL: whilegt_x2_nxv4i1:80; CHECK: // %bb.0:81; CHECK-NEXT: whilegt { p0.s, p1.s }, x0, x182; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p183; CHECK-NEXT: ret84 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv4i1(i64 %m, i64 %n)85 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 086 ret <vscale x 4 x i1> %res87}88 89define <vscale x 2 x i1> @whilegt_x2_nxv2i1(i64 %m, i64 %n) nounwind {90; CHECK-LABEL: whilegt_x2_nxv2i1:91; CHECK: // %bb.0:92; CHECK-NEXT: whilegt { p0.d, p1.d }, x0, x193; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p194; CHECK-NEXT: ret95 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv2i1(i64 %m, i64 %n)96 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 097 ret <vscale x 2 x i1> %res98}99 100 101; == WHILEHI ==102 103define <vscale x 16 x i1> @whilehi_x2_nxv16i1(i64 %m, i64 %n) nounwind {104; CHECK-LABEL: whilehi_x2_nxv16i1:105; CHECK: // %bb.0:106; CHECK-NEXT: whilehi { p0.b, p1.b }, x0, x1107; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1108; CHECK-NEXT: ret109 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv16i1(i64 %m, i64 %n)110 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0111 ret <vscale x 16 x i1> %res112}113 114define <vscale x 8 x i1> @whilehi_x2_nxv8i1(i64 %m, i64 %n) nounwind {115; CHECK-LABEL: whilehi_x2_nxv8i1:116; CHECK: // %bb.0:117; CHECK-NEXT: whilehi { p0.h, p1.h }, x0, x1118; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1119; CHECK-NEXT: ret120 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv8i1(i64 %m, i64 %n)121 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0122 ret <vscale x 8 x i1> %res123}124 125define <vscale x 4 x i1> @whilehi_x2_nxv4i1(i64 %m, i64 %n) nounwind {126; CHECK-LABEL: whilehi_x2_nxv4i1:127; CHECK: // %bb.0:128; CHECK-NEXT: whilehi { p0.s, p1.s }, x0, x1129; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1130; CHECK-NEXT: ret131 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv4i1(i64 %m, i64 %n)132 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0133 ret <vscale x 4 x i1> %res134}135 136define <vscale x 2 x i1> @whilehi_x2_nxv2i1(i64 %m, i64 %n) nounwind {137; CHECK-LABEL: whilehi_x2_nxv2i1:138; CHECK: // %bb.0:139; CHECK-NEXT: whilehi { p0.d, p1.d }, x0, x1140; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1141; CHECK-NEXT: ret142 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv2i1(i64 %m, i64 %n)143 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0144 ret <vscale x 2 x i1> %res145}146 147 148; == WHILEHS ==149 150define <vscale x 16 x i1> @whilehs_x2_nxv16i1(i64 %m, i64 %n) nounwind {151; CHECK-LABEL: whilehs_x2_nxv16i1:152; CHECK: // %bb.0:153; CHECK-NEXT: whilehs { p0.b, p1.b }, x0, x1154; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1155; CHECK-NEXT: ret156 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv16i1(i64 %m, i64 %n)157 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0158 ret <vscale x 16 x i1> %res159}160 161define <vscale x 8 x i1> @whilehs_x2_nxv8i1(i64 %m, i64 %n) nounwind {162; CHECK-LABEL: whilehs_x2_nxv8i1:163; CHECK: // %bb.0:164; CHECK-NEXT: whilehs { p0.h, p1.h }, x0, x1165; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1166; CHECK-NEXT: ret167 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv8i1(i64 %m, i64 %n)168 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0169 ret <vscale x 8 x i1> %res170}171 172define <vscale x 4 x i1> @whilehs_x2_nxv4i1(i64 %m, i64 %n) nounwind {173; CHECK-LABEL: whilehs_x2_nxv4i1:174; CHECK: // %bb.0:175; CHECK-NEXT: whilehs { p0.s, p1.s }, x0, x1176; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1177; CHECK-NEXT: ret178 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv4i1(i64 %m, i64 %n)179 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0180 ret <vscale x 4 x i1> %res181}182 183define <vscale x 2 x i1> @whilehs_x2_nxv2i1(i64 %m, i64 %n) nounwind {184; CHECK-LABEL: whilehs_x2_nxv2i1:185; CHECK: // %bb.0:186; CHECK-NEXT: whilehs { p0.d, p1.d }, x0, x1187; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1188; CHECK-NEXT: ret189 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv2i1(i64 %m, i64 %n)190 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0191 ret <vscale x 2 x i1> %res192}193 194 195; == WHILELE ==196 197define <vscale x 16 x i1> @whilele_x2_nxv16i1(i64 %m, i64 %n) nounwind {198; CHECK-LABEL: whilele_x2_nxv16i1:199; CHECK: // %bb.0:200; CHECK-NEXT: whilele { p0.b, p1.b }, x0, x1201; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1202; CHECK-NEXT: ret203 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilele.x2.nxv16i1(i64 %m, i64 %n)204 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0205 ret <vscale x 16 x i1> %res206}207 208define <vscale x 8 x i1> @whilele_x2_nxv8i1(i64 %m, i64 %n) nounwind {209; CHECK-LABEL: whilele_x2_nxv8i1:210; CHECK: // %bb.0:211; CHECK-NEXT: whilele { p0.h, p1.h }, x0, x1212; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1213; CHECK-NEXT: ret214 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilele.x2.nxv8i1(i64 %m, i64 %n)215 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0216 ret <vscale x 8 x i1> %res217}218 219define <vscale x 4 x i1> @whilele_x2_nxv4i1(i64 %m, i64 %n) nounwind {220; CHECK-LABEL: whilele_x2_nxv4i1:221; CHECK: // %bb.0:222; CHECK-NEXT: whilele { p0.s, p1.s }, x0, x1223; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1224; CHECK-NEXT: ret225 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilele.x2.nxv4i1(i64 %m, i64 %n)226 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0227 ret <vscale x 4 x i1> %res228}229 230define <vscale x 2 x i1> @whilele_x2_nxv2i1(i64 %m, i64 %n) nounwind {231; CHECK-LABEL: whilele_x2_nxv2i1:232; CHECK: // %bb.0:233; CHECK-NEXT: whilele { p0.d, p1.d }, x0, x1234; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1235; CHECK-NEXT: ret236 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilele.x2.nxv2i1(i64 %m, i64 %n)237 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0238 ret <vscale x 2 x i1> %res239}240 241 242; == WHILELO ==243 244define <vscale x 16 x i1> @whilelo_x2_nxv16i1(i64 %m, i64 %n) nounwind {245; CHECK-LABEL: whilelo_x2_nxv16i1:246; CHECK: // %bb.0:247; CHECK-NEXT: whilelo { p0.b, p1.b }, x0, x1248; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1249; CHECK-NEXT: ret250 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv16i1(i64 %m, i64 %n)251 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0252 ret <vscale x 16 x i1> %res253}254 255define <vscale x 8 x i1> @whilelo_x2_nxv8i1(i64 %m, i64 %n) nounwind {256; CHECK-LABEL: whilelo_x2_nxv8i1:257; CHECK: // %bb.0:258; CHECK-NEXT: whilelo { p0.h, p1.h }, x0, x1259; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1260; CHECK-NEXT: ret261 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv8i1(i64 %m, i64 %n)262 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0263 ret <vscale x 8 x i1> %res264}265 266define <vscale x 4 x i1> @whilelo_x2_nxv4i1(i64 %m, i64 %n) nounwind {267; CHECK-LABEL: whilelo_x2_nxv4i1:268; CHECK: // %bb.0:269; CHECK-NEXT: whilelo { p0.s, p1.s }, x0, x1270; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1271; CHECK-NEXT: ret272 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv4i1(i64 %m, i64 %n)273 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0274 ret <vscale x 4 x i1> %res275}276 277define <vscale x 2 x i1> @whilelo_x2_nxv2i1(i64 %m, i64 %n) nounwind {278; CHECK-LABEL: whilelo_x2_nxv2i1:279; CHECK: // %bb.0:280; CHECK-NEXT: whilelo { p0.d, p1.d }, x0, x1281; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1282; CHECK-NEXT: ret283 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv2i1(i64 %m, i64 %n)284 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0285 ret <vscale x 2 x i1> %res286}287 288 289; == WHILELS ==290 291define <vscale x 16 x i1> @whilels_x2_nxv16i1(i64 %m, i64 %n) nounwind {292; CHECK-LABEL: whilels_x2_nxv16i1:293; CHECK: // %bb.0:294; CHECK-NEXT: whilels { p0.b, p1.b }, x0, x1295; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1296; CHECK-NEXT: ret297 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilels.x2.nxv16i1(i64 %m, i64 %n)298 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0299 ret <vscale x 16 x i1> %res300}301 302define <vscale x 8 x i1> @whilels_x2_nxv8i1(i64 %m, i64 %n) nounwind {303; CHECK-LABEL: whilels_x2_nxv8i1:304; CHECK: // %bb.0:305; CHECK-NEXT: whilels { p0.h, p1.h }, x0, x1306; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1307; CHECK-NEXT: ret308 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilels.x2.nxv8i1(i64 %m, i64 %n)309 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0310 ret <vscale x 8 x i1> %res311}312 313define <vscale x 4 x i1> @whilels_x2_nxv4i1(i64 %m, i64 %n) nounwind {314; CHECK-LABEL: whilels_x2_nxv4i1:315; CHECK: // %bb.0:316; CHECK-NEXT: whilels { p0.s, p1.s }, x0, x1317; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1318; CHECK-NEXT: ret319 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilels.x2.nxv4i1(i64 %m, i64 %n)320 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0321 ret <vscale x 4 x i1> %res322}323 324define <vscale x 2 x i1> @whilels_x2_nxv2i1(i64 %m, i64 %n) nounwind {325; CHECK-LABEL: whilels_x2_nxv2i1:326; CHECK: // %bb.0:327; CHECK-NEXT: whilels { p0.d, p1.d }, x0, x1328; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1329; CHECK-NEXT: ret330 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilels.x2.nxv2i1(i64 %m, i64 %n)331 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0332 ret <vscale x 2 x i1> %res333}334 335 336; == WHILELT ==337 338define <vscale x 16 x i1> @whilelt_x2_nxv16i1(i64 %m, i64 %n) nounwind {339; CHECK-LABEL: whilelt_x2_nxv16i1:340; CHECK: // %bb.0:341; CHECK-NEXT: whilelt { p0.b, p1.b }, x0, x1342; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1343; CHECK-NEXT: ret344 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv16i1(i64 %m, i64 %n)345 %res = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0346 ret <vscale x 16 x i1> %res347}348 349define <vscale x 8 x i1> @whilelt_x2_nxv8i1(i64 %m, i64 %n) nounwind {350; CHECK-LABEL: whilelt_x2_nxv8i1:351; CHECK: // %bb.0:352; CHECK-NEXT: whilelt { p0.h, p1.h }, x0, x1353; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1354; CHECK-NEXT: ret355 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv8i1(i64 %m, i64 %n)356 %res = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0357 ret <vscale x 8 x i1> %res358}359 360define <vscale x 4 x i1> @whilelt_x2_nxv4i1(i64 %m, i64 %n) nounwind {361; CHECK-LABEL: whilelt_x2_nxv4i1:362; CHECK: // %bb.0:363; CHECK-NEXT: whilelt { p0.s, p1.s }, x0, x1364; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1365; CHECK-NEXT: ret366 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv4i1(i64 %m, i64 %n)367 %res = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0368 ret <vscale x 4 x i1> %res369}370 371define <vscale x 2 x i1> @whilelt_x2_nxv2i1(i64 %m, i64 %n) nounwind {372; CHECK-LABEL: whilelt_x2_nxv2i1:373; CHECK: // %bb.0:374; CHECK-NEXT: whilelt { p0.d, p1.d }, x0, x1375; CHECK-NEXT: // kill: def $p0 killed $p0 killed $p0_p1376; CHECK-NEXT: ret377 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv2i1(i64 %m, i64 %n)378 %res = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0379 ret <vscale x 2 x i1> %res380}381 382 383; Test that we get good code quality when using while in combination with other intrinsics384 385define <vscale x 32 x i1> @codegen_whilege_b16_x2(i64 noundef %op1, i64 noundef %op2) nounwind {386; CHECK-LABEL: codegen_whilege_b16_x2:387; CHECK: // %bb.0: // %entry388; CHECK-NEXT: whilege { p0.h, p1.h }, x0, x1389; CHECK-NEXT: ret390entry:391 %0 = tail call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilege.x2.nxv8i1(i64 %op1, i64 %op2)392 %1 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 0393 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %1)394 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)395 %4 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 1396 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %4)397 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)398 ret <vscale x 32 x i1> %6399}400 401define <vscale x 32 x i1> @codegen_whilegt_b32_x2(i64 noundef %op1, i64 noundef %op2) nounwind {402; CHECK-LABEL: codegen_whilegt_b32_x2:403; CHECK: // %bb.0: // %entry404; CHECK-NEXT: whilegt { p0.s, p1.s }, x0, x1405; CHECK-NEXT: ret406entry:407 %0 = tail call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv4i1(i64 %op1, i64 %op2)408 %1 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 0409 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %1)410 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)411 %4 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 1412 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %4)413 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)414 ret <vscale x 32 x i1> %6415}416 417define <vscale x 32 x i1> @codegen_whilehi_b64_x2(i64 noundef %op1, i64 noundef %op2) nounwind {418; CHECK-LABEL: codegen_whilehi_b64_x2:419; CHECK: // %bb.0: // %entry420; CHECK-NEXT: whilehi { p0.d, p1.d }, x0, x1421; CHECK-NEXT: ret422entry:423 %0 = tail call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv2i1(i64 %op1, i64 %op2)424 %1 = extractvalue { <vscale x 2 x i1>, <vscale x 2 x i1> } %0, 0425 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv2i1(<vscale x 2 x i1> %1)426 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)427 %4 = extractvalue { <vscale x 2 x i1>, <vscale x 2 x i1> } %0, 1428 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv2i1(<vscale x 2 x i1> %4)429 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)430 ret <vscale x 32 x i1> %6431}432 433define <vscale x 32 x i1> @codegen_whilehs_b16_x2(i64 noundef %op1, i64 noundef %op2) nounwind {434; CHECK-LABEL: codegen_whilehs_b16_x2:435; CHECK: // %bb.0: // %entry436; CHECK-NEXT: whilehs { p0.h, p1.h }, x0, x1437; CHECK-NEXT: ret438entry:439 %0 = tail call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv8i1(i64 %op1, i64 %op2)440 %1 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 0441 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %1)442 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)443 %4 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 1444 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %4)445 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)446 ret <vscale x 32 x i1> %6447}448 449define <vscale x 32 x i1> @codegen_whilele_b32_x2(i64 noundef %op1, i64 noundef %op2) nounwind {450; CHECK-LABEL: codegen_whilele_b32_x2:451; CHECK: // %bb.0: // %entry452; CHECK-NEXT: whilele { p0.s, p1.s }, x0, x1453; CHECK-NEXT: ret454entry:455 %0 = tail call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilele.x2.nxv4i1(i64 %op1, i64 %op2)456 %1 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 0457 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %1)458 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)459 %4 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 1460 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %4)461 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)462 ret <vscale x 32 x i1> %6463}464 465define <vscale x 32 x i1> @codegen_whilelo_b64_x2(i64 noundef %op1, i64 noundef %op2) nounwind {466; CHECK-LABEL: codegen_whilelo_b64_x2:467; CHECK: // %bb.0: // %entry468; CHECK-NEXT: whilelo { p0.d, p1.d }, x0, x1469; CHECK-NEXT: ret470entry:471 %0 = tail call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv2i1(i64 %op1, i64 %op2)472 %1 = extractvalue { <vscale x 2 x i1>, <vscale x 2 x i1> } %0, 0473 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv2i1(<vscale x 2 x i1> %1)474 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)475 %4 = extractvalue { <vscale x 2 x i1>, <vscale x 2 x i1> } %0, 1476 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv2i1(<vscale x 2 x i1> %4)477 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)478 ret <vscale x 32 x i1> %6479}480 481define <vscale x 32 x i1> @codegen_whilels_b16_x2(i64 noundef %op1, i64 noundef %op2) nounwind {482; CHECK-LABEL: codegen_whilels_b16_x2:483; CHECK: // %bb.0: // %entry484; CHECK-NEXT: whilels { p0.h, p1.h }, x0, x1485; CHECK-NEXT: ret486entry:487 %0 = tail call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilels.x2.nxv8i1(i64 %op1, i64 %op2)488 %1 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 0489 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %1)490 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)491 %4 = extractvalue { <vscale x 8 x i1>, <vscale x 8 x i1> } %0, 1492 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1> %4)493 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)494 ret <vscale x 32 x i1> %6495}496 497define <vscale x 32 x i1> @codegen_whilelt_b32_x2(i64 noundef %op1, i64 noundef %op2) nounwind {498; CHECK-LABEL: codegen_whilelt_b32_x2:499; CHECK: // %bb.0: // %entry500; CHECK-NEXT: whilelt { p0.s, p1.s }, x0, x1501; CHECK-NEXT: ret502entry:503 %0 = tail call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv4i1(i64 %op1, i64 %op2)504 %1 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 0505 %2 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %1)506 %3 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> poison, <vscale x 16 x i1> %2, i64 0)507 %4 = extractvalue { <vscale x 4 x i1>, <vscale x 4 x i1> } %0, 1508 %5 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1> %4)509 %6 = tail call <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1> %3, <vscale x 16 x i1> %5, i64 16)510 ret <vscale x 32 x i1> %6511}512 513 514; == Test that we use predicate registers starting at a multiple of 2 ==515 516define <vscale x 16 x i1> @whilege_x2_nxv16i1_reg_off(<vscale x 16 x i1> %p0, i64 %m, i64 %n) nounwind {517; CHECK-LABEL: whilege_x2_nxv16i1_reg_off:518; CHECK: // %bb.0:519; CHECK-NEXT: whilege { p2.b, p3.b }, x0, x1520; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b521; CHECK-NEXT: ret522 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilege.x2.nxv16i1(i64 %m, i64 %n)523 %part1 = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0524 %res = and <vscale x 16 x i1> %part1, %p0525 ret <vscale x 16 x i1> %res526}527 528define <vscale x 8 x i1> @whilegt_x2_nxv8i1_reg_off(<vscale x 8 x i1> %p0, i64 %m, i64 %n) nounwind {529; CHECK-LABEL: whilegt_x2_nxv8i1_reg_off:530; CHECK: // %bb.0:531; CHECK-NEXT: whilegt { p2.h, p3.h }, x0, x1532; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b533; CHECK-NEXT: ret534 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv8i1(i64 %m, i64 %n)535 %part1 = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0536 %res = and <vscale x 8 x i1> %part1, %p0537 ret <vscale x 8 x i1> %res538}539 540define <vscale x 4 x i1> @whilehi_x2_nxv4i1_reg_off(<vscale x 4 x i1> %p0, i64 %m, i64 %n) nounwind {541; CHECK-LABEL: whilehi_x2_nxv4i1_reg_off:542; CHECK: // %bb.0:543; CHECK-NEXT: whilehi { p2.s, p3.s }, x0, x1544; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b545; CHECK-NEXT: ret546 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv4i1(i64 %m, i64 %n)547 %part1 = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0548 %res = and <vscale x 4 x i1> %part1, %p0549 ret <vscale x 4 x i1> %res550}551 552define <vscale x 2 x i1> @whilehs_x2_nxv2i1_reg_off(<vscale x 2 x i1> %p0, i64 %m, i64 %n) nounwind {553; CHECK-LABEL: whilehs_x2_nxv2i1_reg_off:554; CHECK: // %bb.0:555; CHECK-NEXT: whilehs { p2.d, p3.d }, x0, x1556; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b557; CHECK-NEXT: ret558 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv2i1(i64 %m, i64 %n)559 %part1 = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0560 %res = and <vscale x 2 x i1> %part1, %p0561 ret <vscale x 2 x i1> %res562}563 564define <vscale x 16 x i1> @whilele_x2_nxv16i1_reg_off(<vscale x 16 x i1> %p0, i64 %m, i64 %n) nounwind {565; CHECK-LABEL: whilele_x2_nxv16i1_reg_off:566; CHECK: // %bb.0:567; CHECK-NEXT: whilele { p2.b, p3.b }, x0, x1568; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b569; CHECK-NEXT: ret570 %pp = call { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilele.x2.nxv16i1(i64 %m, i64 %n)571 %part1 = extractvalue {<vscale x 16 x i1>, <vscale x 16 x i1>} %pp, 0572 %res = and <vscale x 16 x i1> %part1, %p0573 ret <vscale x 16 x i1> %res574}575 576define <vscale x 8 x i1> @whilelo_x2_nxv8i1_reg_off(<vscale x 8 x i1> %p0, i64 %m, i64 %n) nounwind {577; CHECK-LABEL: whilelo_x2_nxv8i1_reg_off:578; CHECK: // %bb.0:579; CHECK-NEXT: whilelo { p2.h, p3.h }, x0, x1580; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b581; CHECK-NEXT: ret582 %pp = call { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv8i1(i64 %m, i64 %n)583 %part1 = extractvalue {<vscale x 8 x i1>, <vscale x 8 x i1>} %pp, 0584 %res = and <vscale x 8 x i1> %part1, %p0585 ret <vscale x 8 x i1> %res586}587 588define <vscale x 4 x i1> @whilels_x2_nxv4i1_reg_off(<vscale x 4 x i1> %p0, i64 %m, i64 %n) nounwind {589; CHECK-LABEL: whilels_x2_nxv4i1_reg_off:590; CHECK: // %bb.0:591; CHECK-NEXT: whilels { p2.s, p3.s }, x0, x1592; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b593; CHECK-NEXT: ret594 %pp = call { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilels.x2.nxv4i1(i64 %m, i64 %n)595 %part1 = extractvalue {<vscale x 4 x i1>, <vscale x 4 x i1>} %pp, 0596 %res = and <vscale x 4 x i1> %part1, %p0597 ret <vscale x 4 x i1> %res598}599 600define <vscale x 2 x i1> @whilelt_x2_nxv2i1_reg_off(<vscale x 2 x i1> %p0, i64 %m, i64 %n) nounwind {601; CHECK-LABEL: whilelt_x2_nxv2i1_reg_off:602; CHECK: // %bb.0:603; CHECK-NEXT: whilelt { p2.d, p3.d }, x0, x1604; CHECK-NEXT: and p0.b, p2/z, p2.b, p0.b605; CHECK-NEXT: ret606 %pp = call { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv2i1(i64 %m, i64 %n)607 %part1 = extractvalue {<vscale x 2 x i1>, <vscale x 2 x i1>} %pp, 0608 %res = and <vscale x 2 x i1> %part1, %p0609 ret <vscale x 2 x i1> %res610}611 612; == WHILEGE ==613declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilege.x2.nxv16i1(i64, i64)614declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilege.x2.nxv8i1(i64, i64)615declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilege.x2.nxv4i1(i64, i64)616declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilege.x2.nxv2i1(i64, i64)617 618; == WHILEGT ==619declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv16i1(i64, i64)620declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv8i1(i64, i64)621declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv4i1(i64, i64)622declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilegt.x2.nxv2i1(i64, i64)623 624; == WHILEHI ==625declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv16i1(i64, i64)626declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv8i1(i64, i64)627declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv4i1(i64, i64)628declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehi.x2.nxv2i1(i64, i64)629 630; == WHILEHS ==631declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv16i1(i64, i64)632declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv8i1(i64, i64)633declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv4i1(i64, i64)634declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilehs.x2.nxv2i1(i64, i64)635 636; == WHILELE ==637declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilele.x2.nxv16i1(i64, i64)638declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilele.x2.nxv8i1(i64, i64)639declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilele.x2.nxv4i1(i64, i64)640declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilele.x2.nxv2i1(i64, i64)641 642; == WHILELO ==643declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv16i1(i64, i64)644declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv8i1(i64, i64)645declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv4i1(i64, i64)646declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelo.x2.nxv2i1(i64, i64)647 648; == WHILELS ==649declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilels.x2.nxv16i1(i64, i64)650declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilels.x2.nxv8i1(i64, i64)651declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilels.x2.nxv4i1(i64, i64)652declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilels.x2.nxv2i1(i64, i64)653 654; == WHILELT ==655declare { <vscale x 16 x i1>, <vscale x 16 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv16i1(i64, i64)656declare { <vscale x 8 x i1>, <vscale x 8 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv8i1(i64, i64)657declare { <vscale x 4 x i1>, <vscale x 4 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv4i1(i64, i64)658declare { <vscale x 2 x i1>, <vscale x 2 x i1> } @llvm.aarch64.sve.whilelt.x2.nxv2i1(i64, i64)659 660; == SVBOOL CONVERSION ==661declare <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv2i1(<vscale x 2 x i1>)662declare <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv4i1(<vscale x 4 x i1>)663declare <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.nxv8i1(<vscale x 8 x i1>)664 665; == VECTOR INSERTS ==666declare <vscale x 32 x i1> @llvm.vector.insert.nxv32i1.nxv16i1(<vscale x 32 x i1>, <vscale x 16 x i1>, i64 immarg)667