1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s 3 4; Odd+Even divisors 5define <4 x i32> @test_srem_odd_even(<4 x i32> %X) nounwind { 6; CHECK-LABEL: test_srem_odd_even: 7; CHECK: // %bb.0: 8; CHECK-NEXT: adrp x8, .LCPI0_0 9; CHECK-NEXT: adrp x9, .LCPI0_1 10; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI0_0] 11; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI0_1] 12; CHECK-NEXT: adrp x8, .LCPI0_2 13; CHECK-NEXT: adrp x9, .LCPI0_3 14; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 15; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI0_2] 16; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI0_3] 17; CHECK-NEXT: adrp x8, .LCPI0_4 18; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 19; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 20; CHECK-NEXT: movi v2.4s, #1 21; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 22; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI0_4] 23; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 24; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 25; CHECK-NEXT: ret 26 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 25, i32 100> 27 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 28 %ret = zext <4 x i1> %cmp to <4 x i32> 29 ret <4 x i32> %ret 30} 31 32;==============================================================================; 33 34; One all-ones divisor in odd divisor 35define <4 x i32> @test_srem_odd_allones_eq(<4 x i32> %X) nounwind { 36; CHECK-LABEL: test_srem_odd_allones_eq: 37; CHECK: // %bb.0: 38; CHECK-NEXT: movi v1.16b, #153 39; CHECK-NEXT: mov w8, #52429 // =0xcccd 40; CHECK-NEXT: movk w8, #52428, lsl #16 41; CHECK-NEXT: dup v2.4s, w8 42; CHECK-NEXT: adrp x8, .LCPI1_0 43; CHECK-NEXT: fneg v1.4s, v1.4s 44; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 45; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI1_0] 46; CHECK-NEXT: movi v2.4s, #1 47; CHECK-NEXT: cmhs v0.4s, v0.4s, v1.4s 48; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 49; CHECK-NEXT: ret 50 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 4294967295, i32 5> 51 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 52 %ret = zext <4 x i1> %cmp to <4 x i32> 53 ret <4 x i32> %ret 54} 55define <4 x i32> @test_srem_odd_allones_ne(<4 x i32> %X) nounwind { 56; CHECK-LABEL: test_srem_odd_allones_ne: 57; CHECK: // %bb.0: 58; CHECK-NEXT: movi v1.16b, #153 59; CHECK-NEXT: mov w8, #52429 // =0xcccd 60; CHECK-NEXT: movk w8, #52428, lsl #16 61; CHECK-NEXT: dup v2.4s, w8 62; CHECK-NEXT: adrp x8, .LCPI2_0 63; CHECK-NEXT: fneg v1.4s, v1.4s 64; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 65; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI2_0] 66; CHECK-NEXT: movi v2.4s, #1 67; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s 68; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 69; CHECK-NEXT: ret 70 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 4294967295, i32 5> 71 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 72 %ret = zext <4 x i1> %cmp to <4 x i32> 73 ret <4 x i32> %ret 74} 75 76; One all-ones divisor in even divisor 77define <4 x i32> @test_srem_even_allones_eq(<4 x i32> %X) nounwind { 78; CHECK-LABEL: test_srem_even_allones_eq: 79; CHECK: // %bb.0: 80; CHECK-NEXT: mov w8, #28087 // =0x6db7 81; CHECK-NEXT: mov w9, #9362 // =0x2492 82; CHECK-NEXT: movk w8, #46811, lsl #16 83; CHECK-NEXT: movk w9, #4681, lsl #16 84; CHECK-NEXT: dup v1.4s, w8 85; CHECK-NEXT: dup v2.4s, w9 86; CHECK-NEXT: adrp x8, .LCPI3_0 87; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 88; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI3_0] 89; CHECK-NEXT: shl v0.4s, v2.4s, #31 90; CHECK-NEXT: usra v0.4s, v2.4s, #1 91; CHECK-NEXT: movi v2.4s, #1 92; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 93; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 94; CHECK-NEXT: ret 95 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 4294967295, i32 14> 96 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 97 %ret = zext <4 x i1> %cmp to <4 x i32> 98 ret <4 x i32> %ret 99} 100define <4 x i32> @test_srem_even_allones_ne(<4 x i32> %X) nounwind { 101; CHECK-LABEL: test_srem_even_allones_ne: 102; CHECK: // %bb.0: 103; CHECK-NEXT: mov w8, #28087 // =0x6db7 104; CHECK-NEXT: mov w9, #9362 // =0x2492 105; CHECK-NEXT: movk w8, #46811, lsl #16 106; CHECK-NEXT: movk w9, #4681, lsl #16 107; CHECK-NEXT: dup v1.4s, w8 108; CHECK-NEXT: dup v2.4s, w9 109; CHECK-NEXT: adrp x8, .LCPI4_0 110; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 111; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI4_0] 112; CHECK-NEXT: shl v0.4s, v2.4s, #31 113; CHECK-NEXT: usra v0.4s, v2.4s, #1 114; CHECK-NEXT: movi v2.4s, #1 115; CHECK-NEXT: cmhi v0.4s, v0.4s, v1.4s 116; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 117; CHECK-NEXT: ret 118 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 4294967295, i32 14> 119 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 120 %ret = zext <4 x i1> %cmp to <4 x i32> 121 ret <4 x i32> %ret 122} 123 124; One all-ones divisor in odd+even divisor 125define <4 x i32> @test_srem_odd_even_allones_eq(<4 x i32> %X) nounwind { 126; CHECK-LABEL: test_srem_odd_even_allones_eq: 127; CHECK: // %bb.0: 128; CHECK-NEXT: adrp x8, .LCPI5_0 129; CHECK-NEXT: adrp x9, .LCPI5_1 130; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI5_0] 131; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI5_1] 132; CHECK-NEXT: adrp x8, .LCPI5_2 133; CHECK-NEXT: adrp x9, .LCPI5_3 134; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 135; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI5_2] 136; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI5_3] 137; CHECK-NEXT: adrp x8, .LCPI5_4 138; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 139; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 140; CHECK-NEXT: movi v2.4s, #1 141; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 142; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI5_4] 143; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 144; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 145; CHECK-NEXT: ret 146 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 4294967295, i32 100> 147 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 148 %ret = zext <4 x i1> %cmp to <4 x i32> 149 ret <4 x i32> %ret 150} 151define <4 x i32> @test_srem_odd_even_allones_ne(<4 x i32> %X) nounwind { 152; CHECK-LABEL: test_srem_odd_even_allones_ne: 153; CHECK: // %bb.0: 154; CHECK-NEXT: adrp x8, .LCPI6_0 155; CHECK-NEXT: adrp x9, .LCPI6_1 156; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI6_0] 157; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI6_1] 158; CHECK-NEXT: adrp x8, .LCPI6_2 159; CHECK-NEXT: adrp x9, .LCPI6_3 160; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 161; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI6_2] 162; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI6_3] 163; CHECK-NEXT: adrp x8, .LCPI6_4 164; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 165; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 166; CHECK-NEXT: movi v2.4s, #1 167; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 168; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI6_4] 169; CHECK-NEXT: cmhi v0.4s, v0.4s, v1.4s 170; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 171; CHECK-NEXT: ret 172 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 4294967295, i32 100> 173 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 174 %ret = zext <4 x i1> %cmp to <4 x i32> 175 ret <4 x i32> %ret 176} 177 178;------------------------------------------------------------------------------; 179 180; One power-of-two divisor in odd divisor 181define <4 x i32> @test_srem_odd_poweroftwo(<4 x i32> %X) nounwind { 182; CHECK-LABEL: test_srem_odd_poweroftwo: 183; CHECK: // %bb.0: 184; CHECK-NEXT: adrp x8, .LCPI7_0 185; CHECK-NEXT: adrp x9, .LCPI7_1 186; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI7_0] 187; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI7_1] 188; CHECK-NEXT: adrp x8, .LCPI7_2 189; CHECK-NEXT: adrp x9, .LCPI7_3 190; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 191; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI7_2] 192; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI7_3] 193; CHECK-NEXT: adrp x8, .LCPI7_4 194; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 195; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 196; CHECK-NEXT: movi v2.4s, #1 197; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 198; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI7_4] 199; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 200; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 201; CHECK-NEXT: ret 202 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 16, i32 5> 203 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 204 %ret = zext <4 x i1> %cmp to <4 x i32> 205 ret <4 x i32> %ret 206} 207 208; One power-of-two divisor in even divisor 209define <4 x i32> @test_srem_even_poweroftwo(<4 x i32> %X) nounwind { 210; CHECK-LABEL: test_srem_even_poweroftwo: 211; CHECK: // %bb.0: 212; CHECK-NEXT: adrp x8, .LCPI8_0 213; CHECK-NEXT: adrp x9, .LCPI8_1 214; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI8_0] 215; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI8_1] 216; CHECK-NEXT: adrp x8, .LCPI8_2 217; CHECK-NEXT: adrp x9, .LCPI8_3 218; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 219; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI8_2] 220; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI8_3] 221; CHECK-NEXT: adrp x8, .LCPI8_4 222; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 223; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 224; CHECK-NEXT: movi v2.4s, #1 225; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 226; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI8_4] 227; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 228; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 229; CHECK-NEXT: ret 230 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 16, i32 14> 231 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 232 %ret = zext <4 x i1> %cmp to <4 x i32> 233 ret <4 x i32> %ret 234} 235 236; One power-of-two divisor in odd+even divisor 237define <4 x i32> @test_srem_odd_even_poweroftwo(<4 x i32> %X) nounwind { 238; CHECK-LABEL: test_srem_odd_even_poweroftwo: 239; CHECK: // %bb.0: 240; CHECK-NEXT: adrp x8, .LCPI9_0 241; CHECK-NEXT: adrp x9, .LCPI9_1 242; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI9_0] 243; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI9_1] 244; CHECK-NEXT: adrp x8, .LCPI9_2 245; CHECK-NEXT: adrp x9, .LCPI9_3 246; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 247; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI9_2] 248; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI9_3] 249; CHECK-NEXT: adrp x8, .LCPI9_4 250; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 251; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 252; CHECK-NEXT: movi v2.4s, #1 253; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 254; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI9_4] 255; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 256; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 257; CHECK-NEXT: ret 258 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 16, i32 100> 259 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 260 %ret = zext <4 x i1> %cmp to <4 x i32> 261 ret <4 x i32> %ret 262} 263 264;------------------------------------------------------------------------------; 265 266; One one divisor in odd divisor 267define <4 x i32> @test_srem_odd_one(<4 x i32> %X) nounwind { 268; CHECK-LABEL: test_srem_odd_one: 269; CHECK: // %bb.0: 270; CHECK-NEXT: movi v1.16b, #153 271; CHECK-NEXT: mov w8, #52429 // =0xcccd 272; CHECK-NEXT: movk w8, #52428, lsl #16 273; CHECK-NEXT: dup v2.4s, w8 274; CHECK-NEXT: adrp x8, .LCPI10_0 275; CHECK-NEXT: fneg v1.4s, v1.4s 276; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 277; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI10_0] 278; CHECK-NEXT: movi v2.4s, #1 279; CHECK-NEXT: cmhs v0.4s, v0.4s, v1.4s 280; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 281; CHECK-NEXT: ret 282 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 1, i32 5> 283 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 284 %ret = zext <4 x i1> %cmp to <4 x i32> 285 ret <4 x i32> %ret 286} 287 288; One one divisor in even divisor 289define <4 x i32> @test_srem_even_one(<4 x i32> %X) nounwind { 290; CHECK-LABEL: test_srem_even_one: 291; CHECK: // %bb.0: 292; CHECK-NEXT: mov w8, #28087 // =0x6db7 293; CHECK-NEXT: mov w9, #9362 // =0x2492 294; CHECK-NEXT: movk w8, #46811, lsl #16 295; CHECK-NEXT: movk w9, #4681, lsl #16 296; CHECK-NEXT: dup v1.4s, w8 297; CHECK-NEXT: dup v2.4s, w9 298; CHECK-NEXT: adrp x8, .LCPI11_0 299; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 300; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI11_0] 301; CHECK-NEXT: shl v0.4s, v2.4s, #31 302; CHECK-NEXT: usra v0.4s, v2.4s, #1 303; CHECK-NEXT: movi v2.4s, #1 304; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 305; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 306; CHECK-NEXT: ret 307 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 1, i32 14> 308 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 309 %ret = zext <4 x i1> %cmp to <4 x i32> 310 ret <4 x i32> %ret 311} 312 313; One one divisor in odd+even divisor 314define <4 x i32> @test_srem_odd_even_one(<4 x i32> %X) nounwind { 315; CHECK-LABEL: test_srem_odd_even_one: 316; CHECK: // %bb.0: 317; CHECK-NEXT: adrp x8, .LCPI12_0 318; CHECK-NEXT: adrp x9, .LCPI12_1 319; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI12_0] 320; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI12_1] 321; CHECK-NEXT: adrp x8, .LCPI12_2 322; CHECK-NEXT: adrp x9, .LCPI12_3 323; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 324; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI12_2] 325; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI12_3] 326; CHECK-NEXT: adrp x8, .LCPI12_4 327; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 328; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 329; CHECK-NEXT: movi v2.4s, #1 330; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 331; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI12_4] 332; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 333; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 334; CHECK-NEXT: ret 335 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 1, i32 100> 336 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 337 %ret = zext <4 x i1> %cmp to <4 x i32> 338 ret <4 x i32> %ret 339} 340 341;------------------------------------------------------------------------------; 342 343; One INT_MIN divisor in odd divisor 344define <4 x i32> @test_srem_odd_INT_MIN(<4 x i32> %X) nounwind { 345; CHECK-LABEL: test_srem_odd_INT_MIN: 346; CHECK: // %bb.0: 347; CHECK-NEXT: adrp x8, .LCPI13_0 348; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI13_0] 349; CHECK-NEXT: adrp x8, .LCPI13_1 350; CHECK-NEXT: smull2 v2.2d, v0.4s, v1.4s 351; CHECK-NEXT: smull v1.2d, v0.2s, v1.2s 352; CHECK-NEXT: uzp2 v1.4s, v1.4s, v2.4s 353; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI13_1] 354; CHECK-NEXT: adrp x8, .LCPI13_2 355; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 356; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI13_2] 357; CHECK-NEXT: adrp x8, .LCPI13_3 358; CHECK-NEXT: sshl v2.4s, v1.4s, v2.4s 359; CHECK-NEXT: usra v2.4s, v1.4s, #31 360; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI13_3] 361; CHECK-NEXT: mls v0.4s, v2.4s, v1.4s 362; CHECK-NEXT: movi v1.4s, #1 363; CHECK-NEXT: cmeq v0.4s, v0.4s, #0 364; CHECK-NEXT: and v0.16b, v0.16b, v1.16b 365; CHECK-NEXT: ret 366 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 2147483648, i32 5> 367 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 368 %ret = zext <4 x i1> %cmp to <4 x i32> 369 ret <4 x i32> %ret 370} 371 372; One INT_MIN divisor in even divisor 373define <4 x i32> @test_srem_even_INT_MIN(<4 x i32> %X) nounwind { 374; CHECK-LABEL: test_srem_even_INT_MIN: 375; CHECK: // %bb.0: 376; CHECK-NEXT: adrp x8, .LCPI14_0 377; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI14_0] 378; CHECK-NEXT: adrp x8, .LCPI14_1 379; CHECK-NEXT: smull2 v2.2d, v0.4s, v1.4s 380; CHECK-NEXT: smull v1.2d, v0.2s, v1.2s 381; CHECK-NEXT: uzp2 v1.4s, v1.4s, v2.4s 382; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI14_1] 383; CHECK-NEXT: adrp x8, .LCPI14_2 384; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 385; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI14_2] 386; CHECK-NEXT: adrp x8, .LCPI14_3 387; CHECK-NEXT: sshl v2.4s, v1.4s, v2.4s 388; CHECK-NEXT: usra v2.4s, v1.4s, #31 389; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI14_3] 390; CHECK-NEXT: mls v0.4s, v2.4s, v1.4s 391; CHECK-NEXT: movi v1.4s, #1 392; CHECK-NEXT: cmeq v0.4s, v0.4s, #0 393; CHECK-NEXT: and v0.16b, v0.16b, v1.16b 394; CHECK-NEXT: ret 395 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 2147483648, i32 14> 396 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 397 %ret = zext <4 x i1> %cmp to <4 x i32> 398 ret <4 x i32> %ret 399} 400 401; One INT_MIN divisor in odd+even divisor 402define <4 x i32> @test_srem_odd_even_INT_MIN(<4 x i32> %X) nounwind { 403; CHECK-LABEL: test_srem_odd_even_INT_MIN: 404; CHECK: // %bb.0: 405; CHECK-NEXT: adrp x8, .LCPI15_0 406; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI15_0] 407; CHECK-NEXT: adrp x8, .LCPI15_1 408; CHECK-NEXT: smull2 v2.2d, v0.4s, v1.4s 409; CHECK-NEXT: smull v1.2d, v0.2s, v1.2s 410; CHECK-NEXT: uzp2 v1.4s, v1.4s, v2.4s 411; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI15_1] 412; CHECK-NEXT: adrp x8, .LCPI15_2 413; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 414; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI15_2] 415; CHECK-NEXT: adrp x8, .LCPI15_3 416; CHECK-NEXT: sshl v2.4s, v1.4s, v2.4s 417; CHECK-NEXT: usra v2.4s, v1.4s, #31 418; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI15_3] 419; CHECK-NEXT: mls v0.4s, v2.4s, v1.4s 420; CHECK-NEXT: movi v1.4s, #1 421; CHECK-NEXT: cmeq v0.4s, v0.4s, #0 422; CHECK-NEXT: and v0.16b, v0.16b, v1.16b 423; CHECK-NEXT: ret 424 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 2147483648, i32 100> 425 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 426 %ret = zext <4 x i1> %cmp to <4 x i32> 427 ret <4 x i32> %ret 428} 429 430;==============================================================================; 431 432; One all-ones divisor and power-of-two divisor divisor in odd divisor 433define <4 x i32> @test_srem_odd_allones_and_poweroftwo(<4 x i32> %X) nounwind { 434; CHECK-LABEL: test_srem_odd_allones_and_poweroftwo: 435; CHECK: // %bb.0: 436; CHECK-NEXT: adrp x8, .LCPI16_0 437; CHECK-NEXT: adrp x9, .LCPI16_1 438; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI16_0] 439; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI16_1] 440; CHECK-NEXT: adrp x8, .LCPI16_2 441; CHECK-NEXT: adrp x9, .LCPI16_3 442; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 443; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI16_2] 444; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI16_3] 445; CHECK-NEXT: adrp x8, .LCPI16_4 446; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 447; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 448; CHECK-NEXT: movi v2.4s, #1 449; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 450; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI16_4] 451; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 452; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 453; CHECK-NEXT: ret 454 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 5> 455 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 456 %ret = zext <4 x i1> %cmp to <4 x i32> 457 ret <4 x i32> %ret 458} 459 460; One all-ones divisor and power-of-two divisor divisor in even divisor 461define <4 x i32> @test_srem_even_allones_and_poweroftwo(<4 x i32> %X) nounwind { 462; CHECK-LABEL: test_srem_even_allones_and_poweroftwo: 463; CHECK: // %bb.0: 464; CHECK-NEXT: adrp x8, .LCPI17_0 465; CHECK-NEXT: adrp x9, .LCPI17_1 466; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI17_0] 467; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI17_1] 468; CHECK-NEXT: adrp x8, .LCPI17_2 469; CHECK-NEXT: adrp x9, .LCPI17_3 470; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 471; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI17_2] 472; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI17_3] 473; CHECK-NEXT: adrp x8, .LCPI17_4 474; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 475; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 476; CHECK-NEXT: movi v2.4s, #1 477; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 478; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI17_4] 479; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 480; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 481; CHECK-NEXT: ret 482 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 16, i32 14> 483 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 484 %ret = zext <4 x i1> %cmp to <4 x i32> 485 ret <4 x i32> %ret 486} 487 488; One all-ones divisor and power-of-two divisor divisor in odd+even divisor 489define <4 x i32> @test_srem_odd_even_allones_and_poweroftwo(<4 x i32> %X) nounwind { 490; CHECK-LABEL: test_srem_odd_even_allones_and_poweroftwo: 491; CHECK: // %bb.0: 492; CHECK-NEXT: adrp x8, .LCPI18_0 493; CHECK-NEXT: adrp x9, .LCPI18_1 494; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI18_0] 495; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI18_1] 496; CHECK-NEXT: adrp x8, .LCPI18_2 497; CHECK-NEXT: adrp x9, .LCPI18_3 498; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 499; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI18_2] 500; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI18_3] 501; CHECK-NEXT: adrp x8, .LCPI18_4 502; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 503; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 504; CHECK-NEXT: movi v2.4s, #1 505; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 506; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI18_4] 507; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 508; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 509; CHECK-NEXT: ret 510 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 100> 511 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 512 %ret = zext <4 x i1> %cmp to <4 x i32> 513 ret <4 x i32> %ret 514} 515 516;------------------------------------------------------------------------------; 517 518; One all-ones divisor and one one divisor in odd divisor 519define <4 x i32> @test_srem_odd_allones_and_one(<4 x i32> %X) nounwind { 520; CHECK-LABEL: test_srem_odd_allones_and_one: 521; CHECK: // %bb.0: 522; CHECK-NEXT: movi v1.16b, #153 523; CHECK-NEXT: mov w8, #52429 // =0xcccd 524; CHECK-NEXT: movk w8, #52428, lsl #16 525; CHECK-NEXT: dup v2.4s, w8 526; CHECK-NEXT: adrp x8, .LCPI19_0 527; CHECK-NEXT: fneg v1.4s, v1.4s 528; CHECK-NEXT: mla v1.4s, v0.4s, v2.4s 529; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI19_0] 530; CHECK-NEXT: movi v2.4s, #1 531; CHECK-NEXT: cmhs v0.4s, v0.4s, v1.4s 532; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 533; CHECK-NEXT: ret 534 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 1, i32 5> 535 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 536 %ret = zext <4 x i1> %cmp to <4 x i32> 537 ret <4 x i32> %ret 538} 539 540; One all-ones divisor and one one divisor in even divisor 541define <4 x i32> @test_srem_even_allones_and_one(<4 x i32> %X) nounwind { 542; CHECK-LABEL: test_srem_even_allones_and_one: 543; CHECK: // %bb.0: 544; CHECK-NEXT: mov w8, #28087 // =0x6db7 545; CHECK-NEXT: mov w9, #9362 // =0x2492 546; CHECK-NEXT: movk w8, #46811, lsl #16 547; CHECK-NEXT: movk w9, #4681, lsl #16 548; CHECK-NEXT: dup v1.4s, w8 549; CHECK-NEXT: dup v2.4s, w9 550; CHECK-NEXT: adrp x8, .LCPI20_0 551; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 552; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI20_0] 553; CHECK-NEXT: shl v0.4s, v2.4s, #31 554; CHECK-NEXT: usra v0.4s, v2.4s, #1 555; CHECK-NEXT: movi v2.4s, #1 556; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 557; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 558; CHECK-NEXT: ret 559 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 1, i32 14> 560 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 561 %ret = zext <4 x i1> %cmp to <4 x i32> 562 ret <4 x i32> %ret 563} 564 565; One all-ones divisor and one one divisor in odd+even divisor 566define <4 x i32> @test_srem_odd_even_allones_and_one(<4 x i32> %X) nounwind { 567; CHECK-LABEL: test_srem_odd_even_allones_and_one: 568; CHECK: // %bb.0: 569; CHECK-NEXT: adrp x8, .LCPI21_0 570; CHECK-NEXT: adrp x9, .LCPI21_1 571; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI21_0] 572; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI21_1] 573; CHECK-NEXT: adrp x8, .LCPI21_2 574; CHECK-NEXT: adrp x9, .LCPI21_3 575; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 576; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI21_2] 577; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI21_3] 578; CHECK-NEXT: adrp x8, .LCPI21_4 579; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 580; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 581; CHECK-NEXT: movi v2.4s, #1 582; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 583; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI21_4] 584; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 585; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 586; CHECK-NEXT: ret 587 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 1, i32 100> 588 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 589 %ret = zext <4 x i1> %cmp to <4 x i32> 590 ret <4 x i32> %ret 591} 592 593;------------------------------------------------------------------------------; 594 595; One power-of-two divisor divisor and one divisor in odd divisor 596define <4 x i32> @test_srem_odd_poweroftwo_and_one(<4 x i32> %X) nounwind { 597; CHECK-LABEL: test_srem_odd_poweroftwo_and_one: 598; CHECK: // %bb.0: 599; CHECK-NEXT: adrp x8, .LCPI22_0 600; CHECK-NEXT: adrp x9, .LCPI22_1 601; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI22_0] 602; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI22_1] 603; CHECK-NEXT: adrp x8, .LCPI22_2 604; CHECK-NEXT: adrp x9, .LCPI22_3 605; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 606; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI22_2] 607; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI22_3] 608; CHECK-NEXT: adrp x8, .LCPI22_4 609; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 610; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 611; CHECK-NEXT: movi v2.4s, #1 612; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 613; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI22_4] 614; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 615; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 616; CHECK-NEXT: ret 617 %srem = srem <4 x i32> %X, <i32 5, i32 16, i32 1, i32 5> 618 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 619 %ret = zext <4 x i1> %cmp to <4 x i32> 620 ret <4 x i32> %ret 621} 622 623; One power-of-two divisor divisor and one divisor in even divisor 624define <4 x i32> @test_srem_even_poweroftwo_and_one(<4 x i32> %X) nounwind { 625; CHECK-LABEL: test_srem_even_poweroftwo_and_one: 626; CHECK: // %bb.0: 627; CHECK-NEXT: adrp x8, .LCPI23_0 628; CHECK-NEXT: adrp x9, .LCPI23_1 629; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI23_0] 630; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI23_1] 631; CHECK-NEXT: adrp x8, .LCPI23_2 632; CHECK-NEXT: adrp x9, .LCPI23_3 633; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 634; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI23_2] 635; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI23_3] 636; CHECK-NEXT: adrp x8, .LCPI23_4 637; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 638; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 639; CHECK-NEXT: movi v2.4s, #1 640; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 641; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI23_4] 642; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 643; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 644; CHECK-NEXT: ret 645 %srem = srem <4 x i32> %X, <i32 14, i32 16, i32 1, i32 14> 646 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 647 %ret = zext <4 x i1> %cmp to <4 x i32> 648 ret <4 x i32> %ret 649} 650 651; One power-of-two divisor divisor and one divisor in odd+even divisor 652define <4 x i32> @test_srem_odd_even_poweroftwo_and_one(<4 x i32> %X) nounwind { 653; CHECK-LABEL: test_srem_odd_even_poweroftwo_and_one: 654; CHECK: // %bb.0: 655; CHECK-NEXT: adrp x8, .LCPI24_0 656; CHECK-NEXT: adrp x9, .LCPI24_1 657; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI24_0] 658; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI24_1] 659; CHECK-NEXT: adrp x8, .LCPI24_2 660; CHECK-NEXT: adrp x9, .LCPI24_3 661; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 662; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI24_2] 663; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI24_3] 664; CHECK-NEXT: adrp x8, .LCPI24_4 665; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 666; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 667; CHECK-NEXT: movi v2.4s, #1 668; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 669; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI24_4] 670; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 671; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 672; CHECK-NEXT: ret 673 %srem = srem <4 x i32> %X, <i32 5, i32 16, i32 1, i32 100> 674 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 675 %ret = zext <4 x i1> %cmp to <4 x i32> 676 ret <4 x i32> %ret 677} 678 679;------------------------------------------------------------------------------; 680 681define <4 x i32> @test_srem_odd_allones_and_poweroftwo_and_one(<4 x i32> %X) nounwind { 682; CHECK-LABEL: test_srem_odd_allones_and_poweroftwo_and_one: 683; CHECK: // %bb.0: 684; CHECK-NEXT: adrp x8, .LCPI25_0 685; CHECK-NEXT: adrp x9, .LCPI25_1 686; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI25_0] 687; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI25_1] 688; CHECK-NEXT: adrp x8, .LCPI25_2 689; CHECK-NEXT: adrp x9, .LCPI25_3 690; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 691; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI25_2] 692; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI25_3] 693; CHECK-NEXT: adrp x8, .LCPI25_4 694; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 695; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 696; CHECK-NEXT: movi v2.4s, #1 697; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 698; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI25_4] 699; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 700; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 701; CHECK-NEXT: ret 702 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 1> 703 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 704 %ret = zext <4 x i1> %cmp to <4 x i32> 705 ret <4 x i32> %ret 706} 707 708define <4 x i32> @test_srem_even_allones_and_poweroftwo_and_one(<4 x i32> %X) nounwind { 709; CHECK-LABEL: test_srem_even_allones_and_poweroftwo_and_one: 710; CHECK: // %bb.0: 711; CHECK-NEXT: adrp x8, .LCPI26_0 712; CHECK-NEXT: adrp x9, .LCPI26_1 713; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI26_0] 714; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI26_1] 715; CHECK-NEXT: adrp x8, .LCPI26_2 716; CHECK-NEXT: adrp x9, .LCPI26_3 717; CHECK-NEXT: mla v2.4s, v0.4s, v1.4s 718; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI26_2] 719; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI26_3] 720; CHECK-NEXT: adrp x8, .LCPI26_4 721; CHECK-NEXT: ushl v0.4s, v2.4s, v0.4s 722; CHECK-NEXT: ushl v1.4s, v2.4s, v1.4s 723; CHECK-NEXT: movi v2.4s, #1 724; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b 725; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI26_4] 726; CHECK-NEXT: cmhs v0.4s, v1.4s, v0.4s 727; CHECK-NEXT: and v0.16b, v0.16b, v2.16b 728; CHECK-NEXT: ret 729 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 16, i32 1> 730 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0> 731 %ret = zext <4 x i1> %cmp to <4 x i32> 732 ret <4 x i32> %ret 733} 734