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