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 6 7target triple = "aarch64-unknown-linux-gnu" 8 9define <4 x i8> @sdiv_v4i8(<4 x i8> %op1) { 10; CHECK-LABEL: sdiv_v4i8: 11; CHECK: // %bb.0: 12; CHECK-NEXT: ptrue p0.h, vl4 13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 14; CHECK-NEXT: sxtb z0.h, p0/m, z0.h 15; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5 16; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 17; CHECK-NEXT: ret 18; 19; NONEON-NOSVE-LABEL: sdiv_v4i8: 20; NONEON-NOSVE: // %bb.0: 21; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 22; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 23; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 24; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 25; NONEON-NOSVE-NEXT: ldrh w10, [sp, #2] 26; NONEON-NOSVE-NEXT: ldrh w12, [sp] 27; NONEON-NOSVE-NEXT: sxtb w11, w8 28; NONEON-NOSVE-NEXT: sxtb w13, w9 29; NONEON-NOSVE-NEXT: sxtb w14, w10 30; NONEON-NOSVE-NEXT: sxtb w15, w12 31; NONEON-NOSVE-NEXT: ubfx w11, w11, #10, #5 32; NONEON-NOSVE-NEXT: ubfx w13, w13, #10, #5 33; NONEON-NOSVE-NEXT: ubfx w14, w14, #10, #5 34; NONEON-NOSVE-NEXT: add w8, w8, w11 35; NONEON-NOSVE-NEXT: ubfx w11, w15, #10, #5 36; NONEON-NOSVE-NEXT: add w9, w9, w13 37; NONEON-NOSVE-NEXT: sxtb w8, w8 38; NONEON-NOSVE-NEXT: add w10, w10, w14 39; NONEON-NOSVE-NEXT: sxtb w9, w9 40; NONEON-NOSVE-NEXT: add w11, w12, w11 41; NONEON-NOSVE-NEXT: sxtb w10, w10 42; NONEON-NOSVE-NEXT: lsr w8, w8, #5 43; NONEON-NOSVE-NEXT: sxtb w11, w11 44; NONEON-NOSVE-NEXT: lsr w9, w9, #5 45; NONEON-NOSVE-NEXT: lsr w10, w10, #5 46; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 47; NONEON-NOSVE-NEXT: lsr w8, w11, #5 48; NONEON-NOSVE-NEXT: strh w9, [sp, #12] 49; NONEON-NOSVE-NEXT: strh w10, [sp, #10] 50; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 51; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 52; NONEON-NOSVE-NEXT: add sp, sp, #16 53; NONEON-NOSVE-NEXT: ret 54 %res = sdiv <4 x i8> %op1, shufflevector (<4 x i8> insertelement (<4 x i8> poison, i8 32, i32 0), <4 x i8> poison, <4 x i32> zeroinitializer) 55 ret <4 x i8> %res 56} 57 58define <8 x i8> @sdiv_v8i8(<8 x i8> %op1) { 59; CHECK-LABEL: sdiv_v8i8: 60; CHECK: // %bb.0: 61; CHECK-NEXT: ptrue p0.b, vl8 62; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 63; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #5 64; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 65; CHECK-NEXT: ret 66; 67; NONEON-NOSVE-LABEL: sdiv_v8i8: 68; NONEON-NOSVE: // %bb.0: 69; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 70; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 71; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 72; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 73; NONEON-NOSVE-NEXT: add w8, w8, w9 74; NONEON-NOSVE-NEXT: sxtb w8, w8 75; NONEON-NOSVE-NEXT: lsr w8, w8, #5 76; NONEON-NOSVE-NEXT: strb w8, [sp, #15] 77; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 78; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 79; NONEON-NOSVE-NEXT: add w8, w8, w9 80; NONEON-NOSVE-NEXT: sxtb w8, w8 81; NONEON-NOSVE-NEXT: lsr w8, w8, #5 82; NONEON-NOSVE-NEXT: strb w8, [sp, #14] 83; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 84; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 85; NONEON-NOSVE-NEXT: add w8, w8, w9 86; NONEON-NOSVE-NEXT: sxtb w8, w8 87; NONEON-NOSVE-NEXT: lsr w8, w8, #5 88; NONEON-NOSVE-NEXT: strb w8, [sp, #13] 89; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 90; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 91; NONEON-NOSVE-NEXT: add w8, w8, w9 92; NONEON-NOSVE-NEXT: sxtb w8, w8 93; NONEON-NOSVE-NEXT: lsr w8, w8, #5 94; NONEON-NOSVE-NEXT: strb w8, [sp, #12] 95; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 96; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 97; NONEON-NOSVE-NEXT: add w8, w8, w9 98; NONEON-NOSVE-NEXT: sxtb w8, w8 99; NONEON-NOSVE-NEXT: lsr w8, w8, #5 100; NONEON-NOSVE-NEXT: strb w8, [sp, #11] 101; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 102; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 103; NONEON-NOSVE-NEXT: add w8, w8, w9 104; NONEON-NOSVE-NEXT: sxtb w8, w8 105; NONEON-NOSVE-NEXT: lsr w8, w8, #5 106; NONEON-NOSVE-NEXT: strb w8, [sp, #10] 107; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 108; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 109; NONEON-NOSVE-NEXT: add w8, w8, w9 110; NONEON-NOSVE-NEXT: sxtb w8, w8 111; NONEON-NOSVE-NEXT: lsr w8, w8, #5 112; NONEON-NOSVE-NEXT: strb w8, [sp, #9] 113; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 114; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 115; NONEON-NOSVE-NEXT: add w8, w8, w9 116; NONEON-NOSVE-NEXT: sxtb w8, w8 117; NONEON-NOSVE-NEXT: lsr w8, w8, #5 118; NONEON-NOSVE-NEXT: strb w8, [sp, #8] 119; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 120; NONEON-NOSVE-NEXT: add sp, sp, #16 121; NONEON-NOSVE-NEXT: ret 122 %res = sdiv <8 x i8> %op1, shufflevector (<8 x i8> insertelement (<8 x i8> poison, i8 32, i32 0), <8 x i8> poison, <8 x i32> zeroinitializer) 123 ret <8 x i8> %res 124} 125 126define <16 x i8> @sdiv_v16i8(<16 x i8> %op1) { 127; CHECK-LABEL: sdiv_v16i8: 128; CHECK: // %bb.0: 129; CHECK-NEXT: ptrue p0.b, vl16 130; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 131; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #5 132; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 133; CHECK-NEXT: ret 134; 135; NONEON-NOSVE-LABEL: sdiv_v16i8: 136; NONEON-NOSVE: // %bb.0: 137; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 138; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 139; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15] 140; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 141; NONEON-NOSVE-NEXT: add w8, w8, w9 142; NONEON-NOSVE-NEXT: sxtb w8, w8 143; NONEON-NOSVE-NEXT: lsr w8, w8, #5 144; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 145; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14] 146; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 147; NONEON-NOSVE-NEXT: add w8, w8, w9 148; NONEON-NOSVE-NEXT: sxtb w8, w8 149; NONEON-NOSVE-NEXT: lsr w8, w8, #5 150; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 151; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13] 152; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 153; NONEON-NOSVE-NEXT: add w8, w8, w9 154; NONEON-NOSVE-NEXT: sxtb w8, w8 155; NONEON-NOSVE-NEXT: lsr w8, w8, #5 156; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 157; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12] 158; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 159; NONEON-NOSVE-NEXT: add w8, w8, w9 160; NONEON-NOSVE-NEXT: sxtb w8, w8 161; NONEON-NOSVE-NEXT: lsr w8, w8, #5 162; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 163; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11] 164; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 165; NONEON-NOSVE-NEXT: add w8, w8, w9 166; NONEON-NOSVE-NEXT: sxtb w8, w8 167; NONEON-NOSVE-NEXT: lsr w8, w8, #5 168; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 169; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10] 170; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 171; NONEON-NOSVE-NEXT: add w8, w8, w9 172; NONEON-NOSVE-NEXT: sxtb w8, w8 173; NONEON-NOSVE-NEXT: lsr w8, w8, #5 174; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 175; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9] 176; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 177; NONEON-NOSVE-NEXT: add w8, w8, w9 178; NONEON-NOSVE-NEXT: sxtb w8, w8 179; NONEON-NOSVE-NEXT: lsr w8, w8, #5 180; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 181; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8] 182; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 183; NONEON-NOSVE-NEXT: add w8, w8, w9 184; NONEON-NOSVE-NEXT: sxtb w8, w8 185; NONEON-NOSVE-NEXT: lsr w8, w8, #5 186; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 187; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 188; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 189; NONEON-NOSVE-NEXT: add w8, w8, w9 190; NONEON-NOSVE-NEXT: sxtb w8, w8 191; NONEON-NOSVE-NEXT: lsr w8, w8, #5 192; NONEON-NOSVE-NEXT: strb w8, [sp, #23] 193; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 194; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 195; NONEON-NOSVE-NEXT: add w8, w8, w9 196; NONEON-NOSVE-NEXT: sxtb w8, w8 197; NONEON-NOSVE-NEXT: lsr w8, w8, #5 198; NONEON-NOSVE-NEXT: strb w8, [sp, #22] 199; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 200; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 201; NONEON-NOSVE-NEXT: add w8, w8, w9 202; NONEON-NOSVE-NEXT: sxtb w8, w8 203; NONEON-NOSVE-NEXT: lsr w8, w8, #5 204; NONEON-NOSVE-NEXT: strb w8, [sp, #21] 205; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 206; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 207; NONEON-NOSVE-NEXT: add w8, w8, w9 208; NONEON-NOSVE-NEXT: sxtb w8, w8 209; NONEON-NOSVE-NEXT: lsr w8, w8, #5 210; NONEON-NOSVE-NEXT: strb w8, [sp, #20] 211; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 212; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 213; NONEON-NOSVE-NEXT: add w8, w8, w9 214; NONEON-NOSVE-NEXT: sxtb w8, w8 215; NONEON-NOSVE-NEXT: lsr w8, w8, #5 216; NONEON-NOSVE-NEXT: strb w8, [sp, #19] 217; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 218; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 219; NONEON-NOSVE-NEXT: add w8, w8, w9 220; NONEON-NOSVE-NEXT: sxtb w8, w8 221; NONEON-NOSVE-NEXT: lsr w8, w8, #5 222; NONEON-NOSVE-NEXT: strb w8, [sp, #18] 223; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 224; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 225; NONEON-NOSVE-NEXT: add w8, w8, w9 226; NONEON-NOSVE-NEXT: sxtb w8, w8 227; NONEON-NOSVE-NEXT: lsr w8, w8, #5 228; NONEON-NOSVE-NEXT: strb w8, [sp, #17] 229; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 230; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 231; NONEON-NOSVE-NEXT: add w8, w8, w9 232; NONEON-NOSVE-NEXT: sxtb w8, w8 233; NONEON-NOSVE-NEXT: lsr w8, w8, #5 234; NONEON-NOSVE-NEXT: strb w8, [sp, #16] 235; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 236; NONEON-NOSVE-NEXT: add sp, sp, #32 237; NONEON-NOSVE-NEXT: ret 238 %res = sdiv <16 x i8> %op1, shufflevector (<16 x i8> insertelement (<16 x i8> poison, i8 32, i32 0), <16 x i8> poison, <16 x i32> zeroinitializer) 239 ret <16 x i8> %res 240} 241 242define void @sdiv_v32i8(ptr %a) { 243; CHECK-LABEL: sdiv_v32i8: 244; CHECK: // %bb.0: 245; CHECK-NEXT: ldp q0, q1, [x0] 246; CHECK-NEXT: ptrue p0.b, vl16 247; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #5 248; CHECK-NEXT: asrd z1.b, p0/m, z1.b, #5 249; CHECK-NEXT: stp q0, q1, [x0] 250; CHECK-NEXT: ret 251; 252; NONEON-NOSVE-LABEL: sdiv_v32i8: 253; NONEON-NOSVE: // %bb.0: 254; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 255; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 256; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 257; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 258; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 259; NONEON-NOSVE-NEXT: add w8, w8, w9 260; NONEON-NOSVE-NEXT: sxtb w8, w8 261; NONEON-NOSVE-NEXT: lsr w8, w8, #5 262; NONEON-NOSVE-NEXT: strb w8, [sp, #63] 263; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 264; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 265; NONEON-NOSVE-NEXT: add w8, w8, w9 266; NONEON-NOSVE-NEXT: sxtb w8, w8 267; NONEON-NOSVE-NEXT: lsr w8, w8, #5 268; NONEON-NOSVE-NEXT: strb w8, [sp, #62] 269; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 270; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 271; NONEON-NOSVE-NEXT: add w8, w8, w9 272; NONEON-NOSVE-NEXT: sxtb w8, w8 273; NONEON-NOSVE-NEXT: lsr w8, w8, #5 274; NONEON-NOSVE-NEXT: strb w8, [sp, #61] 275; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 276; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 277; NONEON-NOSVE-NEXT: add w8, w8, w9 278; NONEON-NOSVE-NEXT: sxtb w8, w8 279; NONEON-NOSVE-NEXT: lsr w8, w8, #5 280; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 281; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 282; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 283; NONEON-NOSVE-NEXT: add w8, w8, w9 284; NONEON-NOSVE-NEXT: sxtb w8, w8 285; NONEON-NOSVE-NEXT: lsr w8, w8, #5 286; NONEON-NOSVE-NEXT: strb w8, [sp, #59] 287; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 288; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 289; NONEON-NOSVE-NEXT: add w8, w8, w9 290; NONEON-NOSVE-NEXT: sxtb w8, w8 291; NONEON-NOSVE-NEXT: lsr w8, w8, #5 292; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 293; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 294; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 295; NONEON-NOSVE-NEXT: add w8, w8, w9 296; NONEON-NOSVE-NEXT: sxtb w8, w8 297; NONEON-NOSVE-NEXT: lsr w8, w8, #5 298; NONEON-NOSVE-NEXT: strb w8, [sp, #57] 299; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 300; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 301; NONEON-NOSVE-NEXT: add w8, w8, w9 302; NONEON-NOSVE-NEXT: sxtb w8, w8 303; NONEON-NOSVE-NEXT: lsr w8, w8, #5 304; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 305; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 306; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 307; NONEON-NOSVE-NEXT: add w8, w8, w9 308; NONEON-NOSVE-NEXT: sxtb w8, w8 309; NONEON-NOSVE-NEXT: lsr w8, w8, #5 310; NONEON-NOSVE-NEXT: strb w8, [sp, #55] 311; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 312; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 313; NONEON-NOSVE-NEXT: add w8, w8, w9 314; NONEON-NOSVE-NEXT: sxtb w8, w8 315; NONEON-NOSVE-NEXT: lsr w8, w8, #5 316; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 317; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 318; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 319; NONEON-NOSVE-NEXT: add w8, w8, w9 320; NONEON-NOSVE-NEXT: sxtb w8, w8 321; NONEON-NOSVE-NEXT: lsr w8, w8, #5 322; NONEON-NOSVE-NEXT: strb w8, [sp, #53] 323; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 324; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 325; NONEON-NOSVE-NEXT: add w8, w8, w9 326; NONEON-NOSVE-NEXT: sxtb w8, w8 327; NONEON-NOSVE-NEXT: lsr w8, w8, #5 328; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 329; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 330; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 331; NONEON-NOSVE-NEXT: add w8, w8, w9 332; NONEON-NOSVE-NEXT: sxtb w8, w8 333; NONEON-NOSVE-NEXT: lsr w8, w8, #5 334; NONEON-NOSVE-NEXT: strb w8, [sp, #51] 335; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 336; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 337; NONEON-NOSVE-NEXT: add w8, w8, w9 338; NONEON-NOSVE-NEXT: sxtb w8, w8 339; NONEON-NOSVE-NEXT: lsr w8, w8, #5 340; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 341; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 342; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 343; NONEON-NOSVE-NEXT: add w8, w8, w9 344; NONEON-NOSVE-NEXT: sxtb w8, w8 345; NONEON-NOSVE-NEXT: lsr w8, w8, #5 346; NONEON-NOSVE-NEXT: strb w8, [sp, #49] 347; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 348; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 349; NONEON-NOSVE-NEXT: add w8, w8, w9 350; NONEON-NOSVE-NEXT: sxtb w8, w8 351; NONEON-NOSVE-NEXT: lsr w8, w8, #5 352; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 353; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15] 354; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 355; NONEON-NOSVE-NEXT: add w8, w8, w9 356; NONEON-NOSVE-NEXT: sxtb w8, w8 357; NONEON-NOSVE-NEXT: lsr w8, w8, #5 358; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 359; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14] 360; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 361; NONEON-NOSVE-NEXT: add w8, w8, w9 362; NONEON-NOSVE-NEXT: sxtb w8, w8 363; NONEON-NOSVE-NEXT: lsr w8, w8, #5 364; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 365; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13] 366; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 367; NONEON-NOSVE-NEXT: add w8, w8, w9 368; NONEON-NOSVE-NEXT: sxtb w8, w8 369; NONEON-NOSVE-NEXT: lsr w8, w8, #5 370; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 371; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12] 372; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 373; NONEON-NOSVE-NEXT: add w8, w8, w9 374; NONEON-NOSVE-NEXT: sxtb w8, w8 375; NONEON-NOSVE-NEXT: lsr w8, w8, #5 376; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 377; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11] 378; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 379; NONEON-NOSVE-NEXT: add w8, w8, w9 380; NONEON-NOSVE-NEXT: sxtb w8, w8 381; NONEON-NOSVE-NEXT: lsr w8, w8, #5 382; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 383; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10] 384; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 385; NONEON-NOSVE-NEXT: add w8, w8, w9 386; NONEON-NOSVE-NEXT: sxtb w8, w8 387; NONEON-NOSVE-NEXT: lsr w8, w8, #5 388; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 389; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9] 390; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 391; NONEON-NOSVE-NEXT: add w8, w8, w9 392; NONEON-NOSVE-NEXT: sxtb w8, w8 393; NONEON-NOSVE-NEXT: lsr w8, w8, #5 394; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 395; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8] 396; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 397; NONEON-NOSVE-NEXT: add w8, w8, w9 398; NONEON-NOSVE-NEXT: sxtb w8, w8 399; NONEON-NOSVE-NEXT: lsr w8, w8, #5 400; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 401; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 402; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 403; NONEON-NOSVE-NEXT: add w8, w8, w9 404; NONEON-NOSVE-NEXT: sxtb w8, w8 405; NONEON-NOSVE-NEXT: lsr w8, w8, #5 406; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 407; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 408; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 409; NONEON-NOSVE-NEXT: add w8, w8, w9 410; NONEON-NOSVE-NEXT: sxtb w8, w8 411; NONEON-NOSVE-NEXT: lsr w8, w8, #5 412; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 413; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 414; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 415; NONEON-NOSVE-NEXT: add w8, w8, w9 416; NONEON-NOSVE-NEXT: sxtb w8, w8 417; NONEON-NOSVE-NEXT: lsr w8, w8, #5 418; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 419; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 420; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 421; NONEON-NOSVE-NEXT: add w8, w8, w9 422; NONEON-NOSVE-NEXT: sxtb w8, w8 423; NONEON-NOSVE-NEXT: lsr w8, w8, #5 424; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 425; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 426; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 427; NONEON-NOSVE-NEXT: add w8, w8, w9 428; NONEON-NOSVE-NEXT: sxtb w8, w8 429; NONEON-NOSVE-NEXT: lsr w8, w8, #5 430; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 431; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 432; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 433; NONEON-NOSVE-NEXT: add w8, w8, w9 434; NONEON-NOSVE-NEXT: sxtb w8, w8 435; NONEON-NOSVE-NEXT: lsr w8, w8, #5 436; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 437; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 438; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 439; NONEON-NOSVE-NEXT: add w8, w8, w9 440; NONEON-NOSVE-NEXT: sxtb w8, w8 441; NONEON-NOSVE-NEXT: lsr w8, w8, #5 442; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 443; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 444; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5 445; NONEON-NOSVE-NEXT: add w8, w8, w9 446; NONEON-NOSVE-NEXT: sxtb w8, w8 447; NONEON-NOSVE-NEXT: lsr w8, w8, #5 448; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 449; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 450; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 451; NONEON-NOSVE-NEXT: add sp, sp, #64 452; NONEON-NOSVE-NEXT: ret 453 %op1 = load <32 x i8>, ptr %a 454 %res = sdiv <32 x i8> %op1, shufflevector (<32 x i8> insertelement (<32 x i8> poison, i8 32, i32 0), <32 x i8> poison, <32 x i32> zeroinitializer) 455 store <32 x i8> %res, ptr %a 456 ret void 457} 458 459define <2 x i16> @sdiv_v2i16(<2 x i16> %op1) { 460; CHECK-LABEL: sdiv_v2i16: 461; CHECK: // %bb.0: 462; CHECK-NEXT: ptrue p0.s, vl2 463; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 464; CHECK-NEXT: sxth z0.s, p0/m, z0.s 465; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5 466; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 467; CHECK-NEXT: ret 468; 469; NONEON-NOSVE-LABEL: sdiv_v2i16: 470; NONEON-NOSVE: // %bb.0: 471; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 472; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 473; NONEON-NOSVE-NEXT: ldp w9, w8, [sp] 474; NONEON-NOSVE-NEXT: sxth w10, w8 475; NONEON-NOSVE-NEXT: sxth w11, w9 476; NONEON-NOSVE-NEXT: ubfx w10, w10, #26, #5 477; NONEON-NOSVE-NEXT: ubfx w11, w11, #26, #5 478; NONEON-NOSVE-NEXT: add w8, w8, w10 479; NONEON-NOSVE-NEXT: add w9, w9, w11 480; NONEON-NOSVE-NEXT: sbfx w8, w8, #5, #11 481; NONEON-NOSVE-NEXT: sbfx w9, w9, #5, #11 482; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #8] 483; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 484; NONEON-NOSVE-NEXT: add sp, sp, #16 485; NONEON-NOSVE-NEXT: ret 486 %res = sdiv <2 x i16> %op1, shufflevector (<2 x i16> insertelement (<2 x i16> poison, i16 32, i32 0), <2 x i16> poison, <2 x i32> zeroinitializer) 487 ret <2 x i16> %res 488} 489 490define <4 x i16> @sdiv_v4i16(<4 x i16> %op1) { 491; CHECK-LABEL: sdiv_v4i16: 492; CHECK: // %bb.0: 493; CHECK-NEXT: ptrue p0.h, vl4 494; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 495; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5 496; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 497; CHECK-NEXT: ret 498; 499; NONEON-NOSVE-LABEL: sdiv_v4i16: 500; NONEON-NOSVE: // %bb.0: 501; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 502; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 503; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 504; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 505; NONEON-NOSVE-NEXT: add w8, w8, w9 506; NONEON-NOSVE-NEXT: sxth w8, w8 507; NONEON-NOSVE-NEXT: lsr w8, w8, #5 508; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 509; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 510; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 511; NONEON-NOSVE-NEXT: add w8, w8, w9 512; NONEON-NOSVE-NEXT: sxth w8, w8 513; NONEON-NOSVE-NEXT: lsr w8, w8, #5 514; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 515; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 516; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 517; NONEON-NOSVE-NEXT: add w8, w8, w9 518; NONEON-NOSVE-NEXT: sxth w8, w8 519; NONEON-NOSVE-NEXT: lsr w8, w8, #5 520; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 521; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 522; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 523; NONEON-NOSVE-NEXT: add w8, w8, w9 524; NONEON-NOSVE-NEXT: sxth w8, w8 525; NONEON-NOSVE-NEXT: lsr w8, w8, #5 526; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 527; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 528; NONEON-NOSVE-NEXT: add sp, sp, #16 529; NONEON-NOSVE-NEXT: ret 530 %res = sdiv <4 x i16> %op1, shufflevector (<4 x i16> insertelement (<4 x i16> poison, i16 32, i32 0), <4 x i16> poison, <4 x i32> zeroinitializer) 531 ret <4 x i16> %res 532} 533 534define <8 x i16> @sdiv_v8i16(<8 x i16> %op1) { 535; CHECK-LABEL: sdiv_v8i16: 536; CHECK: // %bb.0: 537; CHECK-NEXT: ptrue p0.h, vl8 538; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 539; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5 540; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 541; CHECK-NEXT: ret 542; 543; NONEON-NOSVE-LABEL: sdiv_v8i16: 544; NONEON-NOSVE: // %bb.0: 545; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 546; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 547; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 548; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 549; NONEON-NOSVE-NEXT: add w8, w8, w9 550; NONEON-NOSVE-NEXT: sxth w8, w8 551; NONEON-NOSVE-NEXT: lsr w8, w8, #5 552; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 553; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 554; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 555; NONEON-NOSVE-NEXT: add w8, w8, w9 556; NONEON-NOSVE-NEXT: sxth w8, w8 557; NONEON-NOSVE-NEXT: lsr w8, w8, #5 558; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 559; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 560; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 561; NONEON-NOSVE-NEXT: add w8, w8, w9 562; NONEON-NOSVE-NEXT: sxth w8, w8 563; NONEON-NOSVE-NEXT: lsr w8, w8, #5 564; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 565; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 566; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 567; NONEON-NOSVE-NEXT: add w8, w8, w9 568; NONEON-NOSVE-NEXT: sxth w8, w8 569; NONEON-NOSVE-NEXT: lsr w8, w8, #5 570; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 571; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 572; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 573; NONEON-NOSVE-NEXT: add w8, w8, w9 574; NONEON-NOSVE-NEXT: sxth w8, w8 575; NONEON-NOSVE-NEXT: lsr w8, w8, #5 576; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 577; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 578; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 579; NONEON-NOSVE-NEXT: add w8, w8, w9 580; NONEON-NOSVE-NEXT: sxth w8, w8 581; NONEON-NOSVE-NEXT: lsr w8, w8, #5 582; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 583; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 584; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 585; NONEON-NOSVE-NEXT: add w8, w8, w9 586; NONEON-NOSVE-NEXT: sxth w8, w8 587; NONEON-NOSVE-NEXT: lsr w8, w8, #5 588; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 589; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 590; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 591; NONEON-NOSVE-NEXT: add w8, w8, w9 592; NONEON-NOSVE-NEXT: sxth w8, w8 593; NONEON-NOSVE-NEXT: lsr w8, w8, #5 594; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 595; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 596; NONEON-NOSVE-NEXT: add sp, sp, #32 597; NONEON-NOSVE-NEXT: ret 598 %res = sdiv <8 x i16> %op1, shufflevector (<8 x i16> insertelement (<8 x i16> poison, i16 32, i32 0), <8 x i16> poison, <8 x i32> zeroinitializer) 599 ret <8 x i16> %res 600} 601 602define void @sdiv_v16i16(ptr %a) { 603; CHECK-LABEL: sdiv_v16i16: 604; CHECK: // %bb.0: 605; CHECK-NEXT: ldp q0, q1, [x0] 606; CHECK-NEXT: ptrue p0.h, vl8 607; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5 608; CHECK-NEXT: asrd z1.h, p0/m, z1.h, #5 609; CHECK-NEXT: stp q0, q1, [x0] 610; CHECK-NEXT: ret 611; 612; NONEON-NOSVE-LABEL: sdiv_v16i16: 613; NONEON-NOSVE: // %bb.0: 614; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 615; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 616; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 617; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 618; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 619; NONEON-NOSVE-NEXT: add w8, w8, w9 620; NONEON-NOSVE-NEXT: sxth w8, w8 621; NONEON-NOSVE-NEXT: lsr w8, w8, #5 622; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 623; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 624; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 625; NONEON-NOSVE-NEXT: add w8, w8, w9 626; NONEON-NOSVE-NEXT: sxth w8, w8 627; NONEON-NOSVE-NEXT: lsr w8, w8, #5 628; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 629; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 630; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 631; NONEON-NOSVE-NEXT: add w8, w8, w9 632; NONEON-NOSVE-NEXT: sxth w8, w8 633; NONEON-NOSVE-NEXT: lsr w8, w8, #5 634; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 635; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 636; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 637; NONEON-NOSVE-NEXT: add w8, w8, w9 638; NONEON-NOSVE-NEXT: sxth w8, w8 639; NONEON-NOSVE-NEXT: lsr w8, w8, #5 640; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 641; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 642; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 643; NONEON-NOSVE-NEXT: add w8, w8, w9 644; NONEON-NOSVE-NEXT: sxth w8, w8 645; NONEON-NOSVE-NEXT: lsr w8, w8, #5 646; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 647; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 648; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 649; NONEON-NOSVE-NEXT: add w8, w8, w9 650; NONEON-NOSVE-NEXT: sxth w8, w8 651; NONEON-NOSVE-NEXT: lsr w8, w8, #5 652; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 653; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 654; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 655; NONEON-NOSVE-NEXT: add w8, w8, w9 656; NONEON-NOSVE-NEXT: sxth w8, w8 657; NONEON-NOSVE-NEXT: lsr w8, w8, #5 658; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 659; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 660; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 661; NONEON-NOSVE-NEXT: add w8, w8, w9 662; NONEON-NOSVE-NEXT: sxth w8, w8 663; NONEON-NOSVE-NEXT: lsr w8, w8, #5 664; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 665; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 666; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 667; NONEON-NOSVE-NEXT: add w8, w8, w9 668; NONEON-NOSVE-NEXT: sxth w8, w8 669; NONEON-NOSVE-NEXT: lsr w8, w8, #5 670; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 671; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 672; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 673; NONEON-NOSVE-NEXT: add w8, w8, w9 674; NONEON-NOSVE-NEXT: sxth w8, w8 675; NONEON-NOSVE-NEXT: lsr w8, w8, #5 676; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 677; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 678; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 679; NONEON-NOSVE-NEXT: add w8, w8, w9 680; NONEON-NOSVE-NEXT: sxth w8, w8 681; NONEON-NOSVE-NEXT: lsr w8, w8, #5 682; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 683; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 684; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 685; NONEON-NOSVE-NEXT: add w8, w8, w9 686; NONEON-NOSVE-NEXT: sxth w8, w8 687; NONEON-NOSVE-NEXT: lsr w8, w8, #5 688; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 689; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 690; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 691; NONEON-NOSVE-NEXT: add w8, w8, w9 692; NONEON-NOSVE-NEXT: sxth w8, w8 693; NONEON-NOSVE-NEXT: lsr w8, w8, #5 694; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 695; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 696; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 697; NONEON-NOSVE-NEXT: add w8, w8, w9 698; NONEON-NOSVE-NEXT: sxth w8, w8 699; NONEON-NOSVE-NEXT: lsr w8, w8, #5 700; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 701; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 702; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 703; NONEON-NOSVE-NEXT: add w8, w8, w9 704; NONEON-NOSVE-NEXT: sxth w8, w8 705; NONEON-NOSVE-NEXT: lsr w8, w8, #5 706; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 707; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 708; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5 709; NONEON-NOSVE-NEXT: add w8, w8, w9 710; NONEON-NOSVE-NEXT: sxth w8, w8 711; NONEON-NOSVE-NEXT: lsr w8, w8, #5 712; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 713; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 714; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 715; NONEON-NOSVE-NEXT: add sp, sp, #64 716; NONEON-NOSVE-NEXT: ret 717 %op1 = load <16 x i16>, ptr %a 718 %res = sdiv <16 x i16> %op1, shufflevector (<16 x i16> insertelement (<16 x i16> poison, i16 32, i32 0), <16 x i16> poison, <16 x i32> zeroinitializer) 719 store <16 x i16> %res, ptr %a 720 ret void 721} 722 723define <2 x i32> @sdiv_v2i32(<2 x i32> %op1) { 724; CHECK-LABEL: sdiv_v2i32: 725; CHECK: // %bb.0: 726; CHECK-NEXT: ptrue p0.s, vl2 727; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 728; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5 729; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 730; CHECK-NEXT: ret 731; 732; NONEON-NOSVE-LABEL: sdiv_v2i32: 733; NONEON-NOSVE: // %bb.0: 734; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 735; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 736; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 737; NONEON-NOSVE-NEXT: asr w9, w8, #31 738; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 739; NONEON-NOSVE-NEXT: asr w10, w8, #5 740; NONEON-NOSVE-NEXT: ldr w8, [sp] 741; NONEON-NOSVE-NEXT: asr w9, w8, #31 742; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 743; NONEON-NOSVE-NEXT: asr w8, w8, #5 744; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8] 745; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 746; NONEON-NOSVE-NEXT: add sp, sp, #16 747; NONEON-NOSVE-NEXT: ret 748 %res = sdiv <2 x i32> %op1, shufflevector (<2 x i32> insertelement (<2 x i32> poison, i32 32, i32 0), <2 x i32> poison, <2 x i32> zeroinitializer) 749 ret <2 x i32> %res 750} 751 752define <4 x i32> @sdiv_v4i32(<4 x i32> %op1) { 753; CHECK-LABEL: sdiv_v4i32: 754; CHECK: // %bb.0: 755; CHECK-NEXT: ptrue p0.s, vl4 756; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 757; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5 758; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 759; CHECK-NEXT: ret 760; 761; NONEON-NOSVE-LABEL: sdiv_v4i32: 762; NONEON-NOSVE: // %bb.0: 763; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 764; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 765; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 766; NONEON-NOSVE-NEXT: asr w9, w8, #31 767; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 768; NONEON-NOSVE-NEXT: asr w10, w8, #5 769; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 770; NONEON-NOSVE-NEXT: asr w9, w8, #31 771; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 772; NONEON-NOSVE-NEXT: asr w8, w8, #5 773; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #24] 774; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 775; NONEON-NOSVE-NEXT: asr w9, w8, #31 776; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 777; NONEON-NOSVE-NEXT: asr w10, w8, #5 778; NONEON-NOSVE-NEXT: ldr w8, [sp] 779; NONEON-NOSVE-NEXT: asr w9, w8, #31 780; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 781; NONEON-NOSVE-NEXT: asr w8, w8, #5 782; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #16] 783; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 784; NONEON-NOSVE-NEXT: add sp, sp, #32 785; NONEON-NOSVE-NEXT: ret 786 %res = sdiv <4 x i32> %op1, shufflevector (<4 x i32> insertelement (<4 x i32> poison, i32 32, i32 0), <4 x i32> poison, <4 x i32> zeroinitializer) 787 ret <4 x i32> %res 788} 789 790define void @sdiv_v8i32(ptr %a) { 791; CHECK-LABEL: sdiv_v8i32: 792; CHECK: // %bb.0: 793; CHECK-NEXT: ldp q0, q1, [x0] 794; CHECK-NEXT: ptrue p0.s, vl4 795; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5 796; CHECK-NEXT: asrd z1.s, p0/m, z1.s, #5 797; CHECK-NEXT: stp q0, q1, [x0] 798; CHECK-NEXT: ret 799; 800; NONEON-NOSVE-LABEL: sdiv_v8i32: 801; NONEON-NOSVE: // %bb.0: 802; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 803; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 804; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 805; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 806; NONEON-NOSVE-NEXT: asr w9, w8, #31 807; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 808; NONEON-NOSVE-NEXT: asr w10, w8, #5 809; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 810; NONEON-NOSVE-NEXT: asr w9, w8, #31 811; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 812; NONEON-NOSVE-NEXT: asr w8, w8, #5 813; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #56] 814; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 815; NONEON-NOSVE-NEXT: asr w9, w8, #31 816; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 817; NONEON-NOSVE-NEXT: asr w10, w8, #5 818; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 819; NONEON-NOSVE-NEXT: asr w9, w8, #31 820; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 821; NONEON-NOSVE-NEXT: asr w8, w8, #5 822; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #48] 823; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 824; NONEON-NOSVE-NEXT: asr w9, w8, #31 825; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 826; NONEON-NOSVE-NEXT: asr w10, w8, #5 827; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 828; NONEON-NOSVE-NEXT: asr w9, w8, #31 829; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 830; NONEON-NOSVE-NEXT: asr w8, w8, #5 831; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #40] 832; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 833; NONEON-NOSVE-NEXT: asr w9, w8, #31 834; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 835; NONEON-NOSVE-NEXT: asr w10, w8, #5 836; NONEON-NOSVE-NEXT: ldr w8, [sp] 837; NONEON-NOSVE-NEXT: asr w9, w8, #31 838; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27 839; NONEON-NOSVE-NEXT: asr w8, w8, #5 840; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #32] 841; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 842; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 843; NONEON-NOSVE-NEXT: add sp, sp, #64 844; NONEON-NOSVE-NEXT: ret 845 %op1 = load <8 x i32>, ptr %a 846 %res = sdiv <8 x i32> %op1, shufflevector (<8 x i32> insertelement (<8 x i32> poison, i32 32, i32 0), <8 x i32> poison, <8 x i32> zeroinitializer) 847 store <8 x i32> %res, ptr %a 848 ret void 849} 850 851define <1 x i64> @sdiv_v1i64(<1 x i64> %op1) { 852; CHECK-LABEL: sdiv_v1i64: 853; CHECK: // %bb.0: 854; CHECK-NEXT: ptrue p0.d, vl1 855; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 856; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5 857; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 858; CHECK-NEXT: ret 859; 860; NONEON-NOSVE-LABEL: sdiv_v1i64: 861; NONEON-NOSVE: // %bb.0: 862; NONEON-NOSVE-NEXT: sub sp, sp, #16 863; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 864; NONEON-NOSVE-NEXT: fmov x8, d0 865; NONEON-NOSVE-NEXT: asr x9, x8, #63 866; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 867; NONEON-NOSVE-NEXT: asr x8, x8, #5 868; NONEON-NOSVE-NEXT: str x8, [sp, #8] 869; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 870; NONEON-NOSVE-NEXT: add sp, sp, #16 871; NONEON-NOSVE-NEXT: ret 872 %res = sdiv <1 x i64> %op1, shufflevector (<1 x i64> insertelement (<1 x i64> poison, i64 32, i32 0), <1 x i64> poison, <1 x i32> zeroinitializer) 873 ret <1 x i64> %res 874} 875 876; Vector i64 sdiv are not legal for NEON so use SVE when available. 877define <2 x i64> @sdiv_v2i64(<2 x i64> %op1) { 878; CHECK-LABEL: sdiv_v2i64: 879; CHECK: // %bb.0: 880; CHECK-NEXT: ptrue p0.d, vl2 881; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 882; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5 883; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 884; CHECK-NEXT: ret 885; 886; NONEON-NOSVE-LABEL: sdiv_v2i64: 887; NONEON-NOSVE: // %bb.0: 888; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 889; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 890; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 891; NONEON-NOSVE-NEXT: asr x9, x8, #63 892; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 893; NONEON-NOSVE-NEXT: asr x10, x8, #5 894; NONEON-NOSVE-NEXT: ldr x8, [sp] 895; NONEON-NOSVE-NEXT: asr x9, x8, #63 896; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 897; NONEON-NOSVE-NEXT: asr x8, x8, #5 898; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #16] 899; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 900; NONEON-NOSVE-NEXT: add sp, sp, #32 901; NONEON-NOSVE-NEXT: ret 902 %res = sdiv <2 x i64> %op1, shufflevector (<2 x i64> insertelement (<2 x i64> poison, i64 32, i32 0), <2 x i64> poison, <2 x i32> zeroinitializer) 903 ret <2 x i64> %res 904} 905 906define void @sdiv_v4i64(ptr %a) { 907; CHECK-LABEL: sdiv_v4i64: 908; CHECK: // %bb.0: 909; CHECK-NEXT: ldp q0, q1, [x0] 910; CHECK-NEXT: ptrue p0.d, vl2 911; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5 912; CHECK-NEXT: asrd z1.d, p0/m, z1.d, #5 913; CHECK-NEXT: stp q0, q1, [x0] 914; CHECK-NEXT: ret 915; 916; NONEON-NOSVE-LABEL: sdiv_v4i64: 917; NONEON-NOSVE: // %bb.0: 918; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 919; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 920; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 921; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 922; NONEON-NOSVE-NEXT: asr x9, x8, #63 923; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 924; NONEON-NOSVE-NEXT: asr x10, x8, #5 925; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 926; NONEON-NOSVE-NEXT: asr x9, x8, #63 927; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 928; NONEON-NOSVE-NEXT: asr x8, x8, #5 929; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #48] 930; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 931; NONEON-NOSVE-NEXT: asr x9, x8, #63 932; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 933; NONEON-NOSVE-NEXT: asr x10, x8, #5 934; NONEON-NOSVE-NEXT: ldr x8, [sp] 935; NONEON-NOSVE-NEXT: asr x9, x8, #63 936; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59 937; NONEON-NOSVE-NEXT: asr x8, x8, #5 938; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #32] 939; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 940; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 941; NONEON-NOSVE-NEXT: add sp, sp, #64 942; NONEON-NOSVE-NEXT: ret 943 %op1 = load <4 x i64>, ptr %a 944 %res = sdiv <4 x i64> %op1, shufflevector (<4 x i64> insertelement (<4 x i64> poison, i64 32, i32 0), <4 x i64> poison, <4 x i32> zeroinitializer) 945 store <4 x i64> %res, ptr %a 946 ret void 947} 948