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; 9; ASHR 10; 11 12define <4 x i8> @ashr_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 13; CHECK-LABEL: ashr_v4i8: 14; CHECK: // %bb.0: 15; CHECK-NEXT: ptrue p0.h, vl4 16; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 17; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 18; CHECK-NEXT: and z1.h, z1.h, #0xff 19; CHECK-NEXT: sxtb z0.h, p0/m, z0.h 20; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h 21; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 22; CHECK-NEXT: ret 23; 24; NONEON-NOSVE-LABEL: ashr_v4i8: 25; NONEON-NOSVE: // %bb.0: 26; NONEON-NOSVE-NEXT: sub sp, sp, #32 27; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 28; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 29; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 30; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 31; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20] 32; NONEON-NOSVE-NEXT: ldrsb w11, [sp, #12] 33; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18] 34; NONEON-NOSVE-NEXT: ldrsb w13, [sp, #10] 35; NONEON-NOSVE-NEXT: asr w8, w9, w8 36; NONEON-NOSVE-NEXT: ldrb w9, [sp, #16] 37; NONEON-NOSVE-NEXT: ldrsb w14, [sp, #8] 38; NONEON-NOSVE-NEXT: asr w10, w11, w10 39; NONEON-NOSVE-NEXT: asr w11, w13, w12 40; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 41; NONEON-NOSVE-NEXT: asr w8, w14, w9 42; NONEON-NOSVE-NEXT: strh w10, [sp, #28] 43; NONEON-NOSVE-NEXT: strh w11, [sp, #26] 44; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 45; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 46; NONEON-NOSVE-NEXT: add sp, sp, #32 47; NONEON-NOSVE-NEXT: ret 48 %res = ashr <4 x i8> %op1, %op2 49 ret <4 x i8> %res 50} 51 52define <8 x i8> @ashr_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 53; CHECK-LABEL: ashr_v8i8: 54; CHECK: // %bb.0: 55; CHECK-NEXT: ptrue p0.b, vl8 56; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 57; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 58; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b 59; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 60; CHECK-NEXT: ret 61; 62; NONEON-NOSVE-LABEL: ashr_v8i8: 63; NONEON-NOSVE: // %bb.0: 64; NONEON-NOSVE-NEXT: sub sp, sp, #32 65; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 66; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 68; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 69; NONEON-NOSVE-NEXT: asr w8, w9, w8 70; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 71; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 72; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 73; NONEON-NOSVE-NEXT: asr w8, w9, w8 74; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 75; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 76; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 77; NONEON-NOSVE-NEXT: asr w8, w9, w8 78; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 79; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 80; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 81; NONEON-NOSVE-NEXT: asr w8, w9, w8 82; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 83; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 84; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 85; NONEON-NOSVE-NEXT: asr w8, w9, w8 86; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 87; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 88; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 89; NONEON-NOSVE-NEXT: asr w8, w9, w8 90; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 91; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 92; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 93; NONEON-NOSVE-NEXT: asr w8, w9, w8 94; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 95; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 96; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 97; NONEON-NOSVE-NEXT: asr w8, w9, w8 98; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 99; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 100; NONEON-NOSVE-NEXT: add sp, sp, #32 101; NONEON-NOSVE-NEXT: ret 102 %res = ashr <8 x i8> %op1, %op2 103 ret <8 x i8> %res 104} 105 106define <16 x i8> @ashr_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 107; CHECK-LABEL: ashr_v16i8: 108; CHECK: // %bb.0: 109; CHECK-NEXT: ptrue p0.b, vl16 110; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 111; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 112; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b 113; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 114; CHECK-NEXT: ret 115; 116; NONEON-NOSVE-LABEL: ashr_v16i8: 117; NONEON-NOSVE: // %bb.0: 118; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 119; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 120; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 121; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 122; NONEON-NOSVE-NEXT: asr w8, w9, w8 123; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 124; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 125; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 126; NONEON-NOSVE-NEXT: asr w8, w9, w8 127; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 128; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 129; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 130; NONEON-NOSVE-NEXT: asr w8, w9, w8 131; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 132; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 133; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 134; NONEON-NOSVE-NEXT: asr w8, w9, w8 135; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 136; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 137; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 138; NONEON-NOSVE-NEXT: asr w8, w9, w8 139; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 140; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 141; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 142; NONEON-NOSVE-NEXT: asr w8, w9, w8 143; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 144; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 145; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 146; NONEON-NOSVE-NEXT: asr w8, w9, w8 147; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 148; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 149; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 150; NONEON-NOSVE-NEXT: asr w8, w9, w8 151; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 152; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 153; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 154; NONEON-NOSVE-NEXT: asr w8, w9, w8 155; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 156; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 157; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 158; NONEON-NOSVE-NEXT: asr w8, w9, w8 159; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 160; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 161; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 162; NONEON-NOSVE-NEXT: asr w8, w9, w8 163; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 164; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 165; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 166; NONEON-NOSVE-NEXT: asr w8, w9, w8 167; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 168; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 169; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 170; NONEON-NOSVE-NEXT: asr w8, w9, w8 171; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 172; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 173; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 174; NONEON-NOSVE-NEXT: asr w8, w9, w8 175; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 176; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 177; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 178; NONEON-NOSVE-NEXT: asr w8, w9, w8 179; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 180; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 181; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 182; NONEON-NOSVE-NEXT: asr w8, w9, w8 183; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 184; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 185; NONEON-NOSVE-NEXT: add sp, sp, #48 186; NONEON-NOSVE-NEXT: ret 187 %res = ashr <16 x i8> %op1, %op2 188 ret <16 x i8> %res 189} 190 191define void @ashr_v32i8(ptr %a, ptr %b) { 192; CHECK-LABEL: ashr_v32i8: 193; CHECK: // %bb.0: 194; CHECK-NEXT: ldp q0, q3, [x1] 195; CHECK-NEXT: ptrue p0.b, vl16 196; CHECK-NEXT: ldp q1, q2, [x0] 197; CHECK-NEXT: asrr z0.b, p0/m, z0.b, z1.b 198; CHECK-NEXT: movprfx z1, z2 199; CHECK-NEXT: asr z1.b, p0/m, z1.b, z3.b 200; CHECK-NEXT: stp q0, q1, [x0] 201; CHECK-NEXT: ret 202; 203; NONEON-NOSVE-LABEL: ashr_v32i8: 204; NONEON-NOSVE: // %bb.0: 205; NONEON-NOSVE-NEXT: sub sp, sp, #96 206; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 207; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 208; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 209; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 210; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 211; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 212; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47] 213; NONEON-NOSVE-NEXT: asr w8, w9, w8 214; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46] 215; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 216; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 217; NONEON-NOSVE-NEXT: asr w8, w9, w8 218; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45] 219; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 220; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 221; NONEON-NOSVE-NEXT: asr w8, w9, w8 222; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44] 223; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 224; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 225; NONEON-NOSVE-NEXT: asr w8, w9, w8 226; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43] 227; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 228; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 229; NONEON-NOSVE-NEXT: asr w8, w9, w8 230; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42] 231; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 232; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 233; NONEON-NOSVE-NEXT: asr w8, w9, w8 234; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41] 235; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 236; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 237; NONEON-NOSVE-NEXT: asr w8, w9, w8 238; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40] 239; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 240; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 241; NONEON-NOSVE-NEXT: asr w8, w9, w8 242; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39] 243; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 244; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 245; NONEON-NOSVE-NEXT: asr w8, w9, w8 246; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38] 247; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 248; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 249; NONEON-NOSVE-NEXT: asr w8, w9, w8 250; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37] 251; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 252; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 253; NONEON-NOSVE-NEXT: asr w8, w9, w8 254; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36] 255; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 256; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 257; NONEON-NOSVE-NEXT: asr w8, w9, w8 258; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35] 259; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 260; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 261; NONEON-NOSVE-NEXT: asr w8, w9, w8 262; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34] 263; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 264; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 265; NONEON-NOSVE-NEXT: asr w8, w9, w8 266; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33] 267; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 268; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 269; NONEON-NOSVE-NEXT: asr w8, w9, w8 270; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32] 271; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 272; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 273; NONEON-NOSVE-NEXT: asr w8, w9, w8 274; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 275; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 276; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 277; NONEON-NOSVE-NEXT: asr w8, w9, w8 278; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 279; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 280; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 281; NONEON-NOSVE-NEXT: asr w8, w9, w8 282; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 283; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 284; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 285; NONEON-NOSVE-NEXT: asr w8, w9, w8 286; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 287; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 288; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 289; NONEON-NOSVE-NEXT: asr w8, w9, w8 290; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 291; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 292; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 293; NONEON-NOSVE-NEXT: asr w8, w9, w8 294; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 295; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 296; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 297; NONEON-NOSVE-NEXT: asr w8, w9, w8 298; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 299; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 300; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 301; NONEON-NOSVE-NEXT: asr w8, w9, w8 302; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 303; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 304; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 305; NONEON-NOSVE-NEXT: asr w8, w9, w8 306; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 307; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 308; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 309; NONEON-NOSVE-NEXT: asr w8, w9, w8 310; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 311; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 312; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 313; NONEON-NOSVE-NEXT: asr w8, w9, w8 314; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 315; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 316; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 317; NONEON-NOSVE-NEXT: asr w8, w9, w8 318; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 319; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 320; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 321; NONEON-NOSVE-NEXT: asr w8, w9, w8 322; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 323; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 324; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 325; NONEON-NOSVE-NEXT: asr w8, w9, w8 326; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 327; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 328; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 329; NONEON-NOSVE-NEXT: asr w8, w9, w8 330; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 331; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 332; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 333; NONEON-NOSVE-NEXT: asr w8, w9, w8 334; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 335; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 336; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 337; NONEON-NOSVE-NEXT: asr w8, w9, w8 338; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 339; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 340; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 341; NONEON-NOSVE-NEXT: add sp, sp, #96 342; NONEON-NOSVE-NEXT: ret 343 %op1 = load <32 x i8>, ptr %a 344 %op2 = load <32 x i8>, ptr %b 345 %res = ashr <32 x i8> %op1, %op2 346 store <32 x i8> %res, ptr %a 347 ret void 348} 349 350define <2 x i16> @ashr_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 351; CHECK-LABEL: ashr_v2i16: 352; CHECK: // %bb.0: 353; CHECK-NEXT: ptrue p0.s, vl2 354; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 355; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 356; CHECK-NEXT: and z1.s, z1.s, #0xffff 357; CHECK-NEXT: sxth z0.s, p0/m, z0.s 358; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s 359; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 360; CHECK-NEXT: ret 361; 362; NONEON-NOSVE-LABEL: ashr_v2i16: 363; NONEON-NOSVE: // %bb.0: 364; NONEON-NOSVE-NEXT: sub sp, sp, #32 365; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 366; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 367; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 368; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 369; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16] 370; NONEON-NOSVE-NEXT: ldrsh w11, [sp, #8] 371; NONEON-NOSVE-NEXT: asr w8, w9, w8 372; NONEON-NOSVE-NEXT: asr w9, w11, w10 373; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24] 374; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 375; NONEON-NOSVE-NEXT: add sp, sp, #32 376; NONEON-NOSVE-NEXT: ret 377 %res = ashr <2 x i16> %op1, %op2 378 ret <2 x i16> %res 379} 380 381define <4 x i16> @ashr_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 382; CHECK-LABEL: ashr_v4i16: 383; CHECK: // %bb.0: 384; CHECK-NEXT: ptrue p0.h, vl4 385; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 386; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 387; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h 388; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 389; CHECK-NEXT: ret 390; 391; NONEON-NOSVE-LABEL: ashr_v4i16: 392; NONEON-NOSVE: // %bb.0: 393; NONEON-NOSVE-NEXT: sub sp, sp, #32 394; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 395; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 396; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 397; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 398; NONEON-NOSVE-NEXT: asr w8, w9, w8 399; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 400; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 401; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 402; NONEON-NOSVE-NEXT: asr w8, w9, w8 403; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 404; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 405; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 406; NONEON-NOSVE-NEXT: asr w8, w9, w8 407; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 408; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 409; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 410; NONEON-NOSVE-NEXT: asr w8, w9, w8 411; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 412; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 413; NONEON-NOSVE-NEXT: add sp, sp, #32 414; NONEON-NOSVE-NEXT: ret 415 %res = ashr <4 x i16> %op1, %op2 416 ret <4 x i16> %res 417} 418 419define <8 x i16> @ashr_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 420; CHECK-LABEL: ashr_v8i16: 421; CHECK: // %bb.0: 422; CHECK-NEXT: ptrue p0.h, vl8 423; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 424; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 425; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h 426; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 427; CHECK-NEXT: ret 428; 429; NONEON-NOSVE-LABEL: ashr_v8i16: 430; NONEON-NOSVE: // %bb.0: 431; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 432; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 433; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 434; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 435; NONEON-NOSVE-NEXT: asr w8, w9, w8 436; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 437; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 438; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 439; NONEON-NOSVE-NEXT: asr w8, w9, w8 440; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 441; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 442; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 443; NONEON-NOSVE-NEXT: asr w8, w9, w8 444; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 445; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 446; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 447; NONEON-NOSVE-NEXT: asr w8, w9, w8 448; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 449; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 450; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 451; NONEON-NOSVE-NEXT: asr w8, w9, w8 452; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 453; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 454; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 455; NONEON-NOSVE-NEXT: asr w8, w9, w8 456; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 457; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 458; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 459; NONEON-NOSVE-NEXT: asr w8, w9, w8 460; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 461; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 462; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 463; NONEON-NOSVE-NEXT: asr w8, w9, w8 464; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 465; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 466; NONEON-NOSVE-NEXT: add sp, sp, #48 467; NONEON-NOSVE-NEXT: ret 468 %res = ashr <8 x i16> %op1, %op2 469 ret <8 x i16> %res 470} 471 472define void @ashr_v16i16(ptr %a, ptr %b) { 473; CHECK-LABEL: ashr_v16i16: 474; CHECK: // %bb.0: 475; CHECK-NEXT: ldp q0, q3, [x1] 476; CHECK-NEXT: ptrue p0.h, vl8 477; CHECK-NEXT: ldp q1, q2, [x0] 478; CHECK-NEXT: asrr z0.h, p0/m, z0.h, z1.h 479; CHECK-NEXT: movprfx z1, z2 480; CHECK-NEXT: asr z1.h, p0/m, z1.h, z3.h 481; CHECK-NEXT: stp q0, q1, [x0] 482; CHECK-NEXT: ret 483; 484; NONEON-NOSVE-LABEL: ashr_v16i16: 485; NONEON-NOSVE: // %bb.0: 486; NONEON-NOSVE-NEXT: sub sp, sp, #96 487; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 488; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 489; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 490; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 491; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 492; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 493; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 494; NONEON-NOSVE-NEXT: asr w8, w9, w8 495; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44] 496; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 497; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 498; NONEON-NOSVE-NEXT: asr w8, w9, w8 499; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 500; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 501; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 502; NONEON-NOSVE-NEXT: asr w8, w9, w8 503; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40] 504; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 505; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 506; NONEON-NOSVE-NEXT: asr w8, w9, w8 507; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38] 508; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 509; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 510; NONEON-NOSVE-NEXT: asr w8, w9, w8 511; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36] 512; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 513; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 514; NONEON-NOSVE-NEXT: asr w8, w9, w8 515; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34] 516; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 517; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 518; NONEON-NOSVE-NEXT: asr w8, w9, w8 519; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32] 520; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 521; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 522; NONEON-NOSVE-NEXT: asr w8, w9, w8 523; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 524; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 525; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 526; NONEON-NOSVE-NEXT: asr w8, w9, w8 527; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 528; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 529; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 530; NONEON-NOSVE-NEXT: asr w8, w9, w8 531; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 532; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 533; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 534; NONEON-NOSVE-NEXT: asr w8, w9, w8 535; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 536; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 537; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 538; NONEON-NOSVE-NEXT: asr w8, w9, w8 539; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 540; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 541; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 542; NONEON-NOSVE-NEXT: asr w8, w9, w8 543; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 544; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 545; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 546; NONEON-NOSVE-NEXT: asr w8, w9, w8 547; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 548; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 549; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 550; NONEON-NOSVE-NEXT: asr w8, w9, w8 551; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 552; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 553; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 554; NONEON-NOSVE-NEXT: asr w8, w9, w8 555; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 556; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 557; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 558; NONEON-NOSVE-NEXT: add sp, sp, #96 559; NONEON-NOSVE-NEXT: ret 560 %op1 = load <16 x i16>, ptr %a 561 %op2 = load <16 x i16>, ptr %b 562 %res = ashr <16 x i16> %op1, %op2 563 store <16 x i16> %res, ptr %a 564 ret void 565} 566 567define <2 x i32> @ashr_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 568; CHECK-LABEL: ashr_v2i32: 569; CHECK: // %bb.0: 570; CHECK-NEXT: ptrue p0.s, vl2 571; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 572; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 573; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s 574; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 575; CHECK-NEXT: ret 576; 577; NONEON-NOSVE-LABEL: ashr_v2i32: 578; NONEON-NOSVE: // %bb.0: 579; NONEON-NOSVE-NEXT: sub sp, sp, #32 580; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 581; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 582; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 583; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 584; NONEON-NOSVE-NEXT: asr w11, w10, w8 585; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 586; NONEON-NOSVE-NEXT: asr w8, w9, w8 587; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 588; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 589; NONEON-NOSVE-NEXT: add sp, sp, #32 590; NONEON-NOSVE-NEXT: ret 591 %res = ashr <2 x i32> %op1, %op2 592 ret <2 x i32> %res 593} 594 595define <4 x i32> @ashr_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 596; CHECK-LABEL: ashr_v4i32: 597; CHECK: // %bb.0: 598; CHECK-NEXT: ptrue p0.s, vl4 599; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 600; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 601; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s 602; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 603; CHECK-NEXT: ret 604; 605; NONEON-NOSVE-LABEL: ashr_v4i32: 606; NONEON-NOSVE: // %bb.0: 607; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 608; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 609; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 610; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 611; NONEON-NOSVE-NEXT: asr w11, w10, w8 612; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 613; NONEON-NOSVE-NEXT: asr w8, w9, w8 614; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 615; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 616; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 617; NONEON-NOSVE-NEXT: asr w11, w10, w8 618; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 619; NONEON-NOSVE-NEXT: asr w8, w9, w8 620; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 621; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 622; NONEON-NOSVE-NEXT: add sp, sp, #48 623; NONEON-NOSVE-NEXT: ret 624 %res = ashr <4 x i32> %op1, %op2 625 ret <4 x i32> %res 626} 627 628define void @ashr_v8i32(ptr %a, ptr %b) { 629; CHECK-LABEL: ashr_v8i32: 630; CHECK: // %bb.0: 631; CHECK-NEXT: ldp q0, q3, [x1] 632; CHECK-NEXT: ptrue p0.s, vl4 633; CHECK-NEXT: ldp q1, q2, [x0] 634; CHECK-NEXT: asrr z0.s, p0/m, z0.s, z1.s 635; CHECK-NEXT: movprfx z1, z2 636; CHECK-NEXT: asr z1.s, p0/m, z1.s, z3.s 637; CHECK-NEXT: stp q0, q1, [x0] 638; CHECK-NEXT: ret 639; 640; NONEON-NOSVE-LABEL: ashr_v8i32: 641; NONEON-NOSVE: // %bb.0: 642; NONEON-NOSVE-NEXT: sub sp, sp, #96 643; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 644; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 645; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 646; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 647; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 648; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 649; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 650; NONEON-NOSVE-NEXT: asr w11, w10, w8 651; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 652; NONEON-NOSVE-NEXT: asr w8, w9, w8 653; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 654; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 655; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 656; NONEON-NOSVE-NEXT: asr w11, w10, w8 657; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 658; NONEON-NOSVE-NEXT: asr w8, w9, w8 659; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 660; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 661; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 662; NONEON-NOSVE-NEXT: asr w11, w10, w8 663; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 664; NONEON-NOSVE-NEXT: asr w8, w9, w8 665; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 666; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 667; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 668; NONEON-NOSVE-NEXT: asr w11, w10, w8 669; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 670; NONEON-NOSVE-NEXT: asr w8, w9, w8 671; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 672; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 673; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 674; NONEON-NOSVE-NEXT: add sp, sp, #96 675; NONEON-NOSVE-NEXT: ret 676 %op1 = load <8 x i32>, ptr %a 677 %op2 = load <8 x i32>, ptr %b 678 %res = ashr <8 x i32> %op1, %op2 679 store <8 x i32> %res, ptr %a 680 ret void 681} 682 683define <1 x i64> @ashr_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 684; CHECK-LABEL: ashr_v1i64: 685; CHECK: // %bb.0: 686; CHECK-NEXT: ptrue p0.d, vl1 687; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 688; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 689; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d 690; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 691; CHECK-NEXT: ret 692; 693; NONEON-NOSVE-LABEL: ashr_v1i64: 694; NONEON-NOSVE: // %bb.0: 695; NONEON-NOSVE-NEXT: sub sp, sp, #16 696; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 697; NONEON-NOSVE-NEXT: fmov x8, d1 698; NONEON-NOSVE-NEXT: fmov x9, d0 699; NONEON-NOSVE-NEXT: asr x8, x9, x8 700; NONEON-NOSVE-NEXT: str x8, [sp, #8] 701; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 702; NONEON-NOSVE-NEXT: add sp, sp, #16 703; NONEON-NOSVE-NEXT: ret 704 %res = ashr <1 x i64> %op1, %op2 705 ret <1 x i64> %res 706} 707 708define <2 x i64> @ashr_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 709; CHECK-LABEL: ashr_v2i64: 710; CHECK: // %bb.0: 711; CHECK-NEXT: ptrue p0.d, vl2 712; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 713; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 714; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d 715; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 716; CHECK-NEXT: ret 717; 718; NONEON-NOSVE-LABEL: ashr_v2i64: 719; NONEON-NOSVE: // %bb.0: 720; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 721; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 722; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 723; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 724; NONEON-NOSVE-NEXT: asr x11, x10, x8 725; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 726; NONEON-NOSVE-NEXT: asr x8, x9, x8 727; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 728; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 729; NONEON-NOSVE-NEXT: add sp, sp, #48 730; NONEON-NOSVE-NEXT: ret 731 %res = ashr <2 x i64> %op1, %op2 732 ret <2 x i64> %res 733} 734 735define void @ashr_v4i64(ptr %a, ptr %b) { 736; CHECK-LABEL: ashr_v4i64: 737; CHECK: // %bb.0: 738; CHECK-NEXT: ldp q0, q3, [x1] 739; CHECK-NEXT: ptrue p0.d, vl2 740; CHECK-NEXT: ldp q1, q2, [x0] 741; CHECK-NEXT: asrr z0.d, p0/m, z0.d, z1.d 742; CHECK-NEXT: movprfx z1, z2 743; CHECK-NEXT: asr z1.d, p0/m, z1.d, z3.d 744; CHECK-NEXT: stp q0, q1, [x0] 745; CHECK-NEXT: ret 746; 747; NONEON-NOSVE-LABEL: ashr_v4i64: 748; NONEON-NOSVE: // %bb.0: 749; NONEON-NOSVE-NEXT: sub sp, sp, #96 750; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 751; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 752; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 753; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 754; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 755; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 756; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 757; NONEON-NOSVE-NEXT: asr x11, x10, x8 758; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 759; NONEON-NOSVE-NEXT: asr x8, x9, x8 760; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 761; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 762; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 763; NONEON-NOSVE-NEXT: asr x11, x10, x8 764; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 765; NONEON-NOSVE-NEXT: asr x8, x9, x8 766; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 767; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 768; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 769; NONEON-NOSVE-NEXT: add sp, sp, #96 770; NONEON-NOSVE-NEXT: ret 771 %op1 = load <4 x i64>, ptr %a 772 %op2 = load <4 x i64>, ptr %b 773 %res = ashr <4 x i64> %op1, %op2 774 store <4 x i64> %res, ptr %a 775 ret void 776} 777 778; 779; LSHR 780; 781 782define <4 x i8> @lshr_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 783; CHECK-LABEL: lshr_v4i8: 784; CHECK: // %bb.0: 785; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 786; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 787; CHECK-NEXT: ptrue p0.h, vl4 788; CHECK-NEXT: and z1.h, z1.h, #0xff 789; CHECK-NEXT: and z0.h, z0.h, #0xff 790; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h 791; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 792; CHECK-NEXT: ret 793; 794; NONEON-NOSVE-LABEL: lshr_v4i8: 795; NONEON-NOSVE: // %bb.0: 796; NONEON-NOSVE-NEXT: sub sp, sp, #32 797; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 798; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 799; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 800; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 801; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20] 802; NONEON-NOSVE-NEXT: ldrb w11, [sp, #12] 803; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18] 804; NONEON-NOSVE-NEXT: ldrb w13, [sp, #10] 805; NONEON-NOSVE-NEXT: lsr w8, w9, w8 806; NONEON-NOSVE-NEXT: ldrb w9, [sp, #16] 807; NONEON-NOSVE-NEXT: ldrb w14, [sp, #8] 808; NONEON-NOSVE-NEXT: lsr w10, w11, w10 809; NONEON-NOSVE-NEXT: lsr w11, w13, w12 810; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 811; NONEON-NOSVE-NEXT: lsr w8, w14, w9 812; NONEON-NOSVE-NEXT: strh w10, [sp, #28] 813; NONEON-NOSVE-NEXT: strh w11, [sp, #26] 814; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 815; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 816; NONEON-NOSVE-NEXT: add sp, sp, #32 817; NONEON-NOSVE-NEXT: ret 818 %res = lshr <4 x i8> %op1, %op2 819 ret <4 x i8> %res 820} 821 822define <8 x i8> @lshr_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 823; CHECK-LABEL: lshr_v8i8: 824; CHECK: // %bb.0: 825; CHECK-NEXT: ptrue p0.b, vl8 826; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 827; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 828; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b 829; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 830; CHECK-NEXT: ret 831; 832; NONEON-NOSVE-LABEL: lshr_v8i8: 833; NONEON-NOSVE: // %bb.0: 834; NONEON-NOSVE-NEXT: sub sp, sp, #32 835; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 836; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 837; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 838; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 839; NONEON-NOSVE-NEXT: lsr w8, w9, w8 840; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 841; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 842; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 843; NONEON-NOSVE-NEXT: lsr w8, w9, w8 844; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 845; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 846; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 847; NONEON-NOSVE-NEXT: lsr w8, w9, w8 848; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 849; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 850; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 851; NONEON-NOSVE-NEXT: lsr w8, w9, w8 852; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 853; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 854; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 855; NONEON-NOSVE-NEXT: lsr w8, w9, w8 856; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 857; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 858; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 859; NONEON-NOSVE-NEXT: lsr w8, w9, w8 860; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 861; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 862; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 863; NONEON-NOSVE-NEXT: lsr w8, w9, w8 864; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 865; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 866; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 867; NONEON-NOSVE-NEXT: lsr w8, w9, w8 868; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 869; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 870; NONEON-NOSVE-NEXT: add sp, sp, #32 871; NONEON-NOSVE-NEXT: ret 872 %res = lshr <8 x i8> %op1, %op2 873 ret <8 x i8> %res 874} 875 876define <16 x i8> @lshr_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 877; CHECK-LABEL: lshr_v16i8: 878; CHECK: // %bb.0: 879; CHECK-NEXT: ptrue p0.b, vl16 880; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 881; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 882; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b 883; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 884; CHECK-NEXT: ret 885; 886; NONEON-NOSVE-LABEL: lshr_v16i8: 887; NONEON-NOSVE: // %bb.0: 888; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 889; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 890; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 891; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 892; NONEON-NOSVE-NEXT: lsr w8, w9, w8 893; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 894; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 895; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 896; NONEON-NOSVE-NEXT: lsr w8, w9, w8 897; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 898; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 899; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 900; NONEON-NOSVE-NEXT: lsr w8, w9, w8 901; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 902; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 903; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 904; NONEON-NOSVE-NEXT: lsr w8, w9, w8 905; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 906; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 907; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 908; NONEON-NOSVE-NEXT: lsr w8, w9, w8 909; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 910; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 911; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 912; NONEON-NOSVE-NEXT: lsr w8, w9, w8 913; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 914; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 915; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 916; NONEON-NOSVE-NEXT: lsr w8, w9, w8 917; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 918; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 919; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 920; NONEON-NOSVE-NEXT: lsr w8, w9, w8 921; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 922; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 923; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 924; NONEON-NOSVE-NEXT: lsr w8, w9, w8 925; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 926; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 927; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 928; NONEON-NOSVE-NEXT: lsr w8, w9, w8 929; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 930; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 931; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 932; NONEON-NOSVE-NEXT: lsr w8, w9, w8 933; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 934; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 935; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 936; NONEON-NOSVE-NEXT: lsr w8, w9, w8 937; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 938; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 939; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 940; NONEON-NOSVE-NEXT: lsr w8, w9, w8 941; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 942; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 943; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 944; NONEON-NOSVE-NEXT: lsr w8, w9, w8 945; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 946; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 947; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 948; NONEON-NOSVE-NEXT: lsr w8, w9, w8 949; NONEON-NOSVE-NEXT: ldrb w9, [sp] 950; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 951; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 952; NONEON-NOSVE-NEXT: lsr w8, w9, w8 953; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 954; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 955; NONEON-NOSVE-NEXT: add sp, sp, #48 956; NONEON-NOSVE-NEXT: ret 957 %res = lshr <16 x i8> %op1, %op2 958 ret <16 x i8> %res 959} 960 961define void @lshr_v32i8(ptr %a, ptr %b) { 962; CHECK-LABEL: lshr_v32i8: 963; CHECK: // %bb.0: 964; CHECK-NEXT: ldp q0, q3, [x1] 965; CHECK-NEXT: ptrue p0.b, vl16 966; CHECK-NEXT: ldp q1, q2, [x0] 967; CHECK-NEXT: lsrr z0.b, p0/m, z0.b, z1.b 968; CHECK-NEXT: movprfx z1, z2 969; CHECK-NEXT: lsr z1.b, p0/m, z1.b, z3.b 970; CHECK-NEXT: stp q0, q1, [x0] 971; CHECK-NEXT: ret 972; 973; NONEON-NOSVE-LABEL: lshr_v32i8: 974; NONEON-NOSVE: // %bb.0: 975; NONEON-NOSVE-NEXT: sub sp, sp, #96 976; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 977; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 978; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 979; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 980; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 981; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 982; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 983; NONEON-NOSVE-NEXT: lsr w8, w9, w8 984; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 985; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 986; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 987; NONEON-NOSVE-NEXT: lsr w8, w9, w8 988; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 989; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 990; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 991; NONEON-NOSVE-NEXT: lsr w8, w9, w8 992; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 993; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 994; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 995; NONEON-NOSVE-NEXT: lsr w8, w9, w8 996; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 997; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 998; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 999; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1000; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1001; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1002; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1003; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1004; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1005; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1006; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1007; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1008; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1009; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1010; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1011; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1012; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1013; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1014; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1015; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1016; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1017; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1018; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1019; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1020; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1021; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1022; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1023; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1024; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1025; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1026; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1027; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1028; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1029; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1030; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1031; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1032; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1033; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1034; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1035; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1036; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1037; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1038; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1039; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1040; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1041; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1042; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1043; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1044; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1045; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1046; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1047; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1048; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1049; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1050; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1051; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1052; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1053; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1054; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1055; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1056; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1057; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1058; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1059; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1060; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1061; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1062; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1063; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1064; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1065; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1066; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1067; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1068; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1069; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1070; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1071; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1072; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1073; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1074; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1075; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1076; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1077; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1078; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1079; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1080; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1081; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1082; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1083; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1084; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1085; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1086; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1087; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1088; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1089; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1090; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1091; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1092; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1093; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1094; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1095; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1096; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1097; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1098; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1099; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1100; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1101; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1102; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1103; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1104; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1105; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1106; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1107; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1108; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1109; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1110; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1111; NONEON-NOSVE-NEXT: add sp, sp, #96 1112; NONEON-NOSVE-NEXT: ret 1113 %op1 = load <32 x i8>, ptr %a 1114 %op2 = load <32 x i8>, ptr %b 1115 %res = lshr <32 x i8> %op1, %op2 1116 store <32 x i8> %res, ptr %a 1117 ret void 1118} 1119 1120define <2 x i16> @lshr_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 1121; CHECK-LABEL: lshr_v2i16: 1122; CHECK: // %bb.0: 1123; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1124; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1125; CHECK-NEXT: ptrue p0.s, vl2 1126; CHECK-NEXT: and z1.s, z1.s, #0xffff 1127; CHECK-NEXT: and z0.s, z0.s, #0xffff 1128; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s 1129; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1130; CHECK-NEXT: ret 1131; 1132; NONEON-NOSVE-LABEL: lshr_v2i16: 1133; NONEON-NOSVE: // %bb.0: 1134; NONEON-NOSVE-NEXT: sub sp, sp, #32 1135; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1136; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1137; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1138; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1139; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16] 1140; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8] 1141; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1142; NONEON-NOSVE-NEXT: lsr w9, w11, w10 1143; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24] 1144; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1145; NONEON-NOSVE-NEXT: add sp, sp, #32 1146; NONEON-NOSVE-NEXT: ret 1147 %res = lshr <2 x i16> %op1, %op2 1148 ret <2 x i16> %res 1149} 1150 1151define <4 x i16> @lshr_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1152; CHECK-LABEL: lshr_v4i16: 1153; CHECK: // %bb.0: 1154; CHECK-NEXT: ptrue p0.h, vl4 1155; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1156; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1157; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h 1158; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1159; CHECK-NEXT: ret 1160; 1161; NONEON-NOSVE-LABEL: lshr_v4i16: 1162; NONEON-NOSVE: // %bb.0: 1163; NONEON-NOSVE-NEXT: sub sp, sp, #32 1164; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1165; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1166; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1167; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1168; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1169; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1170; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1171; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1172; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1173; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1174; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1175; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1176; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1177; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1178; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1179; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1180; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1181; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1182; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1183; NONEON-NOSVE-NEXT: add sp, sp, #32 1184; NONEON-NOSVE-NEXT: ret 1185 %res = lshr <4 x i16> %op1, %op2 1186 ret <4 x i16> %res 1187} 1188 1189define <8 x i16> @lshr_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1190; CHECK-LABEL: lshr_v8i16: 1191; CHECK: // %bb.0: 1192; CHECK-NEXT: ptrue p0.h, vl8 1193; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1194; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1195; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h 1196; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1197; CHECK-NEXT: ret 1198; 1199; NONEON-NOSVE-LABEL: lshr_v8i16: 1200; NONEON-NOSVE: // %bb.0: 1201; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1202; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1203; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1204; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1205; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1206; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1207; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1208; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1209; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1210; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1211; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1212; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1213; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1214; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1215; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1216; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1217; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1218; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1219; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1220; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1221; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1222; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1223; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1224; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1225; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1226; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1227; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1228; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1229; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1230; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1231; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1232; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1233; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1234; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1235; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1236; NONEON-NOSVE-NEXT: add sp, sp, #48 1237; NONEON-NOSVE-NEXT: ret 1238 %res = lshr <8 x i16> %op1, %op2 1239 ret <8 x i16> %res 1240} 1241 1242define void @lshr_v16i16(ptr %a, ptr %b) { 1243; CHECK-LABEL: lshr_v16i16: 1244; CHECK: // %bb.0: 1245; CHECK-NEXT: ldp q0, q3, [x1] 1246; CHECK-NEXT: ptrue p0.h, vl8 1247; CHECK-NEXT: ldp q1, q2, [x0] 1248; CHECK-NEXT: lsrr z0.h, p0/m, z0.h, z1.h 1249; CHECK-NEXT: movprfx z1, z2 1250; CHECK-NEXT: lsr z1.h, p0/m, z1.h, z3.h 1251; CHECK-NEXT: stp q0, q1, [x0] 1252; CHECK-NEXT: ret 1253; 1254; NONEON-NOSVE-LABEL: lshr_v16i16: 1255; NONEON-NOSVE: // %bb.0: 1256; NONEON-NOSVE-NEXT: sub sp, sp, #96 1257; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1258; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1259; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1260; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1261; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1262; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 1263; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 1264; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1265; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 1266; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1267; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 1268; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1269; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 1270; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1271; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 1272; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1273; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 1274; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1275; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 1276; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1277; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 1278; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1279; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 1280; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1281; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 1282; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1283; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 1284; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1285; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 1286; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1287; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 1288; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1289; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 1290; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1291; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 1292; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1293; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1294; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1295; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1296; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1297; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1298; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1299; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1300; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1301; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1302; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1303; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1304; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1305; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1306; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1307; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1308; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1309; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1310; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1311; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1312; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1313; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1314; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1315; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1316; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1317; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1318; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1319; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1320; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1321; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1322; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1323; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1324; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1325; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1326; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1327; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1328; NONEON-NOSVE-NEXT: add sp, sp, #96 1329; NONEON-NOSVE-NEXT: ret 1330 %op1 = load <16 x i16>, ptr %a 1331 %op2 = load <16 x i16>, ptr %b 1332 %res = lshr <16 x i16> %op1, %op2 1333 store <16 x i16> %res, ptr %a 1334 ret void 1335} 1336 1337define <2 x i32> @lshr_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1338; CHECK-LABEL: lshr_v2i32: 1339; CHECK: // %bb.0: 1340; CHECK-NEXT: ptrue p0.s, vl2 1341; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1342; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1343; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s 1344; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1345; CHECK-NEXT: ret 1346; 1347; NONEON-NOSVE-LABEL: lshr_v2i32: 1348; NONEON-NOSVE: // %bb.0: 1349; NONEON-NOSVE-NEXT: sub sp, sp, #32 1350; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1351; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1352; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1353; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1354; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1355; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1356; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1357; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1358; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1359; NONEON-NOSVE-NEXT: add sp, sp, #32 1360; NONEON-NOSVE-NEXT: ret 1361 %res = lshr <2 x i32> %op1, %op2 1362 ret <2 x i32> %res 1363} 1364 1365define <4 x i32> @lshr_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1366; CHECK-LABEL: lshr_v4i32: 1367; CHECK: // %bb.0: 1368; CHECK-NEXT: ptrue p0.s, vl4 1369; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1370; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1371; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s 1372; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1373; CHECK-NEXT: ret 1374; 1375; NONEON-NOSVE-LABEL: lshr_v4i32: 1376; NONEON-NOSVE: // %bb.0: 1377; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1378; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1379; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1380; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1381; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1382; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1383; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1384; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1385; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 1386; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1387; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1388; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1389; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1390; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 1391; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1392; NONEON-NOSVE-NEXT: add sp, sp, #48 1393; NONEON-NOSVE-NEXT: ret 1394 %res = lshr <4 x i32> %op1, %op2 1395 ret <4 x i32> %res 1396} 1397 1398define void @lshr_v8i32(ptr %a, ptr %b) { 1399; CHECK-LABEL: lshr_v8i32: 1400; CHECK: // %bb.0: 1401; CHECK-NEXT: ldp q0, q3, [x1] 1402; CHECK-NEXT: ptrue p0.s, vl4 1403; CHECK-NEXT: ldp q1, q2, [x0] 1404; CHECK-NEXT: lsrr z0.s, p0/m, z0.s, z1.s 1405; CHECK-NEXT: movprfx z1, z2 1406; CHECK-NEXT: lsr z1.s, p0/m, z1.s, z3.s 1407; CHECK-NEXT: stp q0, q1, [x0] 1408; CHECK-NEXT: ret 1409; 1410; NONEON-NOSVE-LABEL: lshr_v8i32: 1411; NONEON-NOSVE: // %bb.0: 1412; NONEON-NOSVE-NEXT: sub sp, sp, #96 1413; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1414; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1415; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1416; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1417; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1418; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1419; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1420; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1421; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1422; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1423; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1424; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 1425; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1426; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1427; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1428; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1429; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1430; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 1431; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1432; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1433; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1434; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1435; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1436; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 1437; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1438; NONEON-NOSVE-NEXT: lsr w11, w10, w8 1439; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1440; NONEON-NOSVE-NEXT: lsr w8, w9, w8 1441; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 1442; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1443; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1444; NONEON-NOSVE-NEXT: add sp, sp, #96 1445; NONEON-NOSVE-NEXT: ret 1446 %op1 = load <8 x i32>, ptr %a 1447 %op2 = load <8 x i32>, ptr %b 1448 %res = lshr <8 x i32> %op1, %op2 1449 store <8 x i32> %res, ptr %a 1450 ret void 1451} 1452 1453define <1 x i64> @lshr_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1454; CHECK-LABEL: lshr_v1i64: 1455; CHECK: // %bb.0: 1456; CHECK-NEXT: ptrue p0.d, vl1 1457; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1458; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1459; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d 1460; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1461; CHECK-NEXT: ret 1462; 1463; NONEON-NOSVE-LABEL: lshr_v1i64: 1464; NONEON-NOSVE: // %bb.0: 1465; NONEON-NOSVE-NEXT: sub sp, sp, #16 1466; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1467; NONEON-NOSVE-NEXT: fmov x8, d1 1468; NONEON-NOSVE-NEXT: fmov x9, d0 1469; NONEON-NOSVE-NEXT: lsr x8, x9, x8 1470; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1471; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1472; NONEON-NOSVE-NEXT: add sp, sp, #16 1473; NONEON-NOSVE-NEXT: ret 1474 %res = lshr <1 x i64> %op1, %op2 1475 ret <1 x i64> %res 1476} 1477 1478define <2 x i64> @lshr_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 1479; CHECK-LABEL: lshr_v2i64: 1480; CHECK: // %bb.0: 1481; CHECK-NEXT: ptrue p0.d, vl2 1482; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1483; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1484; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d 1485; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1486; CHECK-NEXT: ret 1487; 1488; NONEON-NOSVE-LABEL: lshr_v2i64: 1489; NONEON-NOSVE: // %bb.0: 1490; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1491; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1492; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1493; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1494; NONEON-NOSVE-NEXT: lsr x11, x10, x8 1495; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1496; NONEON-NOSVE-NEXT: lsr x8, x9, x8 1497; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 1498; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1499; NONEON-NOSVE-NEXT: add sp, sp, #48 1500; NONEON-NOSVE-NEXT: ret 1501 %res = lshr <2 x i64> %op1, %op2 1502 ret <2 x i64> %res 1503} 1504 1505define void @lshr_v4i64(ptr %a, ptr %b) { 1506; CHECK-LABEL: lshr_v4i64: 1507; CHECK: // %bb.0: 1508; CHECK-NEXT: ldp q0, q3, [x1] 1509; CHECK-NEXT: ptrue p0.d, vl2 1510; CHECK-NEXT: ldp q1, q2, [x0] 1511; CHECK-NEXT: lsrr z0.d, p0/m, z0.d, z1.d 1512; CHECK-NEXT: movprfx z1, z2 1513; CHECK-NEXT: lsr z1.d, p0/m, z1.d, z3.d 1514; CHECK-NEXT: stp q0, q1, [x0] 1515; CHECK-NEXT: ret 1516; 1517; NONEON-NOSVE-LABEL: lshr_v4i64: 1518; NONEON-NOSVE: // %bb.0: 1519; NONEON-NOSVE-NEXT: sub sp, sp, #96 1520; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1521; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1522; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1523; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1524; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1525; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 1526; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 1527; NONEON-NOSVE-NEXT: lsr x11, x10, x8 1528; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 1529; NONEON-NOSVE-NEXT: lsr x8, x9, x8 1530; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1531; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 1532; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1533; NONEON-NOSVE-NEXT: lsr x11, x10, x8 1534; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1535; NONEON-NOSVE-NEXT: lsr x8, x9, x8 1536; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 1537; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1538; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1539; NONEON-NOSVE-NEXT: add sp, sp, #96 1540; NONEON-NOSVE-NEXT: ret 1541 %op1 = load <4 x i64>, ptr %a 1542 %op2 = load <4 x i64>, ptr %b 1543 %res = lshr <4 x i64> %op1, %op2 1544 store <4 x i64> %res, ptr %a 1545 ret void 1546} 1547 1548; 1549; SHL 1550; 1551 1552define <2 x i8> @shl_v2i8(<2 x i8> %op1, <2 x i8> %op2) { 1553; CHECK-LABEL: shl_v2i8: 1554; CHECK: // %bb.0: 1555; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1556; CHECK-NEXT: ptrue p0.s, vl2 1557; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1558; CHECK-NEXT: and z1.s, z1.s, #0xff 1559; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s 1560; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1561; CHECK-NEXT: ret 1562; 1563; NONEON-NOSVE-LABEL: shl_v2i8: 1564; NONEON-NOSVE: // %bb.0: 1565; NONEON-NOSVE-NEXT: sub sp, sp, #32 1566; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1567; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1568; NONEON-NOSVE-NEXT: ldrb w9, [sp, #20] 1569; NONEON-NOSVE-NEXT: ldr w10, [sp, #12] 1570; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1571; NONEON-NOSVE-NEXT: lsl w11, w10, w9 1572; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] 1573; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1574; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1575; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1576; NONEON-NOSVE-NEXT: add sp, sp, #32 1577; NONEON-NOSVE-NEXT: ret 1578 %res = shl <2 x i8> %op1, %op2 1579 ret <2 x i8> %res 1580} 1581 1582define <4 x i8> @shl_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 1583; CHECK-LABEL: shl_v4i8: 1584; CHECK: // %bb.0: 1585; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1586; CHECK-NEXT: ptrue p0.h, vl4 1587; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1588; CHECK-NEXT: and z1.h, z1.h, #0xff 1589; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h 1590; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1591; CHECK-NEXT: ret 1592; 1593; NONEON-NOSVE-LABEL: shl_v4i8: 1594; NONEON-NOSVE: // %bb.0: 1595; NONEON-NOSVE-NEXT: sub sp, sp, #32 1596; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1597; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1598; NONEON-NOSVE-NEXT: ldrb w11, [sp, #22] 1599; NONEON-NOSVE-NEXT: ldrh w12, [sp, #14] 1600; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20] 1601; NONEON-NOSVE-NEXT: ldrb w9, [sp, #18] 1602; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1603; NONEON-NOSVE-NEXT: lsl w11, w12, w11 1604; NONEON-NOSVE-NEXT: strh w11, [sp, #30] 1605; NONEON-NOSVE-NEXT: ldrh w11, [sp, #12] 1606; NONEON-NOSVE-NEXT: lsl w10, w11, w10 1607; NONEON-NOSVE-NEXT: strh w10, [sp, #28] 1608; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10] 1609; NONEON-NOSVE-NEXT: lsl w9, w10, w9 1610; NONEON-NOSVE-NEXT: strh w9, [sp, #26] 1611; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1612; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1613; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1614; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1615; NONEON-NOSVE-NEXT: add sp, sp, #32 1616; NONEON-NOSVE-NEXT: ret 1617 %res = shl <4 x i8> %op1, %op2 1618 ret <4 x i8> %res 1619} 1620 1621define <8 x i8> @shl_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 1622; CHECK-LABEL: shl_v8i8: 1623; CHECK: // %bb.0: 1624; CHECK-NEXT: ptrue p0.b, vl8 1625; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1626; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1627; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b 1628; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1629; CHECK-NEXT: ret 1630; 1631; NONEON-NOSVE-LABEL: shl_v8i8: 1632; NONEON-NOSVE: // %bb.0: 1633; NONEON-NOSVE-NEXT: sub sp, sp, #32 1634; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1635; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1636; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1637; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1638; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1639; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1640; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 1641; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1642; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1643; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1644; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 1645; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1646; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1647; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1648; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 1649; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1650; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1651; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1652; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 1653; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1654; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1655; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1656; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 1657; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1658; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1659; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1660; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 1661; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1662; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1663; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1664; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 1665; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1666; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1667; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 1668; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1669; NONEON-NOSVE-NEXT: add sp, sp, #32 1670; NONEON-NOSVE-NEXT: ret 1671 %res = shl <8 x i8> %op1, %op2 1672 ret <8 x i8> %res 1673} 1674 1675define <16 x i8> @shl_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 1676; CHECK-LABEL: shl_v16i8: 1677; CHECK: // %bb.0: 1678; CHECK-NEXT: ptrue p0.b, vl16 1679; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1680; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1681; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b 1682; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1683; CHECK-NEXT: ret 1684; 1685; NONEON-NOSVE-LABEL: shl_v16i8: 1686; NONEON-NOSVE: // %bb.0: 1687; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1688; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1689; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1690; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1691; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1692; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1693; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 1694; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1695; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1696; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1697; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 1698; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1699; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1700; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1701; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 1702; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1703; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1704; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1705; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 1706; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1707; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1708; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1709; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 1710; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1711; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1712; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1713; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 1714; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1715; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1716; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1717; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 1718; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1719; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1720; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1721; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 1722; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1723; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1724; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1725; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 1726; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1727; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1728; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1729; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 1730; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1731; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1732; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1733; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 1734; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1735; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1736; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1737; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 1738; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1739; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1740; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1741; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 1742; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1743; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1744; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1745; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 1746; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1747; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1748; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1749; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 1750; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1751; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1752; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 1753; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1754; NONEON-NOSVE-NEXT: add sp, sp, #48 1755; NONEON-NOSVE-NEXT: ret 1756 %res = shl <16 x i8> %op1, %op2 1757 ret <16 x i8> %res 1758} 1759 1760define void @shl_v32i8(ptr %a, ptr %b) { 1761; CHECK-LABEL: shl_v32i8: 1762; CHECK: // %bb.0: 1763; CHECK-NEXT: ldp q0, q3, [x1] 1764; CHECK-NEXT: ptrue p0.b, vl16 1765; CHECK-NEXT: ldp q1, q2, [x0] 1766; CHECK-NEXT: lslr z0.b, p0/m, z0.b, z1.b 1767; CHECK-NEXT: movprfx z1, z2 1768; CHECK-NEXT: lsl z1.b, p0/m, z1.b, z3.b 1769; CHECK-NEXT: stp q0, q1, [x0] 1770; CHECK-NEXT: ret 1771; 1772; NONEON-NOSVE-LABEL: shl_v32i8: 1773; NONEON-NOSVE: // %bb.0: 1774; NONEON-NOSVE-NEXT: sub sp, sp, #96 1775; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1776; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1777; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1778; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1779; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1780; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1781; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1782; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1783; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1784; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1785; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1786; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1787; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1788; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1789; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1790; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1791; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1792; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1793; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1794; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1795; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1796; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1797; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1798; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1799; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1800; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1801; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1802; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1803; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1804; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1805; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1806; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1807; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1808; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1809; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1810; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1811; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1812; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1813; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1814; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1815; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1816; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1817; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1818; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1819; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1820; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1821; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1822; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1823; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1824; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1825; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1826; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1827; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1828; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1829; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1830; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1831; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1832; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1833; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1834; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1835; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1836; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1837; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1838; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1839; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1840; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1841; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1842; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1843; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1844; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1845; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1846; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1847; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1848; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1849; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1850; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1851; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1852; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1853; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1854; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1855; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1856; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1857; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1858; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1859; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1860; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1861; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1862; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1863; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1864; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1865; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1866; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1867; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1868; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1869; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1870; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1871; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1872; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1873; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1874; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1875; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1876; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1877; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1878; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1879; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1880; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1881; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1882; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1883; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1884; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1885; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1886; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1887; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1888; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1889; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1890; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1891; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1892; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1893; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1894; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1895; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1896; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1897; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1898; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1899; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1900; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1901; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1902; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1903; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1904; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1905; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1906; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1907; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1908; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1909; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1910; NONEON-NOSVE-NEXT: add sp, sp, #96 1911; NONEON-NOSVE-NEXT: ret 1912 %op1 = load <32 x i8>, ptr %a 1913 %op2 = load <32 x i8>, ptr %b 1914 %res = shl <32 x i8> %op1, %op2 1915 store <32 x i8> %res, ptr %a 1916 ret void 1917} 1918 1919define <4 x i16> @shl_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1920; CHECK-LABEL: shl_v4i16: 1921; CHECK: // %bb.0: 1922; CHECK-NEXT: ptrue p0.h, vl4 1923; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1924; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1925; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h 1926; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1927; CHECK-NEXT: ret 1928; 1929; NONEON-NOSVE-LABEL: shl_v4i16: 1930; NONEON-NOSVE: // %bb.0: 1931; NONEON-NOSVE-NEXT: sub sp, sp, #32 1932; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1933; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1934; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1935; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1936; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1937; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1938; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1939; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1940; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1941; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1942; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1943; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1944; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1945; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1946; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1947; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1948; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1949; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1950; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1951; NONEON-NOSVE-NEXT: add sp, sp, #32 1952; NONEON-NOSVE-NEXT: ret 1953 %res = shl <4 x i16> %op1, %op2 1954 ret <4 x i16> %res 1955} 1956 1957define <8 x i16> @shl_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1958; CHECK-LABEL: shl_v8i16: 1959; CHECK: // %bb.0: 1960; CHECK-NEXT: ptrue p0.h, vl8 1961; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1962; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1963; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h 1964; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1965; CHECK-NEXT: ret 1966; 1967; NONEON-NOSVE-LABEL: shl_v8i16: 1968; NONEON-NOSVE: // %bb.0: 1969; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1970; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1971; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1972; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1973; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1974; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1975; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1976; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1977; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1978; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1979; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1980; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1981; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1982; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1983; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1984; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1985; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1986; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1987; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1988; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1989; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1990; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1991; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1992; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1993; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1994; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1995; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1996; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1997; NONEON-NOSVE-NEXT: lsl w8, w9, w8 1998; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1999; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2000; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2001; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2002; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2003; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2004; NONEON-NOSVE-NEXT: add sp, sp, #48 2005; NONEON-NOSVE-NEXT: ret 2006 %res = shl <8 x i16> %op1, %op2 2007 ret <8 x i16> %res 2008} 2009 2010define void @shl_v16i16(ptr %a, ptr %b) { 2011; CHECK-LABEL: shl_v16i16: 2012; CHECK: // %bb.0: 2013; CHECK-NEXT: ldp q0, q3, [x1] 2014; CHECK-NEXT: ptrue p0.h, vl8 2015; CHECK-NEXT: ldp q1, q2, [x0] 2016; CHECK-NEXT: lslr z0.h, p0/m, z0.h, z1.h 2017; CHECK-NEXT: movprfx z1, z2 2018; CHECK-NEXT: lsl z1.h, p0/m, z1.h, z3.h 2019; CHECK-NEXT: stp q0, q1, [x0] 2020; CHECK-NEXT: ret 2021; 2022; NONEON-NOSVE-LABEL: shl_v16i16: 2023; NONEON-NOSVE: // %bb.0: 2024; NONEON-NOSVE-NEXT: sub sp, sp, #96 2025; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2026; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2027; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2028; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2029; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2030; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 2031; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 2032; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2033; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 2034; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 2035; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 2036; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2037; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 2038; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 2039; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 2040; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2041; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 2042; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 2043; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 2044; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2045; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 2046; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 2047; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 2048; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2049; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 2050; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 2051; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 2052; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2053; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 2054; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 2055; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 2056; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2057; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 2058; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 2059; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 2060; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2061; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2062; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 2063; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2064; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2065; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2066; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 2067; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2068; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2069; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2070; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2071; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2072; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2073; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2074; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 2075; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2076; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2077; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2078; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2079; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2080; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2081; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2082; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 2083; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2084; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2085; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2086; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 2087; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2088; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2089; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2090; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 2091; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2092; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2093; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 2094; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2095; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2096; NONEON-NOSVE-NEXT: add sp, sp, #96 2097; NONEON-NOSVE-NEXT: ret 2098 %op1 = load <16 x i16>, ptr %a 2099 %op2 = load <16 x i16>, ptr %b 2100 %res = shl <16 x i16> %op1, %op2 2101 store <16 x i16> %res, ptr %a 2102 ret void 2103} 2104 2105define <2 x i32> @shl_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 2106; CHECK-LABEL: shl_v2i32: 2107; CHECK: // %bb.0: 2108; CHECK-NEXT: ptrue p0.s, vl2 2109; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2110; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2111; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s 2112; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2113; CHECK-NEXT: ret 2114; 2115; NONEON-NOSVE-LABEL: shl_v2i32: 2116; NONEON-NOSVE: // %bb.0: 2117; NONEON-NOSVE-NEXT: sub sp, sp, #32 2118; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2119; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2120; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2121; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2122; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2123; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2124; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2125; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 2126; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2127; NONEON-NOSVE-NEXT: add sp, sp, #32 2128; NONEON-NOSVE-NEXT: ret 2129 %res = shl <2 x i32> %op1, %op2 2130 ret <2 x i32> %res 2131} 2132 2133define <4 x i32> @shl_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 2134; CHECK-LABEL: shl_v4i32: 2135; CHECK: // %bb.0: 2136; CHECK-NEXT: ptrue p0.s, vl4 2137; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2138; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2139; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s 2140; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2141; CHECK-NEXT: ret 2142; 2143; NONEON-NOSVE-LABEL: shl_v4i32: 2144; NONEON-NOSVE: // %bb.0: 2145; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2146; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2147; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2148; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2149; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2150; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2151; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2152; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2153; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 2154; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2155; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2156; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2157; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2158; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 2159; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2160; NONEON-NOSVE-NEXT: add sp, sp, #48 2161; NONEON-NOSVE-NEXT: ret 2162 %res = shl <4 x i32> %op1, %op2 2163 ret <4 x i32> %res 2164} 2165 2166define void @shl_v8i32(ptr %a, ptr %b) { 2167; CHECK-LABEL: shl_v8i32: 2168; CHECK: // %bb.0: 2169; CHECK-NEXT: ldp q0, q3, [x1] 2170; CHECK-NEXT: ptrue p0.s, vl4 2171; CHECK-NEXT: ldp q1, q2, [x0] 2172; CHECK-NEXT: lslr z0.s, p0/m, z0.s, z1.s 2173; CHECK-NEXT: movprfx z1, z2 2174; CHECK-NEXT: lsl z1.s, p0/m, z1.s, z3.s 2175; CHECK-NEXT: stp q0, q1, [x0] 2176; CHECK-NEXT: ret 2177; 2178; NONEON-NOSVE-LABEL: shl_v8i32: 2179; NONEON-NOSVE: // %bb.0: 2180; NONEON-NOSVE-NEXT: sub sp, sp, #96 2181; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2182; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2183; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2184; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2185; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2186; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 2187; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 2188; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2189; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 2190; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2191; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 2192; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 2193; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 2194; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2195; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 2196; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2197; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2198; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 2199; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2200; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2201; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2202; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2203; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2204; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 2205; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2206; NONEON-NOSVE-NEXT: lsl w11, w10, w8 2207; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2208; NONEON-NOSVE-NEXT: lsl w8, w9, w8 2209; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 2210; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2211; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2212; NONEON-NOSVE-NEXT: add sp, sp, #96 2213; NONEON-NOSVE-NEXT: ret 2214 %op1 = load <8 x i32>, ptr %a 2215 %op2 = load <8 x i32>, ptr %b 2216 %res = shl <8 x i32> %op1, %op2 2217 store <8 x i32> %res, ptr %a 2218 ret void 2219} 2220 2221define <1 x i64> @shl_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 2222; CHECK-LABEL: shl_v1i64: 2223; CHECK: // %bb.0: 2224; CHECK-NEXT: ptrue p0.d, vl1 2225; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2226; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2227; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d 2228; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2229; CHECK-NEXT: ret 2230; 2231; NONEON-NOSVE-LABEL: shl_v1i64: 2232; NONEON-NOSVE: // %bb.0: 2233; NONEON-NOSVE-NEXT: sub sp, sp, #16 2234; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2235; NONEON-NOSVE-NEXT: fmov x8, d1 2236; NONEON-NOSVE-NEXT: fmov x9, d0 2237; NONEON-NOSVE-NEXT: lsl x8, x9, x8 2238; NONEON-NOSVE-NEXT: str x8, [sp, #8] 2239; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2240; NONEON-NOSVE-NEXT: add sp, sp, #16 2241; NONEON-NOSVE-NEXT: ret 2242 %res = shl <1 x i64> %op1, %op2 2243 ret <1 x i64> %res 2244} 2245 2246define <2 x i64> @shl_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 2247; CHECK-LABEL: shl_v2i64: 2248; CHECK: // %bb.0: 2249; CHECK-NEXT: ptrue p0.d, vl2 2250; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2251; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2252; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d 2253; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2254; CHECK-NEXT: ret 2255; 2256; NONEON-NOSVE-LABEL: shl_v2i64: 2257; NONEON-NOSVE: // %bb.0: 2258; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2259; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2260; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2261; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2262; NONEON-NOSVE-NEXT: lsl x11, x10, x8 2263; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2264; NONEON-NOSVE-NEXT: lsl x8, x9, x8 2265; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 2266; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2267; NONEON-NOSVE-NEXT: add sp, sp, #48 2268; NONEON-NOSVE-NEXT: ret 2269 %res = shl <2 x i64> %op1, %op2 2270 ret <2 x i64> %res 2271} 2272 2273define void @shl_v4i64(ptr %a, ptr %b) { 2274; CHECK-LABEL: shl_v4i64: 2275; CHECK: // %bb.0: 2276; CHECK-NEXT: ldp q0, q3, [x1] 2277; CHECK-NEXT: ptrue p0.d, vl2 2278; CHECK-NEXT: ldp q1, q2, [x0] 2279; CHECK-NEXT: lslr z0.d, p0/m, z0.d, z1.d 2280; CHECK-NEXT: movprfx z1, z2 2281; CHECK-NEXT: lsl z1.d, p0/m, z1.d, z3.d 2282; CHECK-NEXT: stp q0, q1, [x0] 2283; CHECK-NEXT: ret 2284; 2285; NONEON-NOSVE-LABEL: shl_v4i64: 2286; NONEON-NOSVE: // %bb.0: 2287; NONEON-NOSVE-NEXT: sub sp, sp, #96 2288; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2289; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2290; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2291; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2292; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2293; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 2294; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 2295; NONEON-NOSVE-NEXT: lsl x11, x10, x8 2296; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 2297; NONEON-NOSVE-NEXT: lsl x8, x9, x8 2298; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2299; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 2300; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2301; NONEON-NOSVE-NEXT: lsl x11, x10, x8 2302; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2303; NONEON-NOSVE-NEXT: lsl x8, x9, x8 2304; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 2305; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2306; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2307; NONEON-NOSVE-NEXT: add sp, sp, #96 2308; NONEON-NOSVE-NEXT: ret 2309 %op1 = load <4 x i64>, ptr %a 2310 %op2 = load <4 x i64>, ptr %b 2311 %res = shl <4 x i64> %op1, %op2 2312 store <4 x i64> %res, ptr %a 2313 ret void 2314} 2315