1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s 3 4; 5; CMPEQ 6; 7 8define <vscale x 16 x i1> @cmpeq_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 9; CHECK-LABEL: cmpeq_b: 10; CHECK: // %bb.0: 11; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, z1.b 12; CHECK-NEXT: ret 13 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpeq.nxv16i8(<vscale x 16 x i1> %pg, 14 <vscale x 16 x i8> %a, 15 <vscale x 16 x i8> %b) 16 ret <vscale x 16 x i1> %out 17} 18 19define <vscale x 8 x i1> @cmpeq_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 20; CHECK-LABEL: cmpeq_h: 21; CHECK: // %bb.0: 22; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h 23; CHECK-NEXT: ret 24 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpeq.nxv8i16(<vscale x 8 x i1> %pg, 25 <vscale x 8 x i16> %a, 26 <vscale x 8 x i16> %b) 27 ret <vscale x 8 x i1> %out 28} 29 30define <vscale x 4 x i1> @cmpeq_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 31; CHECK-LABEL: cmpeq_s: 32; CHECK: // %bb.0: 33; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s 34; CHECK-NEXT: ret 35 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpeq.nxv4i32(<vscale x 4 x i1> %pg, 36 <vscale x 4 x i32> %a, 37 <vscale x 4 x i32> %b) 38 ret <vscale x 4 x i1> %out 39} 40 41define <vscale x 2 x i1> @cmpeq_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 42; CHECK-LABEL: cmpeq_d: 43; CHECK: // %bb.0: 44; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d 45; CHECK-NEXT: ret 46 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmpeq.nxv2i64(<vscale x 2 x i1> %pg, 47 <vscale x 2 x i64> %a, 48 <vscale x 2 x i64> %b) 49 ret <vscale x 2 x i1> %out 50} 51 52define <vscale x 16 x i1> @cmpeq_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 53; CHECK-LABEL: cmpeq_wide_b: 54; CHECK: // %bb.0: 55; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, z1.d 56; CHECK-NEXT: ret 57 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv16i8(<vscale x 16 x i1> %pg, 58 <vscale x 16 x i8> %a, 59 <vscale x 2 x i64> %b) 60 ret <vscale x 16 x i1> %out 61} 62 63define <vscale x 8 x i1> @cmpeq_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 64; CHECK-LABEL: cmpeq_wide_h: 65; CHECK: // %bb.0: 66; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.d 67; CHECK-NEXT: ret 68 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv8i16(<vscale x 8 x i1> %pg, 69 <vscale x 8 x i16> %a, 70 <vscale x 2 x i64> %b) 71 ret <vscale x 8 x i1> %out 72} 73 74define <vscale x 4 x i1> @cmpeq_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 75; CHECK-LABEL: cmpeq_wide_s: 76; CHECK: // %bb.0: 77; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.d 78; CHECK-NEXT: ret 79 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv4i32(<vscale x 4 x i1> %pg, 80 <vscale x 4 x i32> %a, 81 <vscale x 2 x i64> %b) 82 ret <vscale x 4 x i1> %out 83} 84 85define <vscale x 16 x i1> @cmpeq_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 86; CHECK-LABEL: cmpeq_ir_b: 87; CHECK: // %bb.0: 88; CHECK-NEXT: ptrue p0.b 89; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, z1.b 90; CHECK-NEXT: ret 91 %out = icmp eq <vscale x 16 x i8> %a, %b 92 ret <vscale x 16 x i1> %out 93} 94 95define <vscale x 8 x i1> @cmpeq_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 96; CHECK-LABEL: cmpeq_ir_h: 97; CHECK: // %bb.0: 98; CHECK-NEXT: ptrue p0.h 99; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h 100; CHECK-NEXT: ret 101 %out = icmp eq <vscale x 8 x i16> %a, %b 102 ret <vscale x 8 x i1> %out 103} 104 105define <vscale x 4 x i1> @cmpeq_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 106; CHECK-LABEL: cmpeq_ir_s: 107; CHECK: // %bb.0: 108; CHECK-NEXT: ptrue p0.s 109; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s 110; CHECK-NEXT: ret 111 %out = icmp eq <vscale x 4 x i32> %a, %b 112 ret <vscale x 4 x i1> %out 113} 114 115define <vscale x 2 x i1> @cmpeq_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 116; CHECK-LABEL: cmpeq_ir_d: 117; CHECK: // %bb.0: 118; CHECK-NEXT: ptrue p0.d 119; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d 120; CHECK-NEXT: ret 121 %out = icmp eq <vscale x 2 x i64> %a, %b 122 ret <vscale x 2 x i1> %out 123} 124 125; 126; CMPGE 127; 128 129define <vscale x 16 x i1> @cmpge_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 130; CHECK-LABEL: cmpge_b: 131; CHECK: // %bb.0: 132; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, z1.b 133; CHECK-NEXT: ret 134 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1> %pg, 135 <vscale x 16 x i8> %a, 136 <vscale x 16 x i8> %b) 137 ret <vscale x 16 x i1> %out 138} 139 140define <vscale x 8 x i1> @cmpge_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 141; CHECK-LABEL: cmpge_h: 142; CHECK: // %bb.0: 143; CHECK-NEXT: cmpge p0.h, p0/z, z0.h, z1.h 144; CHECK-NEXT: ret 145 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpge.nxv8i16(<vscale x 8 x i1> %pg, 146 <vscale x 8 x i16> %a, 147 <vscale x 8 x i16> %b) 148 ret <vscale x 8 x i1> %out 149} 150 151define <vscale x 4 x i1> @cmpge_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 152; CHECK-LABEL: cmpge_s: 153; CHECK: // %bb.0: 154; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s 155; CHECK-NEXT: ret 156 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1> %pg, 157 <vscale x 4 x i32> %a, 158 <vscale x 4 x i32> %b) 159 ret <vscale x 4 x i1> %out 160} 161 162define <vscale x 2 x i1> @cmpge_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 163; CHECK-LABEL: cmpge_d: 164; CHECK: // %bb.0: 165; CHECK-NEXT: cmpge p0.d, p0/z, z0.d, z1.d 166; CHECK-NEXT: ret 167 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmpge.nxv2i64(<vscale x 2 x i1> %pg, 168 <vscale x 2 x i64> %a, 169 <vscale x 2 x i64> %b) 170 ret <vscale x 2 x i1> %out 171} 172 173define <vscale x 16 x i1> @cmpge_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 174; CHECK-LABEL: cmpge_wide_b: 175; CHECK: // %bb.0: 176; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, z1.d 177; CHECK-NEXT: ret 178 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.wide.nxv16i8(<vscale x 16 x i1> %pg, 179 <vscale x 16 x i8> %a, 180 <vscale x 2 x i64> %b) 181 ret <vscale x 16 x i1> %out 182} 183 184define <vscale x 8 x i1> @cmpge_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 185; CHECK-LABEL: cmpge_wide_h: 186; CHECK: // %bb.0: 187; CHECK-NEXT: cmpge p0.h, p0/z, z0.h, z1.d 188; CHECK-NEXT: ret 189 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpge.wide.nxv8i16(<vscale x 8 x i1> %pg, 190 <vscale x 8 x i16> %a, 191 <vscale x 2 x i64> %b) 192 ret <vscale x 8 x i1> %out 193} 194 195define <vscale x 4 x i1> @cmpge_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 196; CHECK-LABEL: cmpge_wide_s: 197; CHECK: // %bb.0: 198; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.d 199; CHECK-NEXT: ret 200 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.wide.nxv4i32(<vscale x 4 x i1> %pg, 201 <vscale x 4 x i32> %a, 202 <vscale x 2 x i64> %b) 203 ret <vscale x 4 x i1> %out 204} 205 206define <vscale x 16 x i1> @cmpge_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 207; CHECK-LABEL: cmpge_ir_b: 208; CHECK: // %bb.0: 209; CHECK-NEXT: ptrue p0.b 210; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, z1.b 211; CHECK-NEXT: ret 212 %out = icmp sge <vscale x 16 x i8> %a, %b 213 ret <vscale x 16 x i1> %out 214} 215 216define <vscale x 8 x i1> @cmpge_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 217; CHECK-LABEL: cmpge_ir_h: 218; CHECK: // %bb.0: 219; CHECK-NEXT: ptrue p0.h 220; CHECK-NEXT: cmpge p0.h, p0/z, z0.h, z1.h 221; CHECK-NEXT: ret 222 %out = icmp sge <vscale x 8 x i16> %a, %b 223 ret <vscale x 8 x i1> %out 224} 225 226define <vscale x 4 x i1> @cmpge_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 227; CHECK-LABEL: cmpge_ir_s: 228; CHECK: // %bb.0: 229; CHECK-NEXT: ptrue p0.s 230; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s 231; CHECK-NEXT: ret 232 %out = icmp sge <vscale x 4 x i32> %a, %b 233 ret <vscale x 4 x i1> %out 234} 235 236define <vscale x 2 x i1> @cmpge_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 237; CHECK-LABEL: cmpge_ir_d: 238; CHECK: // %bb.0: 239; CHECK-NEXT: ptrue p0.d 240; CHECK-NEXT: cmpge p0.d, p0/z, z0.d, z1.d 241; CHECK-NEXT: ret 242 %out = icmp sge <vscale x 2 x i64> %a, %b 243 ret <vscale x 2 x i1> %out 244} 245 246define <vscale x 16 x i1> @cmpge_ir_comm_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 247; CHECK-LABEL: cmpge_ir_comm_b: 248; CHECK: // %bb.0: 249; CHECK-NEXT: ptrue p0.b 250; CHECK-NEXT: cmpge p0.b, p0/z, z1.b, z0.b 251; CHECK-NEXT: ret 252 %out = icmp sle <vscale x 16 x i8> %a, %b 253 ret <vscale x 16 x i1> %out 254} 255 256define <vscale x 8 x i1> @cmpge_ir_comm_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 257; CHECK-LABEL: cmpge_ir_comm_h: 258; CHECK: // %bb.0: 259; CHECK-NEXT: ptrue p0.h 260; CHECK-NEXT: cmpge p0.h, p0/z, z1.h, z0.h 261; CHECK-NEXT: ret 262 %out = icmp sle <vscale x 8 x i16> %a, %b 263 ret <vscale x 8 x i1> %out 264} 265 266define <vscale x 4 x i1> @cmpge_ir_comm_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 267; CHECK-LABEL: cmpge_ir_comm_s: 268; CHECK: // %bb.0: 269; CHECK-NEXT: ptrue p0.s 270; CHECK-NEXT: cmpge p0.s, p0/z, z1.s, z0.s 271; CHECK-NEXT: ret 272 %out = icmp sle <vscale x 4 x i32> %a, %b 273 ret <vscale x 4 x i1> %out 274} 275 276define <vscale x 2 x i1> @cmpge_ir_comm_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 277; CHECK-LABEL: cmpge_ir_comm_d: 278; CHECK: // %bb.0: 279; CHECK-NEXT: ptrue p0.d 280; CHECK-NEXT: cmpge p0.d, p0/z, z1.d, z0.d 281; CHECK-NEXT: ret 282 %out = icmp sle <vscale x 2 x i64> %a, %b 283 ret <vscale x 2 x i1> %out 284} 285 286; 287; CMPGT 288; 289 290define <vscale x 16 x i1> @cmpgt_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 291; CHECK-LABEL: cmpgt_b: 292; CHECK: // %bb.0: 293; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, z1.b 294; CHECK-NEXT: ret 295 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpgt.nxv16i8(<vscale x 16 x i1> %pg, 296 <vscale x 16 x i8> %a, 297 <vscale x 16 x i8> %b) 298 ret <vscale x 16 x i1> %out 299} 300 301define <vscale x 8 x i1> @cmpgt_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 302; CHECK-LABEL: cmpgt_h: 303; CHECK: // %bb.0: 304; CHECK-NEXT: cmpgt p0.h, p0/z, z0.h, z1.h 305; CHECK-NEXT: ret 306 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpgt.nxv8i16(<vscale x 8 x i1> %pg, 307 <vscale x 8 x i16> %a, 308 <vscale x 8 x i16> %b) 309 ret <vscale x 8 x i1> %out 310} 311 312define <vscale x 4 x i1> @cmpgt_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 313; CHECK-LABEL: cmpgt_s: 314; CHECK: // %bb.0: 315; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.s 316; CHECK-NEXT: ret 317 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpgt.nxv4i32(<vscale x 4 x i1> %pg, 318 <vscale x 4 x i32> %a, 319 <vscale x 4 x i32> %b) 320 ret <vscale x 4 x i1> %out 321} 322 323define <vscale x 2 x i1> @cmpgt_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 324; CHECK-LABEL: cmpgt_d: 325; CHECK: // %bb.0: 326; CHECK-NEXT: cmpgt p0.d, p0/z, z0.d, z1.d 327; CHECK-NEXT: ret 328 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmpgt.nxv2i64(<vscale x 2 x i1> %pg, 329 <vscale x 2 x i64> %a, 330 <vscale x 2 x i64> %b) 331 ret <vscale x 2 x i1> %out 332} 333 334define <vscale x 16 x i1> @cmpgt_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 335; CHECK-LABEL: cmpgt_wide_b: 336; CHECK: // %bb.0: 337; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, z1.d 338; CHECK-NEXT: ret 339 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv16i8(<vscale x 16 x i1> %pg, 340 <vscale x 16 x i8> %a, 341 <vscale x 2 x i64> %b) 342 ret <vscale x 16 x i1> %out 343} 344 345define <vscale x 8 x i1> @cmpgt_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 346; CHECK-LABEL: cmpgt_wide_h: 347; CHECK: // %bb.0: 348; CHECK-NEXT: cmpgt p0.h, p0/z, z0.h, z1.d 349; CHECK-NEXT: ret 350 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv8i16(<vscale x 8 x i1> %pg, 351 <vscale x 8 x i16> %a, 352 <vscale x 2 x i64> %b) 353 ret <vscale x 8 x i1> %out 354} 355 356define <vscale x 4 x i1> @cmpgt_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 357; CHECK-LABEL: cmpgt_wide_s: 358; CHECK: // %bb.0: 359; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.d 360; CHECK-NEXT: ret 361 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv4i32(<vscale x 4 x i1> %pg, 362 <vscale x 4 x i32> %a, 363 <vscale x 2 x i64> %b) 364 ret <vscale x 4 x i1> %out 365} 366 367define <vscale x 16 x i1> @cmpgt_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 368; CHECK-LABEL: cmpgt_ir_b: 369; CHECK: // %bb.0: 370; CHECK-NEXT: ptrue p0.b 371; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, z1.b 372; CHECK-NEXT: ret 373 %out = icmp sgt <vscale x 16 x i8> %a, %b 374 ret <vscale x 16 x i1> %out 375} 376 377define <vscale x 8 x i1> @cmpgt_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 378; CHECK-LABEL: cmpgt_ir_h: 379; CHECK: // %bb.0: 380; CHECK-NEXT: ptrue p0.h 381; CHECK-NEXT: cmpgt p0.h, p0/z, z0.h, z1.h 382; CHECK-NEXT: ret 383 %out = icmp sgt <vscale x 8 x i16> %a, %b 384 ret <vscale x 8 x i1> %out 385} 386 387define <vscale x 4 x i1> @cmpgt_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 388; CHECK-LABEL: cmpgt_ir_s: 389; CHECK: // %bb.0: 390; CHECK-NEXT: ptrue p0.s 391; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.s 392; CHECK-NEXT: ret 393 %out = icmp sgt <vscale x 4 x i32> %a, %b 394 ret <vscale x 4 x i1> %out 395} 396 397define <vscale x 2 x i1> @cmpgt_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 398; CHECK-LABEL: cmpgt_ir_d: 399; CHECK: // %bb.0: 400; CHECK-NEXT: ptrue p0.d 401; CHECK-NEXT: cmpgt p0.d, p0/z, z0.d, z1.d 402; CHECK-NEXT: ret 403 %out = icmp sgt <vscale x 2 x i64> %a, %b 404 ret <vscale x 2 x i1> %out 405} 406 407define <vscale x 16 x i1> @cmpgt_ir_comm_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 408; CHECK-LABEL: cmpgt_ir_comm_b: 409; CHECK: // %bb.0: 410; CHECK-NEXT: ptrue p0.b 411; CHECK-NEXT: cmpgt p0.b, p0/z, z1.b, z0.b 412; CHECK-NEXT: ret 413 %out = icmp slt <vscale x 16 x i8> %a, %b 414 ret <vscale x 16 x i1> %out 415} 416 417define <vscale x 8 x i1> @cmpgt_ir_comm_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 418; CHECK-LABEL: cmpgt_ir_comm_h: 419; CHECK: // %bb.0: 420; CHECK-NEXT: ptrue p0.h 421; CHECK-NEXT: cmpgt p0.h, p0/z, z1.h, z0.h 422; CHECK-NEXT: ret 423 %out = icmp slt <vscale x 8 x i16> %a, %b 424 ret <vscale x 8 x i1> %out 425} 426 427define <vscale x 4 x i1> @cmpgt_ir_comm_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 428; CHECK-LABEL: cmpgt_ir_comm_s: 429; CHECK: // %bb.0: 430; CHECK-NEXT: ptrue p0.s 431; CHECK-NEXT: cmpgt p0.s, p0/z, z1.s, z0.s 432; CHECK-NEXT: ret 433 %out = icmp slt <vscale x 4 x i32> %a, %b 434 ret <vscale x 4 x i1> %out 435} 436 437define <vscale x 2 x i1> @cmpgt_ir_comm_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 438; CHECK-LABEL: cmpgt_ir_comm_d: 439; CHECK: // %bb.0: 440; CHECK-NEXT: ptrue p0.d 441; CHECK-NEXT: cmpgt p0.d, p0/z, z1.d, z0.d 442; CHECK-NEXT: ret 443 %out = icmp slt <vscale x 2 x i64> %a, %b 444 ret <vscale x 2 x i1> %out 445} 446 447; 448; CMPHI 449; 450 451define <vscale x 16 x i1> @cmphi_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 452; CHECK-LABEL: cmphi_b: 453; CHECK: // %bb.0: 454; CHECK-NEXT: cmphi p0.b, p0/z, z0.b, z1.b 455; CHECK-NEXT: ret 456 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmphi.nxv16i8(<vscale x 16 x i1> %pg, 457 <vscale x 16 x i8> %a, 458 <vscale x 16 x i8> %b) 459 ret <vscale x 16 x i1> %out 460} 461 462define <vscale x 8 x i1> @cmphi_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 463; CHECK-LABEL: cmphi_h: 464; CHECK: // %bb.0: 465; CHECK-NEXT: cmphi p0.h, p0/z, z0.h, z1.h 466; CHECK-NEXT: ret 467 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmphi.nxv8i16(<vscale x 8 x i1> %pg, 468 <vscale x 8 x i16> %a, 469 <vscale x 8 x i16> %b) 470 ret <vscale x 8 x i1> %out 471} 472 473define <vscale x 4 x i1> @cmphi_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 474; CHECK-LABEL: cmphi_s: 475; CHECK: // %bb.0: 476; CHECK-NEXT: cmphi p0.s, p0/z, z0.s, z1.s 477; CHECK-NEXT: ret 478 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmphi.nxv4i32(<vscale x 4 x i1> %pg, 479 <vscale x 4 x i32> %a, 480 <vscale x 4 x i32> %b) 481 ret <vscale x 4 x i1> %out 482} 483 484define <vscale x 2 x i1> @cmphi_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 485; CHECK-LABEL: cmphi_d: 486; CHECK: // %bb.0: 487; CHECK-NEXT: cmphi p0.d, p0/z, z0.d, z1.d 488; CHECK-NEXT: ret 489 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmphi.nxv2i64(<vscale x 2 x i1> %pg, 490 <vscale x 2 x i64> %a, 491 <vscale x 2 x i64> %b) 492 ret <vscale x 2 x i1> %out 493} 494 495define <vscale x 16 x i1> @cmphi_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 496; CHECK-LABEL: cmphi_wide_b: 497; CHECK: // %bb.0: 498; CHECK-NEXT: cmphi p0.b, p0/z, z0.b, z1.d 499; CHECK-NEXT: ret 500 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmphi.wide.nxv16i8(<vscale x 16 x i1> %pg, 501 <vscale x 16 x i8> %a, 502 <vscale x 2 x i64> %b) 503 ret <vscale x 16 x i1> %out 504} 505 506define <vscale x 8 x i1> @cmphi_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 507; CHECK-LABEL: cmphi_wide_h: 508; CHECK: // %bb.0: 509; CHECK-NEXT: cmphi p0.h, p0/z, z0.h, z1.d 510; CHECK-NEXT: ret 511 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmphi.wide.nxv8i16(<vscale x 8 x i1> %pg, 512 <vscale x 8 x i16> %a, 513 <vscale x 2 x i64> %b) 514 ret <vscale x 8 x i1> %out 515} 516 517define <vscale x 4 x i1> @cmphi_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 518; CHECK-LABEL: cmphi_wide_s: 519; CHECK: // %bb.0: 520; CHECK-NEXT: cmphi p0.s, p0/z, z0.s, z1.d 521; CHECK-NEXT: ret 522 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmphi.wide.nxv4i32(<vscale x 4 x i1> %pg, 523 <vscale x 4 x i32> %a, 524 <vscale x 2 x i64> %b) 525 ret <vscale x 4 x i1> %out 526} 527 528define <vscale x 16 x i1> @cmphi_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 529; CHECK-LABEL: cmphi_ir_b: 530; CHECK: // %bb.0: 531; CHECK-NEXT: ptrue p0.b 532; CHECK-NEXT: cmphi p0.b, p0/z, z0.b, z1.b 533; CHECK-NEXT: ret 534 %out = icmp ugt <vscale x 16 x i8> %a, %b 535 ret <vscale x 16 x i1> %out 536} 537 538define <vscale x 8 x i1> @cmphi_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 539; CHECK-LABEL: cmphi_ir_h: 540; CHECK: // %bb.0: 541; CHECK-NEXT: ptrue p0.h 542; CHECK-NEXT: cmphi p0.h, p0/z, z0.h, z1.h 543; CHECK-NEXT: ret 544 %out = icmp ugt <vscale x 8 x i16> %a, %b 545 ret <vscale x 8 x i1> %out 546} 547 548define <vscale x 4 x i1> @cmphi_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 549; CHECK-LABEL: cmphi_ir_s: 550; CHECK: // %bb.0: 551; CHECK-NEXT: ptrue p0.s 552; CHECK-NEXT: cmphi p0.s, p0/z, z0.s, z1.s 553; CHECK-NEXT: ret 554 %out = icmp ugt <vscale x 4 x i32> %a, %b 555 ret <vscale x 4 x i1> %out 556} 557 558define <vscale x 2 x i1> @cmphi_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 559; CHECK-LABEL: cmphi_ir_d: 560; CHECK: // %bb.0: 561; CHECK-NEXT: ptrue p0.d 562; CHECK-NEXT: cmphi p0.d, p0/z, z0.d, z1.d 563; CHECK-NEXT: ret 564 %out = icmp ugt <vscale x 2 x i64> %a, %b 565 ret <vscale x 2 x i1> %out 566} 567 568define <vscale x 16 x i1> @cmphi_ir_comm_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 569; CHECK-LABEL: cmphi_ir_comm_b: 570; CHECK: // %bb.0: 571; CHECK-NEXT: ptrue p0.b 572; CHECK-NEXT: cmphi p0.b, p0/z, z1.b, z0.b 573; CHECK-NEXT: ret 574 %out = icmp ult <vscale x 16 x i8> %a, %b 575 ret <vscale x 16 x i1> %out 576} 577 578define <vscale x 8 x i1> @cmphi_ir_comm_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 579; CHECK-LABEL: cmphi_ir_comm_h: 580; CHECK: // %bb.0: 581; CHECK-NEXT: ptrue p0.h 582; CHECK-NEXT: cmphi p0.h, p0/z, z1.h, z0.h 583; CHECK-NEXT: ret 584 %out = icmp ult <vscale x 8 x i16> %a, %b 585 ret <vscale x 8 x i1> %out 586} 587 588define <vscale x 4 x i1> @cmphi_ir_comm_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 589; CHECK-LABEL: cmphi_ir_comm_s: 590; CHECK: // %bb.0: 591; CHECK-NEXT: ptrue p0.s 592; CHECK-NEXT: cmphi p0.s, p0/z, z1.s, z0.s 593; CHECK-NEXT: ret 594 %out = icmp ult <vscale x 4 x i32> %a, %b 595 ret <vscale x 4 x i1> %out 596} 597 598define <vscale x 2 x i1> @cmphi_ir_comm_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 599; CHECK-LABEL: cmphi_ir_comm_d: 600; CHECK: // %bb.0: 601; CHECK-NEXT: ptrue p0.d 602; CHECK-NEXT: cmphi p0.d, p0/z, z1.d, z0.d 603; CHECK-NEXT: ret 604 %out = icmp ult <vscale x 2 x i64> %a, %b 605 ret <vscale x 2 x i1> %out 606} 607 608; 609; CMPHS 610; 611 612define <vscale x 16 x i1> @cmphs_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 613; CHECK-LABEL: cmphs_b: 614; CHECK: // %bb.0: 615; CHECK-NEXT: cmphs p0.b, p0/z, z0.b, z1.b 616; CHECK-NEXT: ret 617 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmphs.nxv16i8(<vscale x 16 x i1> %pg, 618 <vscale x 16 x i8> %a, 619 <vscale x 16 x i8> %b) 620 ret <vscale x 16 x i1> %out 621} 622 623define <vscale x 8 x i1> @cmphs_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 624; CHECK-LABEL: cmphs_h: 625; CHECK: // %bb.0: 626; CHECK-NEXT: cmphs p0.h, p0/z, z0.h, z1.h 627; CHECK-NEXT: ret 628 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmphs.nxv8i16(<vscale x 8 x i1> %pg, 629 <vscale x 8 x i16> %a, 630 <vscale x 8 x i16> %b) 631 ret <vscale x 8 x i1> %out 632} 633 634define <vscale x 4 x i1> @cmphs_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 635; CHECK-LABEL: cmphs_s: 636; CHECK: // %bb.0: 637; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, z1.s 638; CHECK-NEXT: ret 639 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmphs.nxv4i32(<vscale x 4 x i1> %pg, 640 <vscale x 4 x i32> %a, 641 <vscale x 4 x i32> %b) 642 ret <vscale x 4 x i1> %out 643} 644 645define <vscale x 2 x i1> @cmphs_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 646; CHECK-LABEL: cmphs_d: 647; CHECK: // %bb.0: 648; CHECK-NEXT: cmphs p0.d, p0/z, z0.d, z1.d 649; CHECK-NEXT: ret 650 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmphs.nxv2i64(<vscale x 2 x i1> %pg, 651 <vscale x 2 x i64> %a, 652 <vscale x 2 x i64> %b) 653 ret <vscale x 2 x i1> %out 654} 655 656define <vscale x 16 x i1> @cmphs_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 657; CHECK-LABEL: cmphs_wide_b: 658; CHECK: // %bb.0: 659; CHECK-NEXT: cmphs p0.b, p0/z, z0.b, z1.d 660; CHECK-NEXT: ret 661 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmphs.wide.nxv16i8(<vscale x 16 x i1> %pg, 662 <vscale x 16 x i8> %a, 663 <vscale x 2 x i64> %b) 664 ret <vscale x 16 x i1> %out 665} 666 667define <vscale x 8 x i1> @cmphs_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 668; CHECK-LABEL: cmphs_wide_h: 669; CHECK: // %bb.0: 670; CHECK-NEXT: cmphs p0.h, p0/z, z0.h, z1.d 671; CHECK-NEXT: ret 672 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmphs.wide.nxv8i16(<vscale x 8 x i1> %pg, 673 <vscale x 8 x i16> %a, 674 <vscale x 2 x i64> %b) 675 ret <vscale x 8 x i1> %out 676} 677 678define <vscale x 4 x i1> @cmphs_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 679; CHECK-LABEL: cmphs_wide_s: 680; CHECK: // %bb.0: 681; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, z1.d 682; CHECK-NEXT: ret 683 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmphs.wide.nxv4i32(<vscale x 4 x i1> %pg, 684 <vscale x 4 x i32> %a, 685 <vscale x 2 x i64> %b) 686 ret <vscale x 4 x i1> %out 687} 688 689define <vscale x 16 x i1> @cmphs_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 690; CHECK-LABEL: cmphs_ir_b: 691; CHECK: // %bb.0: 692; CHECK-NEXT: ptrue p0.b 693; CHECK-NEXT: cmphs p0.b, p0/z, z0.b, z1.b 694; CHECK-NEXT: ret 695 %out = icmp uge <vscale x 16 x i8> %a, %b 696 ret <vscale x 16 x i1> %out 697} 698 699define <vscale x 8 x i1> @cmphs_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 700; CHECK-LABEL: cmphs_ir_h: 701; CHECK: // %bb.0: 702; CHECK-NEXT: ptrue p0.h 703; CHECK-NEXT: cmphs p0.h, p0/z, z0.h, z1.h 704; CHECK-NEXT: ret 705 %out = icmp uge <vscale x 8 x i16> %a, %b 706 ret <vscale x 8 x i1> %out 707} 708 709define <vscale x 4 x i1> @cmphs_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 710; CHECK-LABEL: cmphs_ir_s: 711; CHECK: // %bb.0: 712; CHECK-NEXT: ptrue p0.s 713; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, z1.s 714; CHECK-NEXT: ret 715 %out = icmp uge <vscale x 4 x i32> %a, %b 716 ret <vscale x 4 x i1> %out 717} 718 719define <vscale x 2 x i1> @cmphs_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 720; CHECK-LABEL: cmphs_ir_d: 721; CHECK: // %bb.0: 722; CHECK-NEXT: ptrue p0.d 723; CHECK-NEXT: cmphs p0.d, p0/z, z0.d, z1.d 724; CHECK-NEXT: ret 725 %out = icmp uge <vscale x 2 x i64> %a, %b 726 ret <vscale x 2 x i1> %out 727} 728 729define <vscale x 16 x i1> @cmphs_ir_comm_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 730; CHECK-LABEL: cmphs_ir_comm_b: 731; CHECK: // %bb.0: 732; CHECK-NEXT: ptrue p0.b 733; CHECK-NEXT: cmphs p0.b, p0/z, z1.b, z0.b 734; CHECK-NEXT: ret 735 %out = icmp ule <vscale x 16 x i8> %a, %b 736 ret <vscale x 16 x i1> %out 737} 738 739define <vscale x 8 x i1> @cmphs_ir_comm_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 740; CHECK-LABEL: cmphs_ir_comm_h: 741; CHECK: // %bb.0: 742; CHECK-NEXT: ptrue p0.h 743; CHECK-NEXT: cmphs p0.h, p0/z, z1.h, z0.h 744; CHECK-NEXT: ret 745 %out = icmp ule <vscale x 8 x i16> %a, %b 746 ret <vscale x 8 x i1> %out 747} 748 749define <vscale x 4 x i1> @cmphs_ir_comm_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 750; CHECK-LABEL: cmphs_ir_comm_s: 751; CHECK: // %bb.0: 752; CHECK-NEXT: ptrue p0.s 753; CHECK-NEXT: cmphs p0.s, p0/z, z1.s, z0.s 754; CHECK-NEXT: ret 755 %out = icmp ule <vscale x 4 x i32> %a, %b 756 ret <vscale x 4 x i1> %out 757} 758 759define <vscale x 2 x i1> @cmphs_ir_comm_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 760; CHECK-LABEL: cmphs_ir_comm_d: 761; CHECK: // %bb.0: 762; CHECK-NEXT: ptrue p0.d 763; CHECK-NEXT: cmphs p0.d, p0/z, z1.d, z0.d 764; CHECK-NEXT: ret 765 %out = icmp ule <vscale x 2 x i64> %a, %b 766 ret <vscale x 2 x i1> %out 767} 768 769; 770; CMPLE 771; 772 773define <vscale x 16 x i1> @cmple_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 774; CHECK-LABEL: cmple_wide_b: 775; CHECK: // %bb.0: 776; CHECK-NEXT: cmple p0.b, p0/z, z0.b, z1.d 777; CHECK-NEXT: ret 778 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmple.wide.nxv16i8(<vscale x 16 x i1> %pg, 779 <vscale x 16 x i8> %a, 780 <vscale x 2 x i64> %b) 781 ret <vscale x 16 x i1> %out 782} 783 784define <vscale x 8 x i1> @cmple_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 785; CHECK-LABEL: cmple_wide_h: 786; CHECK: // %bb.0: 787; CHECK-NEXT: cmple p0.h, p0/z, z0.h, z1.d 788; CHECK-NEXT: ret 789 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmple.wide.nxv8i16(<vscale x 8 x i1> %pg, 790 <vscale x 8 x i16> %a, 791 <vscale x 2 x i64> %b) 792 ret <vscale x 8 x i1> %out 793} 794 795define <vscale x 4 x i1> @cmple_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 796; CHECK-LABEL: cmple_wide_s: 797; CHECK: // %bb.0: 798; CHECK-NEXT: cmple p0.s, p0/z, z0.s, z1.d 799; CHECK-NEXT: ret 800 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmple.wide.nxv4i32(<vscale x 4 x i1> %pg, 801 <vscale x 4 x i32> %a, 802 <vscale x 2 x i64> %b) 803 ret <vscale x 4 x i1> %out 804} 805 806; 807; CMPLO 808; 809 810define <vscale x 16 x i1> @cmplo_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 811; CHECK-LABEL: cmplo_wide_b: 812; CHECK: // %bb.0: 813; CHECK-NEXT: cmplo p0.b, p0/z, z0.b, z1.d 814; CHECK-NEXT: ret 815 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmplo.wide.nxv16i8(<vscale x 16 x i1> %pg, 816 <vscale x 16 x i8> %a, 817 <vscale x 2 x i64> %b) 818 ret <vscale x 16 x i1> %out 819} 820 821define <vscale x 8 x i1> @cmplo_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 822; CHECK-LABEL: cmplo_wide_h: 823; CHECK: // %bb.0: 824; CHECK-NEXT: cmplo p0.h, p0/z, z0.h, z1.d 825; CHECK-NEXT: ret 826 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmplo.wide.nxv8i16(<vscale x 8 x i1> %pg, 827 <vscale x 8 x i16> %a, 828 <vscale x 2 x i64> %b) 829 ret <vscale x 8 x i1> %out 830} 831 832define <vscale x 4 x i1> @cmplo_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 833; CHECK-LABEL: cmplo_wide_s: 834; CHECK: // %bb.0: 835; CHECK-NEXT: cmplo p0.s, p0/z, z0.s, z1.d 836; CHECK-NEXT: ret 837 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmplo.wide.nxv4i32(<vscale x 4 x i1> %pg, 838 <vscale x 4 x i32> %a, 839 <vscale x 2 x i64> %b) 840 ret <vscale x 4 x i1> %out 841} 842 843; 844; CMPLS 845; 846 847define <vscale x 16 x i1> @cmpls_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 848; CHECK-LABEL: cmpls_wide_b: 849; CHECK: // %bb.0: 850; CHECK-NEXT: cmpls p0.b, p0/z, z0.b, z1.d 851; CHECK-NEXT: ret 852 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpls.wide.nxv16i8(<vscale x 16 x i1> %pg, 853 <vscale x 16 x i8> %a, 854 <vscale x 2 x i64> %b) 855 ret <vscale x 16 x i1> %out 856} 857 858define <vscale x 8 x i1> @cmpls_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 859; CHECK-LABEL: cmpls_wide_h: 860; CHECK: // %bb.0: 861; CHECK-NEXT: cmpls p0.h, p0/z, z0.h, z1.d 862; CHECK-NEXT: ret 863 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpls.wide.nxv8i16(<vscale x 8 x i1> %pg, 864 <vscale x 8 x i16> %a, 865 <vscale x 2 x i64> %b) 866 ret <vscale x 8 x i1> %out 867} 868 869define <vscale x 4 x i1> @cmpls_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 870; CHECK-LABEL: cmpls_wide_s: 871; CHECK: // %bb.0: 872; CHECK-NEXT: cmpls p0.s, p0/z, z0.s, z1.d 873; CHECK-NEXT: ret 874 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpls.wide.nxv4i32(<vscale x 4 x i1> %pg, 875 <vscale x 4 x i32> %a, 876 <vscale x 2 x i64> %b) 877 ret <vscale x 4 x i1> %out 878} 879 880; 881; CMPLT 882; 883 884define <vscale x 16 x i1> @cmplt_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 885; CHECK-LABEL: cmplt_wide_b: 886; CHECK: // %bb.0: 887; CHECK-NEXT: cmplt p0.b, p0/z, z0.b, z1.d 888; CHECK-NEXT: ret 889 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmplt.wide.nxv16i8(<vscale x 16 x i1> %pg, 890 <vscale x 16 x i8> %a, 891 <vscale x 2 x i64> %b) 892 ret <vscale x 16 x i1> %out 893} 894 895define <vscale x 8 x i1> @cmplt_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 896; CHECK-LABEL: cmplt_wide_h: 897; CHECK: // %bb.0: 898; CHECK-NEXT: cmplt p0.h, p0/z, z0.h, z1.d 899; CHECK-NEXT: ret 900 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmplt.wide.nxv8i16(<vscale x 8 x i1> %pg, 901 <vscale x 8 x i16> %a, 902 <vscale x 2 x i64> %b) 903 ret <vscale x 8 x i1> %out 904} 905 906define <vscale x 4 x i1> @cmplt_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 907; CHECK-LABEL: cmplt_wide_s: 908; CHECK: // %bb.0: 909; CHECK-NEXT: cmplt p0.s, p0/z, z0.s, z1.d 910; CHECK-NEXT: ret 911 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmplt.wide.nxv4i32(<vscale x 4 x i1> %pg, 912 <vscale x 4 x i32> %a, 913 <vscale x 2 x i64> %b) 914 ret <vscale x 4 x i1> %out 915} 916 917; 918; CMPNE 919; 920 921define <vscale x 16 x i1> @cmpne_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 922; CHECK-LABEL: cmpne_b: 923; CHECK: // %bb.0: 924; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, z1.b 925; CHECK-NEXT: ret 926 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpne.nxv16i8(<vscale x 16 x i1> %pg, 927 <vscale x 16 x i8> %a, 928 <vscale x 16 x i8> %b) 929 ret <vscale x 16 x i1> %out 930} 931 932define <vscale x 8 x i1> @cmpne_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 933; CHECK-LABEL: cmpne_h: 934; CHECK: // %bb.0: 935; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, z1.h 936; CHECK-NEXT: ret 937 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpne.nxv8i16(<vscale x 8 x i1> %pg, 938 <vscale x 8 x i16> %a, 939 <vscale x 8 x i16> %b) 940 ret <vscale x 8 x i1> %out 941} 942 943define <vscale x 4 x i1> @cmpne_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 944; CHECK-LABEL: cmpne_s: 945; CHECK: // %bb.0: 946; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, z1.s 947; CHECK-NEXT: ret 948 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpne.nxv4i32(<vscale x 4 x i1> %pg, 949 <vscale x 4 x i32> %a, 950 <vscale x 4 x i32> %b) 951 ret <vscale x 4 x i1> %out 952} 953 954define <vscale x 2 x i1> @cmpne_d(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 955; CHECK-LABEL: cmpne_d: 956; CHECK: // %bb.0: 957; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, z1.d 958; CHECK-NEXT: ret 959 %out = call <vscale x 2 x i1> @llvm.aarch64.sve.cmpne.nxv2i64(<vscale x 2 x i1> %pg, 960 <vscale x 2 x i64> %a, 961 <vscale x 2 x i64> %b) 962 ret <vscale x 2 x i1> %out 963} 964 965define <vscale x 16 x i1> @cmpne_wide_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 2 x i64> %b) { 966; CHECK-LABEL: cmpne_wide_b: 967; CHECK: // %bb.0: 968; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, z1.d 969; CHECK-NEXT: ret 970 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpne.wide.nxv16i8(<vscale x 16 x i1> %pg, 971 <vscale x 16 x i8> %a, 972 <vscale x 2 x i64> %b) 973 ret <vscale x 16 x i1> %out 974} 975 976define <vscale x 8 x i1> @cmpne_wide_h(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 2 x i64> %b) { 977; CHECK-LABEL: cmpne_wide_h: 978; CHECK: // %bb.0: 979; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, z1.d 980; CHECK-NEXT: ret 981 %out = call <vscale x 8 x i1> @llvm.aarch64.sve.cmpne.wide.nxv8i16(<vscale x 8 x i1> %pg, 982 <vscale x 8 x i16> %a, 983 <vscale x 2 x i64> %b) 984 ret <vscale x 8 x i1> %out 985} 986 987define <vscale x 4 x i1> @cmpne_wide_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 2 x i64> %b) { 988; CHECK-LABEL: cmpne_wide_s: 989; CHECK: // %bb.0: 990; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, z1.d 991; CHECK-NEXT: ret 992 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpne.wide.nxv4i32(<vscale x 4 x i1> %pg, 993 <vscale x 4 x i32> %a, 994 <vscale x 2 x i64> %b) 995 ret <vscale x 4 x i1> %out 996} 997 998define <vscale x 16 x i1> @cmpne_ir_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 999; CHECK-LABEL: cmpne_ir_b: 1000; CHECK: // %bb.0: 1001; CHECK-NEXT: ptrue p0.b 1002; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, z1.b 1003; CHECK-NEXT: ret 1004 %out = icmp ne <vscale x 16 x i8> %a, %b 1005 ret <vscale x 16 x i1> %out 1006} 1007 1008define <vscale x 8 x i1> @cmpne_ir_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 1009; CHECK-LABEL: cmpne_ir_h: 1010; CHECK: // %bb.0: 1011; CHECK-NEXT: ptrue p0.h 1012; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, z1.h 1013; CHECK-NEXT: ret 1014 %out = icmp ne <vscale x 8 x i16> %a, %b 1015 ret <vscale x 8 x i1> %out 1016} 1017 1018define <vscale x 4 x i1> @cmpne_ir_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 1019; CHECK-LABEL: cmpne_ir_s: 1020; CHECK: // %bb.0: 1021; CHECK-NEXT: ptrue p0.s 1022; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, z1.s 1023; CHECK-NEXT: ret 1024 %out = icmp ne <vscale x 4 x i32> %a, %b 1025 ret <vscale x 4 x i1> %out 1026} 1027 1028define <vscale x 2 x i1> @cmpne_ir_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 1029; CHECK-LABEL: cmpne_ir_d: 1030; CHECK: // %bb.0: 1031; CHECK-NEXT: ptrue p0.d 1032; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, z1.d 1033; CHECK-NEXT: ret 1034 %out = icmp ne <vscale x 2 x i64> %a, %b 1035 ret <vscale x 2 x i1> %out 1036} 1037 1038define <vscale x 1 x i1> @cmpne_ir_q(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b) { 1039; CHECK-LABEL: cmpne_ir_q: 1040; CHECK: // %bb.0: 1041; CHECK-NEXT: ptrue p0.d 1042; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, z1.d 1043; CHECK-NEXT: punpklo p0.h, p0.b 1044; CHECK-NEXT: ret 1045 %out = icmp ne <vscale x 1 x i64> %a, %b 1046 ret <vscale x 1 x i1> %out 1047} 1048 1049 1050define <vscale x 16 x i1> @cmpgt_wide_splat_b(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, i64 %b) { 1051; CHECK-LABEL: cmpgt_wide_splat_b: 1052; CHECK: // %bb.0: 1053; CHECK-NEXT: mov z1.d, x0 1054; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, z1.d 1055; CHECK-NEXT: ret 1056 %splat = call <vscale x 2 x i64> @llvm.aarch64.sve.dup.x.nxv2i64(i64 %b) 1057 %out = call <vscale x 16 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv16i8(<vscale x 16 x i1> %pg, 1058 <vscale x 16 x i8> %a, 1059 <vscale x 2 x i64> %splat) 1060 ret <vscale x 16 x i1> %out 1061} 1062 1063define <vscale x 4 x i1> @cmpls_wide_splat_s(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, i64 %b) { 1064; CHECK-LABEL: cmpls_wide_splat_s: 1065; CHECK: // %bb.0: 1066; CHECK-NEXT: mov z1.d, x0 1067; CHECK-NEXT: cmpls p0.s, p0/z, z0.s, z1.d 1068; CHECK-NEXT: ret 1069 %splat = call <vscale x 2 x i64> @llvm.aarch64.sve.dup.x.nxv2i64(i64 %b) 1070 %out = call <vscale x 4 x i1> @llvm.aarch64.sve.cmpls.wide.nxv4i32(<vscale x 4 x i1> %pg, 1071 <vscale x 4 x i32> %a, 1072 <vscale x 2 x i64> %splat) 1073 ret <vscale x 4 x i1> %out 1074} 1075 1076; Verify general predicate is folded into the compare 1077define <vscale x 4 x i1> @predicated_icmp(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 1078; CHECK-LABEL: predicated_icmp: 1079; CHECK: // %bb.0: 1080; CHECK-NEXT: ptrue p0.s 1081; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.s 1082; CHECK-NEXT: cmpge p0.s, p0/z, z2.s, z1.s 1083; CHECK-NEXT: ret 1084 %icmp1 = icmp sgt <vscale x 4 x i32> %a, %b 1085 %icmp2 = icmp sle <vscale x 4 x i32> %b, %c 1086 %and = and <vscale x 4 x i1> %icmp1, %icmp2 1087 ret <vscale x 4 x i1> %and 1088} 1089 1090define <vscale x 4 x i1> @predicated_icmp_unknown_lhs(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 1091; CHECK-LABEL: predicated_icmp_unknown_lhs: 1092; CHECK: // %bb.0: 1093; CHECK-NEXT: cmpge p0.s, p0/z, z1.s, z0.s 1094; CHECK-NEXT: ret 1095 %icmp = icmp sle <vscale x 4 x i32> %b, %c 1096 %and = and <vscale x 4 x i1> %a, %icmp 1097 ret <vscale x 4 x i1> %and 1098} 1099 1100define <vscale x 4 x i1> @predicated_icmp_unknown_rhs(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 1101; CHECK-LABEL: predicated_icmp_unknown_rhs: 1102; CHECK: // %bb.0: 1103; CHECK-NEXT: cmpge p0.s, p0/z, z1.s, z0.s 1104; CHECK-NEXT: ret 1105 %icmp = icmp sle <vscale x 4 x i32> %b, %c 1106 %and = and <vscale x 4 x i1> %icmp, %a 1107 ret <vscale x 4 x i1> %and 1108} 1109 1110define <vscale x 16 x i1> @predicated_icmp_eq_imm(<vscale x 16 x i1> %a, <vscale x 16 x i8> %b) { 1111; CHECK-LABEL: predicated_icmp_eq_imm: 1112; CHECK: // %bb.0: 1113; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 1114; CHECK-NEXT: ret 1115 %imm = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 0, i64 0), <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer 1116 %icmp = icmp eq <vscale x 16 x i8> %b, %imm 1117 %and = and <vscale x 16 x i1> %a, %icmp 1118 ret <vscale x 16 x i1> %and 1119} 1120 1121define <vscale x 8 x i1> @predicated_icmp_ne_imm(<vscale x 8 x i1> %a, <vscale x 8 x i16> %b) { 1122; CHECK-LABEL: predicated_icmp_ne_imm: 1123; CHECK: // %bb.0: 1124; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #-16 1125; CHECK-NEXT: ret 1126 %imm = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 -16, i64 0), <vscale x 8 x i16> undef, <vscale x 8 x i32> zeroinitializer 1127 %icmp = icmp ne <vscale x 8 x i16> %b, %imm 1128 %and = and <vscale x 8 x i1> %a, %icmp 1129 ret <vscale x 8 x i1> %and 1130} 1131 1132define <vscale x 4 x i1> @predicated_icmp_sge_imm(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b) { 1133; CHECK-LABEL: predicated_icmp_sge_imm: 1134; CHECK: // %bb.0: 1135; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, #1 1136; CHECK-NEXT: ret 1137 %imm = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i64 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 1138 %icmp = icmp sge <vscale x 4 x i32> %b, %imm 1139 %and = and <vscale x 4 x i1> %a, %icmp 1140 ret <vscale x 4 x i1> %and 1141} 1142 1143define <vscale x 2 x i1> @predicated_icmp_sgt_imm(<vscale x 2 x i1> %a, <vscale x 2 x i64> %b) { 1144; CHECK-LABEL: predicated_icmp_sgt_imm: 1145; CHECK: // %bb.0: 1146; CHECK-NEXT: cmpgt p0.d, p0/z, z0.d, #2 1147; CHECK-NEXT: ret 1148 %imm = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 2, i64 0), <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer 1149 %icmp = icmp sgt <vscale x 2 x i64> %b, %imm 1150 %and = and <vscale x 2 x i1> %a, %icmp 1151 ret <vscale x 2 x i1> %and 1152} 1153 1154define <vscale x 16 x i1> @predicated_icmp_sle_imm(<vscale x 16 x i1> %a, <vscale x 16 x i8> %b) { 1155; CHECK-LABEL: predicated_icmp_sle_imm: 1156; CHECK: // %bb.0: 1157; CHECK-NEXT: cmple p0.b, p0/z, z0.b, #-1 1158; CHECK-NEXT: ret 1159 %imm = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 -1, i64 0), <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer 1160 %icmp = icmp sle <vscale x 16 x i8> %b, %imm 1161 %and = and <vscale x 16 x i1> %a, %icmp 1162 ret <vscale x 16 x i1> %and 1163} 1164 1165define <vscale x 8 x i1> @predicated_icmp_slt_imm(<vscale x 8 x i1> %a, <vscale x 8 x i16> %b) { 1166; CHECK-LABEL: predicated_icmp_slt_imm: 1167; CHECK: // %bb.0: 1168; CHECK-NEXT: cmplt p0.h, p0/z, z0.h, #-2 1169; CHECK-NEXT: ret 1170 %imm = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 -2, i64 0), <vscale x 8 x i16> undef, <vscale x 8 x i32> zeroinitializer 1171 %icmp = icmp slt <vscale x 8 x i16> %b, %imm 1172 %and = and <vscale x 8 x i1> %a, %icmp 1173 ret <vscale x 8 x i1> %and 1174} 1175 1176define <vscale x 4 x i1> @predicated_icmp_uge_imm(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b) { 1177; CHECK-LABEL: predicated_icmp_uge_imm: 1178; CHECK: // %bb.0: 1179; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, #1 1180; CHECK-NEXT: ret 1181 %imm = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i64 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 1182 %icmp = icmp uge <vscale x 4 x i32> %b, %imm 1183 %and = and <vscale x 4 x i1> %a, %icmp 1184 ret <vscale x 4 x i1> %and 1185} 1186 1187define <vscale x 2 x i1> @predicated_icmp_ugt_imm(<vscale x 2 x i1> %a, <vscale x 2 x i64> %b) { 1188; CHECK-LABEL: predicated_icmp_ugt_imm: 1189; CHECK: // %bb.0: 1190; CHECK-NEXT: cmphi p0.d, p0/z, z0.d, #2 1191; CHECK-NEXT: ret 1192 %imm = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 2, i64 0), <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer 1193 %icmp = icmp ugt <vscale x 2 x i64> %b, %imm 1194 %and = and <vscale x 2 x i1> %a, %icmp 1195 ret <vscale x 2 x i1> %and 1196} 1197 1198define <vscale x 16 x i1> @predicated_icmp_ule_imm(<vscale x 16 x i1> %a, <vscale x 16 x i8> %b) { 1199; CHECK-LABEL: predicated_icmp_ule_imm: 1200; CHECK: // %bb.0: 1201; CHECK-NEXT: cmpls p0.b, p0/z, z0.b, #3 1202; CHECK-NEXT: ret 1203 %imm = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 3, i64 0), <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer 1204 %icmp = icmp ule <vscale x 16 x i8> %b, %imm 1205 %and = and <vscale x 16 x i1> %a, %icmp 1206 ret <vscale x 16 x i1> %and 1207} 1208 1209define <vscale x 8 x i1> @predicated_icmp_ult_imm(<vscale x 8 x i1> %a, <vscale x 8 x i16> %b) { 1210; CHECK-LABEL: predicated_icmp_ult_imm: 1211; CHECK: // %bb.0: 1212; CHECK-NEXT: cmplo p0.h, p0/z, z0.h, #127 1213; CHECK-NEXT: ret 1214 %imm = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 127, i64 0), <vscale x 8 x i16> undef, <vscale x 8 x i32> zeroinitializer 1215 %icmp = icmp ult <vscale x 8 x i16> %b, %imm 1216 %and = and <vscale x 8 x i1> %a, %icmp 1217 ret <vscale x 8 x i1> %and 1218} 1219 1220%svboolx2 = type { <vscale x 4 x i1>, <vscale x 4 x i1> } 1221 1222define %svboolx2 @and_of_multiuse_icmp_sle(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 1223; CHECK-LABEL: and_of_multiuse_icmp_sle: 1224; CHECK: // %bb.0: 1225; CHECK-NEXT: ptrue p1.s 1226; CHECK-NEXT: cmpge p1.s, p1/z, z1.s, z0.s 1227; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b 1228; CHECK-NEXT: ret 1229 %cmp = icmp sle <vscale x 4 x i32> %b, %c 1230 %and = and <vscale x 4 x i1> %a, %cmp 1231 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0 1232 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1 1233 ret %svboolx2 %ins.2 1234} 1235 1236define %svboolx2 @and_of_multiuse_icmp_sle_imm(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b) { 1237; CHECK-LABEL: and_of_multiuse_icmp_sle_imm: 1238; CHECK: // %bb.0: 1239; CHECK-NEXT: ptrue p1.s 1240; CHECK-NEXT: cmple p1.s, p1/z, z0.s, #1 1241; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b 1242; CHECK-NEXT: ret 1243 %imm = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i64 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 1244 %cmp = icmp sle <vscale x 4 x i32> %b, %imm 1245 %and = and <vscale x 4 x i1> %a, %cmp 1246 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0 1247 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1 1248 ret %svboolx2 %ins.2 1249} 1250 1251define %svboolx2 @and_of_multiuse_icmp_ugt(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 1252; CHECK-LABEL: and_of_multiuse_icmp_ugt: 1253; CHECK: // %bb.0: 1254; CHECK-NEXT: ptrue p1.s 1255; CHECK-NEXT: cmphi p1.s, p1/z, z0.s, z1.s 1256; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b 1257; CHECK-NEXT: ret 1258 %cmp = icmp ugt <vscale x 4 x i32> %b, %c 1259 %and = and <vscale x 4 x i1> %a, %cmp 1260 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0 1261 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1 1262 ret %svboolx2 %ins.2 1263} 1264 1265define %svboolx2 @and_of_multiuse_icmp_ugt_imm(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b) { 1266; CHECK-LABEL: and_of_multiuse_icmp_ugt_imm: 1267; CHECK: // %bb.0: 1268; CHECK-NEXT: ptrue p1.s 1269; CHECK-NEXT: cmphi p1.s, p1/z, z0.s, #1 1270; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b 1271; CHECK-NEXT: ret 1272 %imm = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i64 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 1273 %cmp = icmp ugt <vscale x 4 x i32> %b, %imm 1274 %and = and <vscale x 4 x i1> %a, %cmp 1275 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0 1276 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1 1277 ret %svboolx2 %ins.2 1278} 1279 1280declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpeq.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1281declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpeq.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1282declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpeq.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1283declare <vscale x 2 x i1> @llvm.aarch64.sve.cmpeq.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1284declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1285declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1286declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpeq.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1287 1288declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1289declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpge.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1290declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1291declare <vscale x 2 x i1> @llvm.aarch64.sve.cmpge.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1292declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpge.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1293declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpge.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1294declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpge.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1295 1296declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpgt.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1297declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpgt.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1298declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpgt.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1299declare <vscale x 2 x i1> @llvm.aarch64.sve.cmpgt.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1300declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1301declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1302declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpgt.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1303 1304declare <vscale x 16 x i1> @llvm.aarch64.sve.cmphi.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1305declare <vscale x 8 x i1> @llvm.aarch64.sve.cmphi.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1306declare <vscale x 4 x i1> @llvm.aarch64.sve.cmphi.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1307declare <vscale x 2 x i1> @llvm.aarch64.sve.cmphi.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1308declare <vscale x 16 x i1> @llvm.aarch64.sve.cmphi.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1309declare <vscale x 8 x i1> @llvm.aarch64.sve.cmphi.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1310declare <vscale x 4 x i1> @llvm.aarch64.sve.cmphi.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1311 1312declare <vscale x 16 x i1> @llvm.aarch64.sve.cmphs.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1313declare <vscale x 8 x i1> @llvm.aarch64.sve.cmphs.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1314declare <vscale x 4 x i1> @llvm.aarch64.sve.cmphs.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1315declare <vscale x 2 x i1> @llvm.aarch64.sve.cmphs.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1316declare <vscale x 16 x i1> @llvm.aarch64.sve.cmphs.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1317declare <vscale x 8 x i1> @llvm.aarch64.sve.cmphs.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1318declare <vscale x 4 x i1> @llvm.aarch64.sve.cmphs.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1319 1320declare <vscale x 16 x i1> @llvm.aarch64.sve.cmple.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1321declare <vscale x 8 x i1> @llvm.aarch64.sve.cmple.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1322declare <vscale x 4 x i1> @llvm.aarch64.sve.cmple.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1323 1324declare <vscale x 16 x i1> @llvm.aarch64.sve.cmplo.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1325declare <vscale x 8 x i1> @llvm.aarch64.sve.cmplo.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1326declare <vscale x 4 x i1> @llvm.aarch64.sve.cmplo.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1327 1328declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpls.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1329declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpls.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1330declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpls.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1331 1332declare <vscale x 16 x i1> @llvm.aarch64.sve.cmplt.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1333declare <vscale x 8 x i1> @llvm.aarch64.sve.cmplt.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1334declare <vscale x 4 x i1> @llvm.aarch64.sve.cmplt.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1335 1336declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpne.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 1337declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpne.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 1338declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpne.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1339declare <vscale x 2 x i1> @llvm.aarch64.sve.cmpne.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1340declare <vscale x 16 x i1> @llvm.aarch64.sve.cmpne.wide.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 2 x i64>) 1341declare <vscale x 8 x i1> @llvm.aarch64.sve.cmpne.wide.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 2 x i64>) 1342declare <vscale x 4 x i1> @llvm.aarch64.sve.cmpne.wide.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 2 x i64>) 1343 1344declare <vscale x 2 x i64> @llvm.aarch64.sve.dup.x.nxv2i64(i64) 1345