1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s --check-prefixes=CHECK 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s --check-prefixes=CHECK 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; 9; SDIV 10; 11 12define <4 x i8> @sdiv_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 13; CHECK-LABEL: sdiv_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: sxtb z0.h, p0/m, z0.h 19; CHECK-NEXT: sxtb z1.h, p0/m, z1.h 20; CHECK-NEXT: ptrue p0.s, vl4 21; CHECK-NEXT: sunpklo z1.s, z1.h 22; CHECK-NEXT: sunpklo z0.s, z0.h 23; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 24; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 25; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 26; CHECK-NEXT: ret 27; 28; NONEON-NOSVE-LABEL: sdiv_v4i8: 29; NONEON-NOSVE: // %bb.0: 30; NONEON-NOSVE-NEXT: sub sp, sp, #32 31; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 32; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 33; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 34; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 35; NONEON-NOSVE-NEXT: ldrsb w10, [sp, #12] 36; NONEON-NOSVE-NEXT: ldrsb w11, [sp, #10] 37; NONEON-NOSVE-NEXT: ldrsb w12, [sp, #8] 38; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 39; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #20] 40; NONEON-NOSVE-NEXT: sdiv w9, w10, w9 41; NONEON-NOSVE-NEXT: ldrsb w10, [sp, #18] 42; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 43; NONEON-NOSVE-NEXT: sdiv w10, w11, w10 44; NONEON-NOSVE-NEXT: ldrsb w11, [sp, #16] 45; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 46; NONEON-NOSVE-NEXT: sdiv w11, w12, w11 47; NONEON-NOSVE-NEXT: strh w10, [sp, #26] 48; NONEON-NOSVE-NEXT: strh w11, [sp, #24] 49; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 50; NONEON-NOSVE-NEXT: add sp, sp, #32 51; NONEON-NOSVE-NEXT: ret 52 %res = sdiv <4 x i8> %op1, %op2 53 ret <4 x i8> %res 54} 55 56define <8 x i8> @sdiv_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 57; CHECK-LABEL: sdiv_v8i8: 58; CHECK: // %bb.0: 59; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 60; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 61; CHECK-NEXT: ptrue p0.s, vl4 62; CHECK-NEXT: sunpklo z1.h, z1.b 63; CHECK-NEXT: sunpklo z0.h, z0.b 64; CHECK-NEXT: sunpklo z2.s, z1.h 65; CHECK-NEXT: sunpklo z3.s, z0.h 66; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 67; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 68; CHECK-NEXT: sunpklo z1.s, z1.h 69; CHECK-NEXT: sunpklo z0.s, z0.h 70; CHECK-NEXT: sdivr z2.s, p0/m, z2.s, z3.s 71; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 72; CHECK-NEXT: ptrue p0.h, vl4 73; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 74; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 75; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h } 76; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b 77; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 78; CHECK-NEXT: ret 79; 80; NONEON-NOSVE-LABEL: sdiv_v8i8: 81; NONEON-NOSVE: // %bb.0: 82; NONEON-NOSVE-NEXT: sub sp, sp, #32 83; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 84; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 85; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 86; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 87; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 88; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 89; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 90; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 91; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 92; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 93; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 94; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 95; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 96; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 97; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 98; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 99; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 100; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 101; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 102; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 103; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 104; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 105; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 106; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 107; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 108; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 109; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 110; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 111; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 112; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 113; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 114; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 115; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 116; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 117; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 118; NONEON-NOSVE-NEXT: add sp, sp, #32 119; NONEON-NOSVE-NEXT: ret 120 %res = sdiv <8 x i8> %op1, %op2 121 ret <8 x i8> %res 122} 123 124define <16 x i8> @sdiv_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 125; CHECK-LABEL: sdiv_v16i8: 126; CHECK: // %bb.0: 127; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 128; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 129; CHECK-NEXT: sunpklo z2.h, z1.b 130; CHECK-NEXT: sunpklo z3.h, z0.b 131; CHECK-NEXT: ptrue p0.s, vl4 132; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 133; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 134; CHECK-NEXT: sunpklo z4.s, z2.h 135; CHECK-NEXT: sunpklo z5.s, z3.h 136; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 137; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 138; CHECK-NEXT: sunpklo z1.h, z1.b 139; CHECK-NEXT: sunpklo z0.h, z0.b 140; CHECK-NEXT: sunpklo z2.s, z2.h 141; CHECK-NEXT: sunpklo z3.s, z3.h 142; CHECK-NEXT: sdivr z4.s, p0/m, z4.s, z5.s 143; CHECK-NEXT: sunpklo z5.s, z0.h 144; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 145; CHECK-NEXT: sunpklo z0.s, z0.h 146; CHECK-NEXT: sdivr z2.s, p0/m, z2.s, z3.s 147; CHECK-NEXT: sunpklo z3.s, z1.h 148; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 149; CHECK-NEXT: sunpklo z1.s, z1.h 150; CHECK-NEXT: sdivr z3.s, p0/m, z3.s, z5.s 151; CHECK-NEXT: uzp1 z4.h, z4.h, z4.h 152; CHECK-NEXT: uzp1 z5.h, z2.h, z2.h 153; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 154; CHECK-NEXT: ptrue p0.h, vl4 155; CHECK-NEXT: uzp1 z1.h, z3.h, z3.h 156; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 157; CHECK-NEXT: splice z0.h, p0, { z4.h, z5.h } 158; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h } 159; CHECK-NEXT: ptrue p0.b, vl8 160; CHECK-NEXT: uzp1 z2.b, z0.b, z0.b 161; CHECK-NEXT: uzp1 z3.b, z1.b, z1.b 162; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b } 163; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 164; CHECK-NEXT: ret 165; 166; NONEON-NOSVE-LABEL: sdiv_v16i8: 167; NONEON-NOSVE: // %bb.0: 168; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 169; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 170; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 171; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 172; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 173; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 174; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 175; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 176; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 177; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 178; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 179; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 180; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 181; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 182; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 183; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 184; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 185; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 186; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 187; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 188; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 189; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 190; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 191; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 192; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 193; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 194; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 195; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 196; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 197; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 198; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 199; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 200; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 201; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 202; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 203; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 204; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 205; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 206; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 207; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 208; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 209; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 210; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 211; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 212; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 213; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 214; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 215; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 216; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 217; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 218; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 219; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 220; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 221; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 222; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 223; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 224; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 225; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 226; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 227; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 228; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 229; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 230; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 231; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 232; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 233; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 234; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 235; NONEON-NOSVE-NEXT: add sp, sp, #48 236; NONEON-NOSVE-NEXT: ret 237 %res = sdiv <16 x i8> %op1, %op2 238 ret <16 x i8> %res 239} 240 241define void @sdiv_v32i8(ptr %a, ptr %b) { 242; CHECK-LABEL: sdiv_v32i8: 243; CHECK: // %bb.0: 244; CHECK-NEXT: ldp q6, q3, [x1] 245; CHECK-NEXT: ptrue p0.s, vl4 246; CHECK-NEXT: ldr q2, [x0, #16] 247; CHECK-NEXT: sunpklo z1.h, z3.b 248; CHECK-NEXT: sunpklo z4.h, z2.b 249; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 250; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 251; CHECK-NEXT: sunpklo z7.h, z6.b 252; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 253; CHECK-NEXT: sunpklo z3.h, z3.b 254; CHECK-NEXT: sunpklo z0.s, z1.h 255; CHECK-NEXT: sunpklo z5.s, z4.h 256; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 257; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 258; CHECK-NEXT: sunpklo z17.s, z7.h 259; CHECK-NEXT: ext z7.b, z7.b, z7.b, #8 260; CHECK-NEXT: sunpklo z6.h, z6.b 261; CHECK-NEXT: sunpklo z1.s, z1.h 262; CHECK-NEXT: sunpklo z4.s, z4.h 263; CHECK-NEXT: sunpklo z7.s, z7.h 264; CHECK-NEXT: sdivr z0.s, p0/m, z0.s, z5.s 265; CHECK-NEXT: sdivr z1.s, p0/m, z1.s, z4.s 266; CHECK-NEXT: sunpklo z4.h, z2.b 267; CHECK-NEXT: sunpklo z2.s, z3.h 268; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 269; CHECK-NEXT: sunpklo z5.s, z4.h 270; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 271; CHECK-NEXT: sunpklo z3.s, z3.h 272; CHECK-NEXT: sunpklo z4.s, z4.h 273; CHECK-NEXT: sdivr z2.s, p0/m, z2.s, z5.s 274; CHECK-NEXT: ldr q5, [x0] 275; CHECK-NEXT: sunpklo z16.h, z5.b 276; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 277; CHECK-NEXT: sunpklo z5.h, z5.b 278; CHECK-NEXT: sunpklo z18.s, z16.h 279; CHECK-NEXT: ext z16.b, z16.b, z16.b, #8 280; CHECK-NEXT: sunpklo z16.s, z16.h 281; CHECK-NEXT: sdivr z17.s, p0/m, z17.s, z18.s 282; CHECK-NEXT: sunpklo z18.s, z5.h 283; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 284; CHECK-NEXT: sunpklo z5.s, z5.h 285; CHECK-NEXT: sdivr z7.s, p0/m, z7.s, z16.s 286; CHECK-NEXT: sunpklo z16.s, z6.h 287; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 288; CHECK-NEXT: sunpklo z6.s, z6.h 289; CHECK-NEXT: uzp1 z20.h, z17.h, z17.h 290; CHECK-NEXT: sdivr z16.s, p0/m, z16.s, z18.s 291; CHECK-NEXT: uzp1 z18.h, z0.h, z0.h 292; CHECK-NEXT: uzp1 z19.h, z1.h, z1.h 293; CHECK-NEXT: uzp1 z21.h, z7.h, z7.h 294; CHECK-NEXT: sdiv z5.s, p0/m, z5.s, z6.s 295; CHECK-NEXT: uzp1 z0.h, z16.h, z16.h 296; CHECK-NEXT: sdivr z3.s, p0/m, z3.s, z4.s 297; CHECK-NEXT: ptrue p0.h, vl4 298; CHECK-NEXT: uzp1 z1.h, z5.h, z5.h 299; CHECK-NEXT: uzp1 z4.h, z2.h, z2.h 300; CHECK-NEXT: splice z2.h, p0, { z20.h, z21.h } 301; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h } 302; CHECK-NEXT: uzp1 z5.h, z3.h, z3.h 303; CHECK-NEXT: splice z3.h, p0, { z18.h, z19.h } 304; CHECK-NEXT: splice z1.h, p0, { z4.h, z5.h } 305; CHECK-NEXT: uzp1 z4.b, z2.b, z2.b 306; CHECK-NEXT: ptrue p0.b, vl8 307; CHECK-NEXT: uzp1 z2.b, z3.b, z3.b 308; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b 309; CHECK-NEXT: uzp1 z3.b, z1.b, z1.b 310; CHECK-NEXT: splice z0.b, p0, { z4.b, z5.b } 311; CHECK-NEXT: splice z1.b, p0, { z2.b, z3.b } 312; CHECK-NEXT: stp q0, q1, [x0] 313; CHECK-NEXT: ret 314; 315; NONEON-NOSVE-LABEL: sdiv_v32i8: 316; NONEON-NOSVE: // %bb.0: 317; NONEON-NOSVE-NEXT: sub sp, sp, #96 318; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 319; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 320; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 321; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 322; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 323; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #63] 324; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47] 325; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 326; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46] 327; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 328; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #62] 329; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 330; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45] 331; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 332; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #61] 333; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 334; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44] 335; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 336; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #60] 337; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 338; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43] 339; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 340; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #59] 341; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 342; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42] 343; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 344; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #58] 345; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 346; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41] 347; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 348; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #57] 349; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 350; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40] 351; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 352; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #56] 353; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 354; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39] 355; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 356; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #55] 357; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 358; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38] 359; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 360; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #54] 361; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 362; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37] 363; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 364; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #53] 365; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 366; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36] 367; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 368; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #52] 369; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 370; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35] 371; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 372; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #51] 373; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 374; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34] 375; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 376; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #50] 377; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 378; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33] 379; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 380; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #49] 381; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 382; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32] 383; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 384; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #48] 385; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 386; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 387; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 388; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 389; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 390; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 391; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 392; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 393; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 394; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 395; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 396; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 397; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 398; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 399; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 400; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 401; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 402; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 403; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 404; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 405; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 406; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 407; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 408; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 409; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 410; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 411; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 412; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 413; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 414; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 415; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 416; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 417; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 418; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 419; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 420; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 421; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 422; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 423; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 424; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 425; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 426; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 427; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 428; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 429; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 430; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 431; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 432; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 433; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 434; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 435; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 436; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 437; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 438; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 439; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 440; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 441; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 442; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 443; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 444; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 445; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 446; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 447; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 448; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 449; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 450; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 451; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 452; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 453; NONEON-NOSVE-NEXT: add sp, sp, #96 454; NONEON-NOSVE-NEXT: ret 455 %op1 = load <32 x i8>, ptr %a 456 %op2 = load <32 x i8>, ptr %b 457 %res = sdiv <32 x i8> %op1, %op2 458 store <32 x i8> %res, ptr %a 459 ret void 460} 461 462define <2 x i16> @sdiv_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 463; CHECK-LABEL: sdiv_v2i16: 464; CHECK: // %bb.0: 465; CHECK-NEXT: ptrue p0.s, vl2 466; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 467; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 468; CHECK-NEXT: sxth z1.s, p0/m, z1.s 469; CHECK-NEXT: sxth z0.s, p0/m, z0.s 470; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 471; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 472; CHECK-NEXT: ret 473; 474; NONEON-NOSVE-LABEL: sdiv_v2i16: 475; NONEON-NOSVE: // %bb.0: 476; NONEON-NOSVE-NEXT: sub sp, sp, #32 477; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 478; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 479; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 480; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 481; NONEON-NOSVE-NEXT: ldrsh w10, [sp, #8] 482; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 483; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #16] 484; NONEON-NOSVE-NEXT: sdiv w9, w10, w9 485; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24] 486; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 487; NONEON-NOSVE-NEXT: add sp, sp, #32 488; NONEON-NOSVE-NEXT: ret 489 %res = sdiv <2 x i16> %op1, %op2 490 ret <2 x i16> %res 491} 492 493define <4 x i16> @sdiv_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 494; CHECK-LABEL: sdiv_v4i16: 495; CHECK: // %bb.0: 496; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 497; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 498; CHECK-NEXT: ptrue p0.s, vl4 499; CHECK-NEXT: sunpklo z1.s, z1.h 500; CHECK-NEXT: sunpklo z0.s, z0.h 501; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 502; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 503; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 504; CHECK-NEXT: ret 505; 506; NONEON-NOSVE-LABEL: sdiv_v4i16: 507; NONEON-NOSVE: // %bb.0: 508; NONEON-NOSVE-NEXT: sub sp, sp, #32 509; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 510; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 511; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 512; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 513; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 514; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 515; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 516; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 517; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 518; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 519; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 520; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 521; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 522; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 523; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 524; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 525; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 526; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 527; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 528; NONEON-NOSVE-NEXT: add sp, sp, #32 529; NONEON-NOSVE-NEXT: ret 530 %res = sdiv <4 x i16> %op1, %op2 531 ret <4 x i16> %res 532} 533 534define <8 x i16> @sdiv_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 535; CHECK-LABEL: sdiv_v8i16: 536; CHECK: // %bb.0: 537; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 538; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 539; CHECK-NEXT: sunpklo z2.s, z1.h 540; CHECK-NEXT: sunpklo z3.s, z0.h 541; CHECK-NEXT: ptrue p0.s, vl4 542; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 543; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 544; CHECK-NEXT: sunpklo z1.s, z1.h 545; CHECK-NEXT: sunpklo z0.s, z0.h 546; CHECK-NEXT: sdivr z2.s, p0/m, z2.s, z3.s 547; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 548; CHECK-NEXT: ptrue p0.h, vl4 549; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 550; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 551; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h } 552; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 553; CHECK-NEXT: ret 554; 555; NONEON-NOSVE-LABEL: sdiv_v8i16: 556; NONEON-NOSVE: // %bb.0: 557; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 558; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 559; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 560; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 561; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 562; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 563; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 564; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 565; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 566; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 567; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 568; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 569; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 570; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 571; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 572; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 573; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 574; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 575; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 576; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 577; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 578; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 579; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 580; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 581; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 582; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 583; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 584; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 585; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 586; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 587; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 588; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 589; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 590; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 591; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 592; NONEON-NOSVE-NEXT: add sp, sp, #48 593; NONEON-NOSVE-NEXT: ret 594 %res = sdiv <8 x i16> %op1, %op2 595 ret <8 x i16> %res 596} 597 598define void @sdiv_v16i16(ptr %a, ptr %b) { 599; CHECK-LABEL: sdiv_v16i16: 600; CHECK: // %bb.0: 601; CHECK-NEXT: ldp q4, q1, [x1] 602; CHECK-NEXT: ptrue p0.s, vl4 603; CHECK-NEXT: ldr q0, [x0, #16] 604; CHECK-NEXT: sunpklo z2.s, z1.h 605; CHECK-NEXT: sunpklo z3.s, z0.h 606; CHECK-NEXT: sunpklo z5.s, z4.h 607; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 608; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 609; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 610; CHECK-NEXT: sdivr z2.s, p0/m, z2.s, z3.s 611; CHECK-NEXT: ldr q3, [x0] 612; CHECK-NEXT: sunpklo z4.s, z4.h 613; CHECK-NEXT: sunpklo z1.s, z1.h 614; CHECK-NEXT: sunpklo z0.s, z0.h 615; CHECK-NEXT: sunpklo z6.s, z3.h 616; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 617; CHECK-NEXT: sunpklo z3.s, z3.h 618; CHECK-NEXT: sdivr z5.s, p0/m, z5.s, z6.s 619; CHECK-NEXT: sdiv z3.s, p0/m, z3.s, z4.s 620; CHECK-NEXT: uzp1 z4.h, z5.h, z5.h 621; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 622; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 623; CHECK-NEXT: ptrue p0.h, vl4 624; CHECK-NEXT: uzp1 z5.h, z3.h, z3.h 625; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 626; CHECK-NEXT: splice z0.h, p0, { z4.h, z5.h } 627; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h } 628; CHECK-NEXT: stp q0, q1, [x0] 629; CHECK-NEXT: ret 630; 631; NONEON-NOSVE-LABEL: sdiv_v16i16: 632; NONEON-NOSVE: // %bb.0: 633; NONEON-NOSVE-NEXT: sub sp, sp, #96 634; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 635; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 636; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 637; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 638; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 639; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62] 640; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 641; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 642; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44] 643; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 644; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60] 645; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 646; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 647; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 648; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58] 649; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 650; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40] 651; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 652; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56] 653; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 654; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38] 655; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 656; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54] 657; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 658; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36] 659; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 660; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52] 661; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 662; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34] 663; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 664; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50] 665; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 666; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32] 667; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 668; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48] 669; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 670; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 671; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 672; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 673; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 674; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 675; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 676; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 677; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 678; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 679; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 680; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 681; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 682; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 683; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 684; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 685; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 686; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 687; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 688; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 689; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 690; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 691; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 692; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 693; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 694; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 695; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 696; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 697; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 698; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 699; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 700; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 701; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 702; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 703; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 704; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 705; NONEON-NOSVE-NEXT: add sp, sp, #96 706; NONEON-NOSVE-NEXT: ret 707 %op1 = load <16 x i16>, ptr %a 708 %op2 = load <16 x i16>, ptr %b 709 %res = sdiv <16 x i16> %op1, %op2 710 store <16 x i16> %res, ptr %a 711 ret void 712} 713 714define <2 x i32> @sdiv_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 715; CHECK-LABEL: sdiv_v2i32: 716; CHECK: // %bb.0: 717; CHECK-NEXT: ptrue p0.s, vl2 718; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 719; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 720; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 721; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 722; CHECK-NEXT: ret 723; 724; NONEON-NOSVE-LABEL: sdiv_v2i32: 725; NONEON-NOSVE: // %bb.0: 726; NONEON-NOSVE-NEXT: sub sp, sp, #32 727; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 728; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 729; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 730; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 731; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 732; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 733; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 734; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 735; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 736; NONEON-NOSVE-NEXT: add sp, sp, #32 737; NONEON-NOSVE-NEXT: ret 738 %res = sdiv <2 x i32> %op1, %op2 739 ret <2 x i32> %res 740} 741 742define <4 x i32> @sdiv_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 743; CHECK-LABEL: sdiv_v4i32: 744; CHECK: // %bb.0: 745; CHECK-NEXT: ptrue p0.s, vl4 746; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 747; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 748; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s 749; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 750; CHECK-NEXT: ret 751; 752; NONEON-NOSVE-LABEL: sdiv_v4i32: 753; NONEON-NOSVE: // %bb.0: 754; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 755; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 756; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 757; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 758; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 759; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 760; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 761; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 762; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 763; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 764; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 765; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 766; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 767; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 768; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 769; NONEON-NOSVE-NEXT: add sp, sp, #48 770; NONEON-NOSVE-NEXT: ret 771 %res = sdiv <4 x i32> %op1, %op2 772 ret <4 x i32> %res 773} 774 775define void @sdiv_v8i32(ptr %a, ptr %b) { 776; CHECK-LABEL: sdiv_v8i32: 777; CHECK: // %bb.0: 778; CHECK-NEXT: ldp q0, q3, [x1] 779; CHECK-NEXT: ptrue p0.s, vl4 780; CHECK-NEXT: ldp q1, q2, [x0] 781; CHECK-NEXT: sdivr z0.s, p0/m, z0.s, z1.s 782; CHECK-NEXT: movprfx z1, z2 783; CHECK-NEXT: sdiv z1.s, p0/m, z1.s, z3.s 784; CHECK-NEXT: stp q0, q1, [x0] 785; CHECK-NEXT: ret 786; 787; NONEON-NOSVE-LABEL: sdiv_v8i32: 788; NONEON-NOSVE: // %bb.0: 789; NONEON-NOSVE-NEXT: sub sp, sp, #96 790; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 791; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 792; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 793; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 794; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 795; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 796; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 797; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 798; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 799; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 800; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 801; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 802; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 803; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 804; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 805; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 806; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 807; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 808; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 809; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 810; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 811; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 812; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 813; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 814; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 815; NONEON-NOSVE-NEXT: sdiv w11, w10, w8 816; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 817; NONEON-NOSVE-NEXT: sdiv w8, w9, w8 818; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 819; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 820; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 821; NONEON-NOSVE-NEXT: add sp, sp, #96 822; NONEON-NOSVE-NEXT: ret 823 %op1 = load <8 x i32>, ptr %a 824 %op2 = load <8 x i32>, ptr %b 825 %res = sdiv <8 x i32> %op1, %op2 826 store <8 x i32> %res, ptr %a 827 ret void 828} 829 830define <1 x i64> @sdiv_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 831; CHECK-LABEL: sdiv_v1i64: 832; CHECK: // %bb.0: 833; CHECK-NEXT: ptrue p0.d, vl1 834; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 835; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 836; CHECK-NEXT: sdiv z0.d, p0/m, z0.d, z1.d 837; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 838; CHECK-NEXT: ret 839; 840; NONEON-NOSVE-LABEL: sdiv_v1i64: 841; NONEON-NOSVE: // %bb.0: 842; NONEON-NOSVE-NEXT: sub sp, sp, #16 843; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 844; NONEON-NOSVE-NEXT: fmov x8, d1 845; NONEON-NOSVE-NEXT: fmov x9, d0 846; NONEON-NOSVE-NEXT: sdiv x8, x9, x8 847; NONEON-NOSVE-NEXT: str x8, [sp, #8] 848; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 849; NONEON-NOSVE-NEXT: add sp, sp, #16 850; NONEON-NOSVE-NEXT: ret 851 %res = sdiv <1 x i64> %op1, %op2 852 ret <1 x i64> %res 853} 854 855define <2 x i64> @sdiv_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 856; CHECK-LABEL: sdiv_v2i64: 857; CHECK: // %bb.0: 858; CHECK-NEXT: ptrue p0.d, vl2 859; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 860; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 861; CHECK-NEXT: sdiv z0.d, p0/m, z0.d, z1.d 862; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 863; CHECK-NEXT: ret 864; 865; NONEON-NOSVE-LABEL: sdiv_v2i64: 866; NONEON-NOSVE: // %bb.0: 867; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 868; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 869; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 870; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 871; NONEON-NOSVE-NEXT: sdiv x11, x10, x8 872; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 873; NONEON-NOSVE-NEXT: sdiv x8, x9, x8 874; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 875; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 876; NONEON-NOSVE-NEXT: add sp, sp, #48 877; NONEON-NOSVE-NEXT: ret 878 %res = sdiv <2 x i64> %op1, %op2 879 ret <2 x i64> %res 880} 881 882define void @sdiv_v4i64(ptr %a, ptr %b) { 883; CHECK-LABEL: sdiv_v4i64: 884; CHECK: // %bb.0: 885; CHECK-NEXT: ldp q0, q3, [x1] 886; CHECK-NEXT: ptrue p0.d, vl2 887; CHECK-NEXT: ldp q1, q2, [x0] 888; CHECK-NEXT: sdivr z0.d, p0/m, z0.d, z1.d 889; CHECK-NEXT: movprfx z1, z2 890; CHECK-NEXT: sdiv z1.d, p0/m, z1.d, z3.d 891; CHECK-NEXT: stp q0, q1, [x0] 892; CHECK-NEXT: ret 893; 894; NONEON-NOSVE-LABEL: sdiv_v4i64: 895; NONEON-NOSVE: // %bb.0: 896; NONEON-NOSVE-NEXT: sub sp, sp, #96 897; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 898; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 899; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 900; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 901; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 902; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 903; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 904; NONEON-NOSVE-NEXT: sdiv x11, x10, x8 905; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 906; NONEON-NOSVE-NEXT: sdiv x8, x9, x8 907; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 908; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 909; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 910; NONEON-NOSVE-NEXT: sdiv x11, x10, x8 911; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 912; NONEON-NOSVE-NEXT: sdiv x8, x9, x8 913; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 914; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 915; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 916; NONEON-NOSVE-NEXT: add sp, sp, #96 917; NONEON-NOSVE-NEXT: ret 918 %op1 = load <4 x i64>, ptr %a 919 %op2 = load <4 x i64>, ptr %b 920 %res = sdiv <4 x i64> %op1, %op2 921 store <4 x i64> %res, ptr %a 922 ret void 923} 924 925; UDIV 926 927define <4 x i8> @udiv_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 928; CHECK-LABEL: udiv_v4i8: 929; CHECK: // %bb.0: 930; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 931; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 932; CHECK-NEXT: ptrue p0.s, vl4 933; CHECK-NEXT: and z0.h, z0.h, #0xff 934; CHECK-NEXT: and z1.h, z1.h, #0xff 935; CHECK-NEXT: uunpklo z1.s, z1.h 936; CHECK-NEXT: uunpklo z0.s, z0.h 937; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 938; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 939; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 940; CHECK-NEXT: ret 941; 942; NONEON-NOSVE-LABEL: udiv_v4i8: 943; NONEON-NOSVE: // %bb.0: 944; NONEON-NOSVE-NEXT: sub sp, sp, #32 945; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 946; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 947; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 948; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 949; NONEON-NOSVE-NEXT: ldrb w10, [sp, #12] 950; NONEON-NOSVE-NEXT: ldrb w11, [sp, #10] 951; NONEON-NOSVE-NEXT: ldrb w12, [sp, #8] 952; NONEON-NOSVE-NEXT: udiv w8, w9, w8 953; NONEON-NOSVE-NEXT: ldrb w9, [sp, #20] 954; NONEON-NOSVE-NEXT: udiv w9, w10, w9 955; NONEON-NOSVE-NEXT: ldrb w10, [sp, #18] 956; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 957; NONEON-NOSVE-NEXT: udiv w10, w11, w10 958; NONEON-NOSVE-NEXT: ldrb w11, [sp, #16] 959; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 960; NONEON-NOSVE-NEXT: udiv w11, w12, w11 961; NONEON-NOSVE-NEXT: strh w10, [sp, #26] 962; NONEON-NOSVE-NEXT: strh w11, [sp, #24] 963; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 964; NONEON-NOSVE-NEXT: add sp, sp, #32 965; NONEON-NOSVE-NEXT: ret 966 %res = udiv <4 x i8> %op1, %op2 967 ret <4 x i8> %res 968} 969 970define <8 x i8> @udiv_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 971; CHECK-LABEL: udiv_v8i8: 972; CHECK: // %bb.0: 973; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 974; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 975; CHECK-NEXT: ptrue p0.s, vl4 976; CHECK-NEXT: uunpklo z1.h, z1.b 977; CHECK-NEXT: uunpklo z0.h, z0.b 978; CHECK-NEXT: uunpklo z2.s, z1.h 979; CHECK-NEXT: uunpklo z3.s, z0.h 980; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 981; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 982; CHECK-NEXT: uunpklo z1.s, z1.h 983; CHECK-NEXT: uunpklo z0.s, z0.h 984; CHECK-NEXT: udivr z2.s, p0/m, z2.s, z3.s 985; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 986; CHECK-NEXT: ptrue p0.h, vl4 987; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 988; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 989; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h } 990; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b 991; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 992; CHECK-NEXT: ret 993; 994; NONEON-NOSVE-LABEL: udiv_v8i8: 995; NONEON-NOSVE: // %bb.0: 996; NONEON-NOSVE-NEXT: sub sp, sp, #32 997; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 998; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 999; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1000; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1001; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1002; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1003; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 1004; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1005; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1006; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1007; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 1008; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1009; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1010; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1011; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 1012; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1013; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1014; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1015; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 1016; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1017; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1018; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1019; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 1020; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1021; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1022; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1023; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 1024; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1025; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1026; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1027; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 1028; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1029; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1030; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 1031; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1032; NONEON-NOSVE-NEXT: add sp, sp, #32 1033; NONEON-NOSVE-NEXT: ret 1034 %res = udiv <8 x i8> %op1, %op2 1035 ret <8 x i8> %res 1036} 1037 1038define <16 x i8> @udiv_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 1039; CHECK-LABEL: udiv_v16i8: 1040; CHECK: // %bb.0: 1041; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1042; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1043; CHECK-NEXT: uunpklo z2.h, z1.b 1044; CHECK-NEXT: uunpklo z3.h, z0.b 1045; CHECK-NEXT: ptrue p0.s, vl4 1046; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1047; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1048; CHECK-NEXT: uunpklo z4.s, z2.h 1049; CHECK-NEXT: uunpklo z5.s, z3.h 1050; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1051; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1052; CHECK-NEXT: uunpklo z1.h, z1.b 1053; CHECK-NEXT: uunpklo z0.h, z0.b 1054; CHECK-NEXT: uunpklo z2.s, z2.h 1055; CHECK-NEXT: uunpklo z3.s, z3.h 1056; CHECK-NEXT: udivr z4.s, p0/m, z4.s, z5.s 1057; CHECK-NEXT: uunpklo z5.s, z0.h 1058; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1059; CHECK-NEXT: uunpklo z0.s, z0.h 1060; CHECK-NEXT: udivr z2.s, p0/m, z2.s, z3.s 1061; CHECK-NEXT: uunpklo z3.s, z1.h 1062; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1063; CHECK-NEXT: uunpklo z1.s, z1.h 1064; CHECK-NEXT: udivr z3.s, p0/m, z3.s, z5.s 1065; CHECK-NEXT: uzp1 z4.h, z4.h, z4.h 1066; CHECK-NEXT: uzp1 z5.h, z2.h, z2.h 1067; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1068; CHECK-NEXT: ptrue p0.h, vl4 1069; CHECK-NEXT: uzp1 z1.h, z3.h, z3.h 1070; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 1071; CHECK-NEXT: splice z0.h, p0, { z4.h, z5.h } 1072; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h } 1073; CHECK-NEXT: ptrue p0.b, vl8 1074; CHECK-NEXT: uzp1 z2.b, z0.b, z0.b 1075; CHECK-NEXT: uzp1 z3.b, z1.b, z1.b 1076; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b } 1077; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1078; CHECK-NEXT: ret 1079; 1080; NONEON-NOSVE-LABEL: udiv_v16i8: 1081; NONEON-NOSVE: // %bb.0: 1082; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1083; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1084; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1085; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1086; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1087; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1088; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 1089; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1090; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1091; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1092; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 1093; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1094; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1095; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1096; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 1097; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1098; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1099; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1100; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 1101; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1102; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1103; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1104; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 1105; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1106; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1107; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1108; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 1109; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1110; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1111; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1112; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 1113; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1114; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1115; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1116; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 1117; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1118; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1119; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1120; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 1121; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1122; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1123; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1124; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 1125; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1126; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1127; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1128; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 1129; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1130; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1131; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1132; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 1133; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1134; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1135; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1136; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 1137; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1138; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1139; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1140; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 1141; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1142; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1143; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1144; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 1145; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1146; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1147; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 1148; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1149; NONEON-NOSVE-NEXT: add sp, sp, #48 1150; NONEON-NOSVE-NEXT: ret 1151 %res = udiv <16 x i8> %op1, %op2 1152 ret <16 x i8> %res 1153} 1154 1155define void @udiv_v32i8(ptr %a, ptr %b) { 1156; CHECK-LABEL: udiv_v32i8: 1157; CHECK: // %bb.0: 1158; CHECK-NEXT: ldp q6, q3, [x1] 1159; CHECK-NEXT: ptrue p0.s, vl4 1160; CHECK-NEXT: ldr q2, [x0, #16] 1161; CHECK-NEXT: uunpklo z1.h, z3.b 1162; CHECK-NEXT: uunpklo z4.h, z2.b 1163; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1164; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1165; CHECK-NEXT: uunpklo z7.h, z6.b 1166; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 1167; CHECK-NEXT: uunpklo z3.h, z3.b 1168; CHECK-NEXT: uunpklo z0.s, z1.h 1169; CHECK-NEXT: uunpklo z5.s, z4.h 1170; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1171; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 1172; CHECK-NEXT: uunpklo z17.s, z7.h 1173; CHECK-NEXT: ext z7.b, z7.b, z7.b, #8 1174; CHECK-NEXT: uunpklo z6.h, z6.b 1175; CHECK-NEXT: uunpklo z1.s, z1.h 1176; CHECK-NEXT: uunpklo z4.s, z4.h 1177; CHECK-NEXT: uunpklo z7.s, z7.h 1178; CHECK-NEXT: udivr z0.s, p0/m, z0.s, z5.s 1179; CHECK-NEXT: udivr z1.s, p0/m, z1.s, z4.s 1180; CHECK-NEXT: uunpklo z4.h, z2.b 1181; CHECK-NEXT: uunpklo z2.s, z3.h 1182; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1183; CHECK-NEXT: uunpklo z5.s, z4.h 1184; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 1185; CHECK-NEXT: uunpklo z3.s, z3.h 1186; CHECK-NEXT: uunpklo z4.s, z4.h 1187; CHECK-NEXT: udivr z2.s, p0/m, z2.s, z5.s 1188; CHECK-NEXT: ldr q5, [x0] 1189; CHECK-NEXT: uunpklo z16.h, z5.b 1190; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 1191; CHECK-NEXT: uunpklo z5.h, z5.b 1192; CHECK-NEXT: uunpklo z18.s, z16.h 1193; CHECK-NEXT: ext z16.b, z16.b, z16.b, #8 1194; CHECK-NEXT: uunpklo z16.s, z16.h 1195; CHECK-NEXT: udivr z17.s, p0/m, z17.s, z18.s 1196; CHECK-NEXT: uunpklo z18.s, z5.h 1197; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 1198; CHECK-NEXT: uunpklo z5.s, z5.h 1199; CHECK-NEXT: udivr z7.s, p0/m, z7.s, z16.s 1200; CHECK-NEXT: uunpklo z16.s, z6.h 1201; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 1202; CHECK-NEXT: uunpklo z6.s, z6.h 1203; CHECK-NEXT: uzp1 z20.h, z17.h, z17.h 1204; CHECK-NEXT: udivr z16.s, p0/m, z16.s, z18.s 1205; CHECK-NEXT: uzp1 z18.h, z0.h, z0.h 1206; CHECK-NEXT: uzp1 z19.h, z1.h, z1.h 1207; CHECK-NEXT: uzp1 z21.h, z7.h, z7.h 1208; CHECK-NEXT: udiv z5.s, p0/m, z5.s, z6.s 1209; CHECK-NEXT: uzp1 z0.h, z16.h, z16.h 1210; CHECK-NEXT: udivr z3.s, p0/m, z3.s, z4.s 1211; CHECK-NEXT: ptrue p0.h, vl4 1212; CHECK-NEXT: uzp1 z1.h, z5.h, z5.h 1213; CHECK-NEXT: uzp1 z4.h, z2.h, z2.h 1214; CHECK-NEXT: splice z2.h, p0, { z20.h, z21.h } 1215; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h } 1216; CHECK-NEXT: uzp1 z5.h, z3.h, z3.h 1217; CHECK-NEXT: splice z3.h, p0, { z18.h, z19.h } 1218; CHECK-NEXT: splice z1.h, p0, { z4.h, z5.h } 1219; CHECK-NEXT: uzp1 z4.b, z2.b, z2.b 1220; CHECK-NEXT: ptrue p0.b, vl8 1221; CHECK-NEXT: uzp1 z2.b, z3.b, z3.b 1222; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b 1223; CHECK-NEXT: uzp1 z3.b, z1.b, z1.b 1224; CHECK-NEXT: splice z0.b, p0, { z4.b, z5.b } 1225; CHECK-NEXT: splice z1.b, p0, { z2.b, z3.b } 1226; CHECK-NEXT: stp q0, q1, [x0] 1227; CHECK-NEXT: ret 1228; 1229; NONEON-NOSVE-LABEL: udiv_v32i8: 1230; NONEON-NOSVE: // %bb.0: 1231; NONEON-NOSVE-NEXT: sub sp, sp, #96 1232; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1233; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1234; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1235; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1236; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1237; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1238; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1239; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1240; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1241; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1242; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1243; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1244; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1245; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1246; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1247; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1248; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1249; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1250; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1251; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1252; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1253; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1254; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1255; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1256; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1257; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1258; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1259; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1260; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1261; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1262; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1263; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1264; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1265; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1266; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1267; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1268; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1269; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1270; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1271; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1272; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1273; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1274; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1275; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1276; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1277; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1278; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1279; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1280; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1281; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1282; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1283; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1284; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1285; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1286; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1287; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1288; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1289; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1290; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1291; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1292; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1293; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1294; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1295; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1296; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1297; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1298; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1299; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1300; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1301; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1302; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1303; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1304; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1305; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1306; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1307; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1308; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1309; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1310; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1311; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1312; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1313; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1314; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1315; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1316; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1317; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1318; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1319; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1320; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1321; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1322; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1323; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1324; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1325; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1326; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1327; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1328; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1329; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1330; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1331; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1332; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1333; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1334; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1335; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1336; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1337; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1338; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1339; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1340; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1341; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1342; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1343; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1344; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1345; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1346; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1347; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1348; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1349; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1350; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1351; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1352; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1353; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1354; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1355; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1356; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1357; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1358; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1359; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1360; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1361; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1362; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1363; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1364; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1365; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1366; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1367; NONEON-NOSVE-NEXT: add sp, sp, #96 1368; NONEON-NOSVE-NEXT: ret 1369 %op1 = load <32 x i8>, ptr %a 1370 %op2 = load <32 x i8>, ptr %b 1371 %res = udiv <32 x i8> %op1, %op2 1372 store <32 x i8> %res, ptr %a 1373 ret void 1374} 1375 1376define <2 x i16> @udiv_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 1377; CHECK-LABEL: udiv_v2i16: 1378; CHECK: // %bb.0: 1379; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1380; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1381; CHECK-NEXT: ptrue p0.s, vl2 1382; CHECK-NEXT: and z1.s, z1.s, #0xffff 1383; CHECK-NEXT: and z0.s, z0.s, #0xffff 1384; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1385; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1386; CHECK-NEXT: ret 1387; 1388; NONEON-NOSVE-LABEL: udiv_v2i16: 1389; NONEON-NOSVE: // %bb.0: 1390; NONEON-NOSVE-NEXT: sub sp, sp, #32 1391; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1392; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1393; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1394; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1395; NONEON-NOSVE-NEXT: ldrh w10, [sp, #8] 1396; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1397; NONEON-NOSVE-NEXT: ldrh w9, [sp, #16] 1398; NONEON-NOSVE-NEXT: udiv w9, w10, w9 1399; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24] 1400; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1401; NONEON-NOSVE-NEXT: add sp, sp, #32 1402; NONEON-NOSVE-NEXT: ret 1403 %res = udiv <2 x i16> %op1, %op2 1404 ret <2 x i16> %res 1405} 1406 1407define <4 x i16> @udiv_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1408; CHECK-LABEL: udiv_v4i16: 1409; CHECK: // %bb.0: 1410; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1411; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1412; CHECK-NEXT: ptrue p0.s, vl4 1413; CHECK-NEXT: uunpklo z1.s, z1.h 1414; CHECK-NEXT: uunpklo z0.s, z0.h 1415; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1416; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 1417; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1418; CHECK-NEXT: ret 1419; 1420; NONEON-NOSVE-LABEL: udiv_v4i16: 1421; NONEON-NOSVE: // %bb.0: 1422; NONEON-NOSVE-NEXT: sub sp, sp, #32 1423; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1424; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1425; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1426; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1427; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1428; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1429; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1430; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1431; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1432; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1433; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1434; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1435; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1436; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1437; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1438; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1439; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1440; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1441; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1442; NONEON-NOSVE-NEXT: add sp, sp, #32 1443; NONEON-NOSVE-NEXT: ret 1444 %res = udiv <4 x i16> %op1, %op2 1445 ret <4 x i16> %res 1446} 1447 1448define <8 x i16> @udiv_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1449; CHECK-LABEL: udiv_v8i16: 1450; CHECK: // %bb.0: 1451; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1452; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1453; CHECK-NEXT: uunpklo z2.s, z1.h 1454; CHECK-NEXT: uunpklo z3.s, z0.h 1455; CHECK-NEXT: ptrue p0.s, vl4 1456; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1457; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1458; CHECK-NEXT: uunpklo z1.s, z1.h 1459; CHECK-NEXT: uunpklo z0.s, z0.h 1460; CHECK-NEXT: udivr z2.s, p0/m, z2.s, z3.s 1461; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1462; CHECK-NEXT: ptrue p0.h, vl4 1463; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 1464; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 1465; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h } 1466; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1467; CHECK-NEXT: ret 1468; 1469; NONEON-NOSVE-LABEL: udiv_v8i16: 1470; NONEON-NOSVE: // %bb.0: 1471; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1472; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1473; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1474; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1475; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1476; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1477; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1478; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1479; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1480; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1481; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1482; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1483; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1484; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1485; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1486; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1487; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1488; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1489; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1490; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1491; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1492; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1493; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1494; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1495; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1496; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1497; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1498; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1499; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1500; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1501; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1502; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1503; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1504; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1505; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1506; NONEON-NOSVE-NEXT: add sp, sp, #48 1507; NONEON-NOSVE-NEXT: ret 1508 %res = udiv <8 x i16> %op1, %op2 1509 ret <8 x i16> %res 1510} 1511 1512define void @udiv_v16i16(ptr %a, ptr %b) { 1513; CHECK-LABEL: udiv_v16i16: 1514; CHECK: // %bb.0: 1515; CHECK-NEXT: ldp q4, q1, [x1] 1516; CHECK-NEXT: ptrue p0.s, vl4 1517; CHECK-NEXT: ldr q0, [x0, #16] 1518; CHECK-NEXT: uunpklo z2.s, z1.h 1519; CHECK-NEXT: uunpklo z3.s, z0.h 1520; CHECK-NEXT: uunpklo z5.s, z4.h 1521; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 1522; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1523; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1524; CHECK-NEXT: udivr z2.s, p0/m, z2.s, z3.s 1525; CHECK-NEXT: ldr q3, [x0] 1526; CHECK-NEXT: uunpklo z4.s, z4.h 1527; CHECK-NEXT: uunpklo z1.s, z1.h 1528; CHECK-NEXT: uunpklo z0.s, z0.h 1529; CHECK-NEXT: uunpklo z6.s, z3.h 1530; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1531; CHECK-NEXT: uunpklo z3.s, z3.h 1532; CHECK-NEXT: udivr z5.s, p0/m, z5.s, z6.s 1533; CHECK-NEXT: udiv z3.s, p0/m, z3.s, z4.s 1534; CHECK-NEXT: uzp1 z4.h, z5.h, z5.h 1535; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1536; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h 1537; CHECK-NEXT: ptrue p0.h, vl4 1538; CHECK-NEXT: uzp1 z5.h, z3.h, z3.h 1539; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 1540; CHECK-NEXT: splice z0.h, p0, { z4.h, z5.h } 1541; CHECK-NEXT: splice z1.h, p0, { z1.h, z2.h } 1542; CHECK-NEXT: stp q0, q1, [x0] 1543; CHECK-NEXT: ret 1544; 1545; NONEON-NOSVE-LABEL: udiv_v16i16: 1546; NONEON-NOSVE: // %bb.0: 1547; NONEON-NOSVE-NEXT: sub sp, sp, #96 1548; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1549; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1550; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1551; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1552; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1553; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 1554; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 1555; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1556; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 1557; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1558; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 1559; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1560; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 1561; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1562; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 1563; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1564; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 1565; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1566; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 1567; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1568; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 1569; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1570; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 1571; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1572; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 1573; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1574; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 1575; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1576; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 1577; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1578; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 1579; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1580; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 1581; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1582; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 1583; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1584; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1585; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1586; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1587; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1588; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1589; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1590; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1591; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1592; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1593; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1594; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1595; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1596; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1597; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1598; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1599; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1600; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1601; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1602; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1603; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1604; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1605; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1606; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1607; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1608; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1609; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1610; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1611; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1612; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1613; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1614; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1615; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1616; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1617; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1618; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1619; NONEON-NOSVE-NEXT: add sp, sp, #96 1620; NONEON-NOSVE-NEXT: ret 1621 %op1 = load <16 x i16>, ptr %a 1622 %op2 = load <16 x i16>, ptr %b 1623 %res = udiv <16 x i16> %op1, %op2 1624 store <16 x i16> %res, ptr %a 1625 ret void 1626} 1627 1628define <2 x i32> @udiv_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1629; CHECK-LABEL: udiv_v2i32: 1630; CHECK: // %bb.0: 1631; CHECK-NEXT: ptrue p0.s, vl2 1632; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1633; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1634; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1635; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1636; CHECK-NEXT: ret 1637; 1638; NONEON-NOSVE-LABEL: udiv_v2i32: 1639; NONEON-NOSVE: // %bb.0: 1640; NONEON-NOSVE-NEXT: sub sp, sp, #32 1641; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1642; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1643; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1644; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1645; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1646; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1647; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1648; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1649; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1650; NONEON-NOSVE-NEXT: add sp, sp, #32 1651; NONEON-NOSVE-NEXT: ret 1652 %res = udiv <2 x i32> %op1, %op2 1653 ret <2 x i32> %res 1654} 1655 1656define <4 x i32> @udiv_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1657; CHECK-LABEL: udiv_v4i32: 1658; CHECK: // %bb.0: 1659; CHECK-NEXT: ptrue p0.s, vl4 1660; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1661; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1662; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s 1663; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1664; CHECK-NEXT: ret 1665; 1666; NONEON-NOSVE-LABEL: udiv_v4i32: 1667; NONEON-NOSVE: // %bb.0: 1668; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1669; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1670; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1671; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1672; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1673; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1674; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1675; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1676; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 1677; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1678; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1679; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1680; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1681; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 1682; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1683; NONEON-NOSVE-NEXT: add sp, sp, #48 1684; NONEON-NOSVE-NEXT: ret 1685 %res = udiv <4 x i32> %op1, %op2 1686 ret <4 x i32> %res 1687} 1688 1689define void @udiv_v8i32(ptr %a, ptr %b) { 1690; CHECK-LABEL: udiv_v8i32: 1691; CHECK: // %bb.0: 1692; CHECK-NEXT: ldp q0, q3, [x1] 1693; CHECK-NEXT: ptrue p0.s, vl4 1694; CHECK-NEXT: ldp q1, q2, [x0] 1695; CHECK-NEXT: udivr z0.s, p0/m, z0.s, z1.s 1696; CHECK-NEXT: movprfx z1, z2 1697; CHECK-NEXT: udiv z1.s, p0/m, z1.s, z3.s 1698; CHECK-NEXT: stp q0, q1, [x0] 1699; CHECK-NEXT: ret 1700; 1701; NONEON-NOSVE-LABEL: udiv_v8i32: 1702; NONEON-NOSVE: // %bb.0: 1703; NONEON-NOSVE-NEXT: sub sp, sp, #96 1704; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1705; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1706; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1707; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1708; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1709; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1710; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1711; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1712; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1713; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1714; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1715; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 1716; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1717; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1718; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1719; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1720; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1721; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 1722; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1723; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1724; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1725; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1726; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1727; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 1728; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1729; NONEON-NOSVE-NEXT: udiv w11, w10, w8 1730; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1731; NONEON-NOSVE-NEXT: udiv w8, w9, w8 1732; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 1733; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1734; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1735; NONEON-NOSVE-NEXT: add sp, sp, #96 1736; NONEON-NOSVE-NEXT: ret 1737 %op1 = load <8 x i32>, ptr %a 1738 %op2 = load <8 x i32>, ptr %b 1739 %res = udiv <8 x i32> %op1, %op2 1740 store <8 x i32> %res, ptr %a 1741 ret void 1742} 1743 1744define <1 x i64> @udiv_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1745; CHECK-LABEL: udiv_v1i64: 1746; CHECK: // %bb.0: 1747; CHECK-NEXT: ptrue p0.d, vl1 1748; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1749; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1750; CHECK-NEXT: udiv z0.d, p0/m, z0.d, z1.d 1751; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1752; CHECK-NEXT: ret 1753; 1754; NONEON-NOSVE-LABEL: udiv_v1i64: 1755; NONEON-NOSVE: // %bb.0: 1756; NONEON-NOSVE-NEXT: sub sp, sp, #16 1757; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1758; NONEON-NOSVE-NEXT: fmov x8, d1 1759; NONEON-NOSVE-NEXT: fmov x9, d0 1760; NONEON-NOSVE-NEXT: udiv x8, x9, x8 1761; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1762; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1763; NONEON-NOSVE-NEXT: add sp, sp, #16 1764; NONEON-NOSVE-NEXT: ret 1765 %res = udiv <1 x i64> %op1, %op2 1766 ret <1 x i64> %res 1767} 1768 1769define <2 x i64> @udiv_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 1770; CHECK-LABEL: udiv_v2i64: 1771; CHECK: // %bb.0: 1772; CHECK-NEXT: ptrue p0.d, vl2 1773; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1774; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1775; CHECK-NEXT: udiv z0.d, p0/m, z0.d, z1.d 1776; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1777; CHECK-NEXT: ret 1778; 1779; NONEON-NOSVE-LABEL: udiv_v2i64: 1780; NONEON-NOSVE: // %bb.0: 1781; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1782; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1783; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1784; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1785; NONEON-NOSVE-NEXT: udiv x11, x10, x8 1786; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1787; NONEON-NOSVE-NEXT: udiv x8, x9, x8 1788; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 1789; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1790; NONEON-NOSVE-NEXT: add sp, sp, #48 1791; NONEON-NOSVE-NEXT: ret 1792 %res = udiv <2 x i64> %op1, %op2 1793 ret <2 x i64> %res 1794} 1795 1796define void @udiv_v4i64(ptr %a, ptr %b) { 1797; CHECK-LABEL: udiv_v4i64: 1798; CHECK: // %bb.0: 1799; CHECK-NEXT: ldp q0, q3, [x1] 1800; CHECK-NEXT: ptrue p0.d, vl2 1801; CHECK-NEXT: ldp q1, q2, [x0] 1802; CHECK-NEXT: udivr z0.d, p0/m, z0.d, z1.d 1803; CHECK-NEXT: movprfx z1, z2 1804; CHECK-NEXT: udiv z1.d, p0/m, z1.d, z3.d 1805; CHECK-NEXT: stp q0, q1, [x0] 1806; CHECK-NEXT: ret 1807; 1808; NONEON-NOSVE-LABEL: udiv_v4i64: 1809; NONEON-NOSVE: // %bb.0: 1810; NONEON-NOSVE-NEXT: sub sp, sp, #96 1811; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1812; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1813; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1814; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1815; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1816; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 1817; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 1818; NONEON-NOSVE-NEXT: udiv x11, x10, x8 1819; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 1820; NONEON-NOSVE-NEXT: udiv x8, x9, x8 1821; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1822; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 1823; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1824; NONEON-NOSVE-NEXT: udiv x11, x10, x8 1825; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1826; NONEON-NOSVE-NEXT: udiv x8, x9, x8 1827; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 1828; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1829; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1830; NONEON-NOSVE-NEXT: add sp, sp, #96 1831; NONEON-NOSVE-NEXT: ret 1832 %op1 = load <4 x i64>, ptr %a 1833 %op2 = load <4 x i64>, ptr %b 1834 %res = udiv <4 x i64> %op1, %op2 1835 store <4 x i64> %res, ptr %a 1836 ret void 1837} 1838 1839define void @udiv_constantsplat_v8i32(ptr %a) { 1840; CHECK-LABEL: udiv_constantsplat_v8i32: 1841; CHECK: // %bb.0: 1842; CHECK-NEXT: mov w8, #8969 // =0x2309 1843; CHECK-NEXT: ldp q1, q2, [x0] 1844; CHECK-NEXT: movk w8, #22765, lsl #16 1845; CHECK-NEXT: mov z0.s, w8 1846; CHECK-NEXT: umulh z3.s, z1.s, z0.s 1847; CHECK-NEXT: umulh z0.s, z2.s, z0.s 1848; CHECK-NEXT: sub z1.s, z1.s, z3.s 1849; CHECK-NEXT: sub z2.s, z2.s, z0.s 1850; CHECK-NEXT: usra z3.s, z1.s, #1 1851; CHECK-NEXT: usra z0.s, z2.s, #1 1852; CHECK-NEXT: lsr z1.s, z3.s, #6 1853; CHECK-NEXT: lsr z0.s, z0.s, #6 1854; CHECK-NEXT: stp q1, q0, [x0] 1855; CHECK-NEXT: ret 1856; 1857; NONEON-NOSVE-LABEL: udiv_constantsplat_v8i32: 1858; NONEON-NOSVE: // %bb.0: 1859; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1860; NONEON-NOSVE-NEXT: mov w8, #8969 // =0x2309 1861; NONEON-NOSVE-NEXT: movk w8, #22765, lsl #16 1862; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1863; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1864; NONEON-NOSVE-NEXT: ldr w9, [sp, #28] 1865; NONEON-NOSVE-NEXT: umull x10, w9, w8 1866; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1867; NONEON-NOSVE-NEXT: sub w9, w9, w10 1868; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1869; NONEON-NOSVE-NEXT: lsr w11, w9, #6 1870; NONEON-NOSVE-NEXT: ldr w9, [sp, #24] 1871; NONEON-NOSVE-NEXT: umull x10, w9, w8 1872; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1873; NONEON-NOSVE-NEXT: sub w9, w9, w10 1874; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1875; NONEON-NOSVE-NEXT: lsr w9, w9, #6 1876; NONEON-NOSVE-NEXT: stp w9, w11, [sp, #56] 1877; NONEON-NOSVE-NEXT: ldr w9, [sp, #20] 1878; NONEON-NOSVE-NEXT: umull x10, w9, w8 1879; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1880; NONEON-NOSVE-NEXT: sub w9, w9, w10 1881; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1882; NONEON-NOSVE-NEXT: lsr w11, w9, #6 1883; NONEON-NOSVE-NEXT: ldr w9, [sp, #16] 1884; NONEON-NOSVE-NEXT: umull x10, w9, w8 1885; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1886; NONEON-NOSVE-NEXT: sub w9, w9, w10 1887; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1888; NONEON-NOSVE-NEXT: lsr w9, w9, #6 1889; NONEON-NOSVE-NEXT: stp w9, w11, [sp, #48] 1890; NONEON-NOSVE-NEXT: ldr w9, [sp, #12] 1891; NONEON-NOSVE-NEXT: umull x10, w9, w8 1892; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1893; NONEON-NOSVE-NEXT: sub w9, w9, w10 1894; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1895; NONEON-NOSVE-NEXT: lsr w11, w9, #6 1896; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] 1897; NONEON-NOSVE-NEXT: umull x10, w9, w8 1898; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1899; NONEON-NOSVE-NEXT: sub w9, w9, w10 1900; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1901; NONEON-NOSVE-NEXT: lsr w9, w9, #6 1902; NONEON-NOSVE-NEXT: stp w9, w11, [sp, #40] 1903; NONEON-NOSVE-NEXT: ldr w9, [sp, #4] 1904; NONEON-NOSVE-NEXT: umull x10, w9, w8 1905; NONEON-NOSVE-NEXT: lsr x10, x10, #32 1906; NONEON-NOSVE-NEXT: sub w9, w9, w10 1907; NONEON-NOSVE-NEXT: add w9, w10, w9, lsr #1 1908; NONEON-NOSVE-NEXT: lsr w11, w9, #6 1909; NONEON-NOSVE-NEXT: ldr w9, [sp] 1910; NONEON-NOSVE-NEXT: umull x8, w9, w8 1911; NONEON-NOSVE-NEXT: lsr x8, x8, #32 1912; NONEON-NOSVE-NEXT: sub w9, w9, w8 1913; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #1 1914; NONEON-NOSVE-NEXT: lsr w8, w8, #6 1915; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 1916; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1917; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1918; NONEON-NOSVE-NEXT: add sp, sp, #64 1919; NONEON-NOSVE-NEXT: ret 1920 %op1 = load <8 x i32>, ptr %a 1921 %res = udiv <8 x i32> %op1, <i32 95, i32 95, i32 95, i32 95, i32 95, i32 95, i32 95, i32 95> 1922 store <8 x i32> %res, ptr %a 1923 ret void 1924} 1925