1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; i8 9define <4 x i8> @vls_sve_and_4xi8(<4 x i8> %b) nounwind { 10; CHECK-LABEL: vls_sve_and_4xi8: 11; CHECK: // %bb.0: 12; CHECK-NEXT: adrp x8, .LCPI0_0 13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 14; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI0_0] 15; CHECK-NEXT: and z0.d, z0.d, z1.d 16; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 17; CHECK-NEXT: ret 18; 19; NONEON-NOSVE-LABEL: vls_sve_and_4xi8: 20; NONEON-NOSVE: // %bb.0: 21; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 22; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 23; NONEON-NOSVE-NEXT: strh wzr, [sp, #12] 24; NONEON-NOSVE-NEXT: strh wzr, [sp, #8] 25; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 26; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2] 27; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 28; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 29; NONEON-NOSVE-NEXT: add sp, sp, #16 30; NONEON-NOSVE-NEXT: ret 31 %c = and <4 x i8> %b, <i8 0, i8 255, i8 0, i8 255> 32 ret <4 x i8> %c 33} 34 35define <8 x i8> @vls_sve_and_8xi8(<8 x i8> %b) nounwind { 36; CHECK-LABEL: vls_sve_and_8xi8: 37; CHECK: // %bb.0: 38; CHECK-NEXT: adrp x8, .LCPI1_0 39; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 40; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI1_0] 41; CHECK-NEXT: and z0.d, z0.d, z1.d 42; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 43; CHECK-NEXT: ret 44; 45; NONEON-NOSVE-LABEL: vls_sve_and_8xi8: 46; NONEON-NOSVE: // %bb.0: 47; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 48; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 49; NONEON-NOSVE-NEXT: strb wzr, [sp, #14] 50; NONEON-NOSVE-NEXT: strb wzr, [sp, #12] 51; NONEON-NOSVE-NEXT: strb w8, [sp, #15] 52; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 53; NONEON-NOSVE-NEXT: strb wzr, [sp, #10] 54; NONEON-NOSVE-NEXT: strb w8, [sp, #13] 55; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 56; NONEON-NOSVE-NEXT: strb wzr, [sp, #8] 57; NONEON-NOSVE-NEXT: strb w8, [sp, #11] 58; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 59; NONEON-NOSVE-NEXT: strb w8, [sp, #9] 60; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 61; NONEON-NOSVE-NEXT: add sp, sp, #16 62; NONEON-NOSVE-NEXT: ret 63 %c = and <8 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255> 64 ret <8 x i8> %c 65} 66 67define <16 x i8> @vls_sve_and_16xi8(<16 x i8> %b) nounwind { 68; CHECK-LABEL: vls_sve_and_16xi8: 69; CHECK: // %bb.0: 70; CHECK-NEXT: adrp x8, .LCPI2_0 71; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 72; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI2_0] 73; CHECK-NEXT: and z0.d, z0.d, z1.d 74; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 75; CHECK-NEXT: ret 76; 77; NONEON-NOSVE-LABEL: vls_sve_and_16xi8: 78; NONEON-NOSVE: // %bb.0: 79; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 80; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 81; NONEON-NOSVE-NEXT: strb wzr, [sp, #30] 82; NONEON-NOSVE-NEXT: strb wzr, [sp, #28] 83; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 84; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 85; NONEON-NOSVE-NEXT: strb wzr, [sp, #26] 86; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 87; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 88; NONEON-NOSVE-NEXT: strb wzr, [sp, #24] 89; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 90; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 91; NONEON-NOSVE-NEXT: strb wzr, [sp, #22] 92; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 93; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 94; NONEON-NOSVE-NEXT: strb wzr, [sp, #20] 95; NONEON-NOSVE-NEXT: strb w8, [sp, #23] 96; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 97; NONEON-NOSVE-NEXT: strb wzr, [sp, #18] 98; NONEON-NOSVE-NEXT: strb w8, [sp, #21] 99; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 100; NONEON-NOSVE-NEXT: strb wzr, [sp, #16] 101; NONEON-NOSVE-NEXT: strb w8, [sp, #19] 102; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 103; NONEON-NOSVE-NEXT: strb w8, [sp, #17] 104; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 105; NONEON-NOSVE-NEXT: add sp, sp, #32 106; NONEON-NOSVE-NEXT: ret 107 %c = and <16 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255> 108 ret <16 x i8> %c 109} 110 111define <32 x i8> @vls_sve_and_32xi8(<32 x i8> %ap) nounwind { 112; CHECK-LABEL: vls_sve_and_32xi8: 113; CHECK: // %bb.0: 114; CHECK-NEXT: adrp x8, .LCPI3_0 115; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 116; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 117; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI3_0] 118; CHECK-NEXT: and z0.d, z0.d, z2.d 119; CHECK-NEXT: and z1.d, z1.d, z2.d 120; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 121; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1 122; CHECK-NEXT: ret 123; 124; NONEON-NOSVE-LABEL: vls_sve_and_32xi8: 125; NONEON-NOSVE: // %bb.0: 126; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-64]! 127; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 128; NONEON-NOSVE-NEXT: strb wzr, [sp, #46] 129; NONEON-NOSVE-NEXT: strb wzr, [sp, #44] 130; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 131; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 132; NONEON-NOSVE-NEXT: strb wzr, [sp, #42] 133; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 134; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 135; NONEON-NOSVE-NEXT: strb wzr, [sp, #40] 136; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 137; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 138; NONEON-NOSVE-NEXT: strb wzr, [sp, #38] 139; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 140; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 141; NONEON-NOSVE-NEXT: strb wzr, [sp, #36] 142; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 143; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 144; NONEON-NOSVE-NEXT: strb wzr, [sp, #34] 145; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 146; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 147; NONEON-NOSVE-NEXT: strb wzr, [sp, #32] 148; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 149; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 150; NONEON-NOSVE-NEXT: strb wzr, [sp, #62] 151; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 152; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 153; NONEON-NOSVE-NEXT: strb wzr, [sp, #60] 154; NONEON-NOSVE-NEXT: strb w8, [sp, #63] 155; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 156; NONEON-NOSVE-NEXT: strb wzr, [sp, #58] 157; NONEON-NOSVE-NEXT: strb w8, [sp, #61] 158; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 159; NONEON-NOSVE-NEXT: strb wzr, [sp, #56] 160; NONEON-NOSVE-NEXT: strb w8, [sp, #59] 161; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 162; NONEON-NOSVE-NEXT: strb wzr, [sp, #54] 163; NONEON-NOSVE-NEXT: strb w8, [sp, #57] 164; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 165; NONEON-NOSVE-NEXT: strb wzr, [sp, #52] 166; NONEON-NOSVE-NEXT: strb w8, [sp, #55] 167; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 168; NONEON-NOSVE-NEXT: strb wzr, [sp, #50] 169; NONEON-NOSVE-NEXT: strb w8, [sp, #53] 170; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 171; NONEON-NOSVE-NEXT: strb wzr, [sp, #48] 172; NONEON-NOSVE-NEXT: strb w8, [sp, #51] 173; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 174; NONEON-NOSVE-NEXT: strb w8, [sp, #49] 175; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 176; NONEON-NOSVE-NEXT: add sp, sp, #64 177; NONEON-NOSVE-NEXT: ret 178 %b = and <32 x i8> %ap, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, 179 i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255> 180 ret <32 x i8> %b 181} 182 183; i16 184define <2 x i16> @vls_sve_and_2xi16(<2 x i16> %b) nounwind { 185; CHECK-LABEL: vls_sve_and_2xi16: 186; CHECK: // %bb.0: 187; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 188; CHECK-NEXT: fmov s1, wzr 189; CHECK-NEXT: mov z0.s, z0.s[1] 190; CHECK-NEXT: zip1 z0.s, z1.s, z0.s 191; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 192; CHECK-NEXT: ret 193; 194; NONEON-NOSVE-LABEL: vls_sve_and_2xi16: 195; NONEON-NOSVE: // %bb.0: 196; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 197; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 198; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #8] 199; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 200; NONEON-NOSVE-NEXT: add sp, sp, #16 201; NONEON-NOSVE-NEXT: ret 202 %c = and <2 x i16> %b, <i16 0, i16 65535> 203 ret <2 x i16> %c 204} 205 206define <4 x i16> @vls_sve_and_4xi16(<4 x i16> %b) nounwind { 207; CHECK-LABEL: vls_sve_and_4xi16: 208; CHECK: // %bb.0: 209; CHECK-NEXT: adrp x8, .LCPI5_0 210; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 211; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI5_0] 212; CHECK-NEXT: and z0.d, z0.d, z1.d 213; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 214; CHECK-NEXT: ret 215; 216; NONEON-NOSVE-LABEL: vls_sve_and_4xi16: 217; NONEON-NOSVE: // %bb.0: 218; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 219; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 220; NONEON-NOSVE-NEXT: strh wzr, [sp, #12] 221; NONEON-NOSVE-NEXT: strh wzr, [sp, #8] 222; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 223; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 224; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 225; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 226; NONEON-NOSVE-NEXT: add sp, sp, #16 227; NONEON-NOSVE-NEXT: ret 228 %c = and <4 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535> 229 ret <4 x i16> %c 230} 231 232define <8 x i16> @vls_sve_and_8xi16(<8 x i16> %b) nounwind { 233; CHECK-LABEL: vls_sve_and_8xi16: 234; CHECK: // %bb.0: 235; CHECK-NEXT: adrp x8, .LCPI6_0 236; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 237; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI6_0] 238; CHECK-NEXT: and z0.d, z0.d, z1.d 239; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 240; CHECK-NEXT: ret 241; 242; NONEON-NOSVE-LABEL: vls_sve_and_8xi16: 243; NONEON-NOSVE: // %bb.0: 244; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 245; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 246; NONEON-NOSVE-NEXT: strh wzr, [sp, #28] 247; NONEON-NOSVE-NEXT: strh wzr, [sp, #24] 248; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 249; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 250; NONEON-NOSVE-NEXT: strh wzr, [sp, #20] 251; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 252; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 253; NONEON-NOSVE-NEXT: strh wzr, [sp, #16] 254; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 255; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 256; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 257; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 258; NONEON-NOSVE-NEXT: add sp, sp, #32 259; NONEON-NOSVE-NEXT: ret 260 %c = and <8 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535> 261 ret <8 x i16> %c 262} 263 264define <16 x i16> @vls_sve_and_16xi16(<16 x i16> %b) nounwind { 265; CHECK-LABEL: vls_sve_and_16xi16: 266; CHECK: // %bb.0: 267; CHECK-NEXT: adrp x8, .LCPI7_0 268; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 269; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 270; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI7_0] 271; CHECK-NEXT: and z0.d, z0.d, z2.d 272; CHECK-NEXT: and z1.d, z1.d, z2.d 273; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 274; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1 275; CHECK-NEXT: ret 276; 277; NONEON-NOSVE-LABEL: vls_sve_and_16xi16: 278; NONEON-NOSVE: // %bb.0: 279; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-64]! 280; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 281; NONEON-NOSVE-NEXT: strh wzr, [sp, #44] 282; NONEON-NOSVE-NEXT: strh wzr, [sp, #40] 283; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 284; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 285; NONEON-NOSVE-NEXT: strh wzr, [sp, #36] 286; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 287; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 288; NONEON-NOSVE-NEXT: strh wzr, [sp, #32] 289; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 290; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 291; NONEON-NOSVE-NEXT: strh wzr, [sp, #60] 292; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 293; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 294; NONEON-NOSVE-NEXT: strh wzr, [sp, #56] 295; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 296; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 297; NONEON-NOSVE-NEXT: strh wzr, [sp, #52] 298; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 299; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 300; NONEON-NOSVE-NEXT: strh wzr, [sp, #48] 301; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 302; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 303; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 304; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 305; NONEON-NOSVE-NEXT: add sp, sp, #64 306; NONEON-NOSVE-NEXT: ret 307 %c = and <16 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535> 308 ret <16 x i16> %c 309} 310 311; i32 312define <2 x i32> @vls_sve_and_2xi32(<2 x i32> %b) nounwind { 313; CHECK-LABEL: vls_sve_and_2xi32: 314; CHECK: // %bb.0: 315; CHECK-NEXT: index z1.s, #0, #-1 316; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 317; CHECK-NEXT: and z0.d, z0.d, z1.d 318; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 319; CHECK-NEXT: ret 320; 321; NONEON-NOSVE-LABEL: vls_sve_and_2xi32: 322; NONEON-NOSVE: // %bb.0: 323; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 324; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 325; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #8] 326; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 327; NONEON-NOSVE-NEXT: add sp, sp, #16 328; NONEON-NOSVE-NEXT: ret 329 %c = and <2 x i32> %b, <i32 0, i32 4294967295> 330 ret <2 x i32> %c 331} 332 333define <4 x i32> @vls_sve_and_4xi32(<4 x i32> %b) nounwind { 334; CHECK-LABEL: vls_sve_and_4xi32: 335; CHECK: // %bb.0: 336; CHECK-NEXT: adrp x8, .LCPI9_0 337; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 338; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI9_0] 339; CHECK-NEXT: and z0.d, z0.d, z1.d 340; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 341; CHECK-NEXT: ret 342; 343; NONEON-NOSVE-LABEL: vls_sve_and_4xi32: 344; NONEON-NOSVE: // %bb.0: 345; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 346; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 347; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #24] 348; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 349; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #16] 350; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 351; NONEON-NOSVE-NEXT: add sp, sp, #32 352; NONEON-NOSVE-NEXT: ret 353 %c = and <4 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295> 354 ret <4 x i32> %c 355} 356 357define <8 x i32> @vls_sve_and_8xi32(<8 x i32> %b) nounwind { 358; CHECK-LABEL: vls_sve_and_8xi32: 359; CHECK: // %bb.0: 360; CHECK-NEXT: adrp x8, .LCPI10_0 361; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 362; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 363; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI10_0] 364; CHECK-NEXT: and z0.d, z0.d, z2.d 365; CHECK-NEXT: and z1.d, z1.d, z2.d 366; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 367; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1 368; CHECK-NEXT: ret 369; 370; NONEON-NOSVE-LABEL: vls_sve_and_8xi32: 371; NONEON-NOSVE: // %bb.0: 372; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-64]! 373; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 374; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #40] 375; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 376; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #32] 377; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 378; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #56] 379; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 380; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #48] 381; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 382; NONEON-NOSVE-NEXT: add sp, sp, #64 383; NONEON-NOSVE-NEXT: ret 384 %c = and <8 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295> 385 ret <8 x i32> %c 386} 387 388; i64 389define <2 x i64> @vls_sve_and_2xi64(<2 x i64> %b) nounwind { 390; CHECK-LABEL: vls_sve_and_2xi64: 391; CHECK: // %bb.0: 392; CHECK-NEXT: index z1.d, #0, #-1 393; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 394; CHECK-NEXT: and z0.d, z0.d, z1.d 395; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 396; CHECK-NEXT: ret 397; 398; NONEON-NOSVE-LABEL: vls_sve_and_2xi64: 399; NONEON-NOSVE: // %bb.0: 400; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 401; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 402; NONEON-NOSVE-NEXT: stp xzr, x8, [sp, #16] 403; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 404; NONEON-NOSVE-NEXT: add sp, sp, #32 405; NONEON-NOSVE-NEXT: ret 406 %c = and <2 x i64> %b, <i64 0, i64 18446744073709551615> 407 ret <2 x i64> %c 408} 409 410define <4 x i64> @vls_sve_and_4xi64(<4 x i64> %b) nounwind { 411; CHECK-LABEL: vls_sve_and_4xi64: 412; CHECK: // %bb.0: 413; CHECK-NEXT: index z2.d, #0, #-1 414; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 415; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 416; CHECK-NEXT: and z0.d, z0.d, z2.d 417; CHECK-NEXT: and z1.d, z1.d, z2.d 418; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 419; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1 420; CHECK-NEXT: ret 421; 422; NONEON-NOSVE-LABEL: vls_sve_and_4xi64: 423; NONEON-NOSVE: // %bb.0: 424; NONEON-NOSVE-NEXT: sub sp, sp, #64 425; NONEON-NOSVE-NEXT: str q0, [sp, #32] 426; NONEON-NOSVE-NEXT: ldr x8, [sp, #40] 427; NONEON-NOSVE-NEXT: str q1, [sp] 428; NONEON-NOSVE-NEXT: stp xzr, x8, [sp, #48] 429; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 430; NONEON-NOSVE-NEXT: ldr q0, [sp, #48] 431; NONEON-NOSVE-NEXT: stp xzr, x8, [sp, #16] 432; NONEON-NOSVE-NEXT: ldr q1, [sp, #16] 433; NONEON-NOSVE-NEXT: add sp, sp, #64 434; NONEON-NOSVE-NEXT: ret 435 %c = and <4 x i64> %b, <i64 0, i64 18446744073709551615, i64 0, i64 18446744073709551615> 436 ret <4 x i64> %c 437} 438