1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC 3; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC64LE 4 5define i1 @test_urem_odd(i13 %X) nounwind { 6; PPC-LABEL: test_urem_odd: 7; PPC: # %bb.0: 8; PPC-NEXT: mulli 3, 3, 3277 9; PPC-NEXT: clrlwi 3, 3, 19 10; PPC-NEXT: li 4, 0 11; PPC-NEXT: cmplwi 3, 1639 12; PPC-NEXT: li 3, 1 13; PPC-NEXT: bclr 12, 0, 0 14; PPC-NEXT: # %bb.1: 15; PPC-NEXT: ori 3, 4, 0 16; PPC-NEXT: blr 17; 18; PPC64LE-LABEL: test_urem_odd: 19; PPC64LE: # %bb.0: 20; PPC64LE-NEXT: mulli 3, 3, 3277 21; PPC64LE-NEXT: li 4, 0 22; PPC64LE-NEXT: clrlwi 3, 3, 19 23; PPC64LE-NEXT: cmplwi 3, 1639 24; PPC64LE-NEXT: li 3, 1 25; PPC64LE-NEXT: isellt 3, 3, 4 26; PPC64LE-NEXT: blr 27 %urem = urem i13 %X, 5 28 %cmp = icmp eq i13 %urem, 0 29 ret i1 %cmp 30} 31 32define i1 @test_urem_even(i27 %X) nounwind { 33; PPC-LABEL: test_urem_even: 34; PPC: # %bb.0: 35; PPC-NEXT: lis 4, 1755 36; PPC-NEXT: ori 4, 4, 28087 37; PPC-NEXT: mullw 3, 3, 4 38; PPC-NEXT: rlwinm 4, 3, 31, 6, 31 39; PPC-NEXT: rlwimi 4, 3, 26, 5, 5 40; PPC-NEXT: lis 3, 146 41; PPC-NEXT: ori 3, 3, 18725 42; PPC-NEXT: cmplw 4, 3 43; PPC-NEXT: li 3, 0 44; PPC-NEXT: li 4, 1 45; PPC-NEXT: bc 12, 0, .LBB1_1 46; PPC-NEXT: blr 47; PPC-NEXT: .LBB1_1: 48; PPC-NEXT: addi 3, 4, 0 49; PPC-NEXT: blr 50; 51; PPC64LE-LABEL: test_urem_even: 52; PPC64LE: # %bb.0: 53; PPC64LE-NEXT: lis 4, 1755 54; PPC64LE-NEXT: ori 4, 4, 28087 55; PPC64LE-NEXT: mullw 3, 3, 4 56; PPC64LE-NEXT: lis 4, 146 57; PPC64LE-NEXT: rlwinm 5, 3, 31, 6, 31 58; PPC64LE-NEXT: rlwimi 5, 3, 26, 5, 5 59; PPC64LE-NEXT: ori 3, 4, 18725 60; PPC64LE-NEXT: li 4, 1 61; PPC64LE-NEXT: cmplw 5, 3 62; PPC64LE-NEXT: li 3, 0 63; PPC64LE-NEXT: isellt 3, 4, 3 64; PPC64LE-NEXT: blr 65 %urem = urem i27 %X, 14 66 %cmp = icmp eq i27 %urem, 0 67 ret i1 %cmp 68} 69 70define i1 @test_urem_odd_setne(i4 %X) nounwind { 71; PPC-LABEL: test_urem_odd_setne: 72; PPC: # %bb.0: 73; PPC-NEXT: mulli 3, 3, 13 74; PPC-NEXT: clrlwi 3, 3, 28 75; PPC-NEXT: li 4, 0 76; PPC-NEXT: cmplwi 3, 3 77; PPC-NEXT: li 3, 1 78; PPC-NEXT: bclr 12, 1, 0 79; PPC-NEXT: # %bb.1: 80; PPC-NEXT: ori 3, 4, 0 81; PPC-NEXT: blr 82; 83; PPC64LE-LABEL: test_urem_odd_setne: 84; PPC64LE: # %bb.0: 85; PPC64LE-NEXT: slwi 5, 3, 1 86; PPC64LE-NEXT: li 4, 0 87; PPC64LE-NEXT: add 3, 3, 5 88; PPC64LE-NEXT: neg 3, 3 89; PPC64LE-NEXT: clrlwi 3, 3, 28 90; PPC64LE-NEXT: cmplwi 3, 3 91; PPC64LE-NEXT: li 3, 1 92; PPC64LE-NEXT: iselgt 3, 3, 4 93; PPC64LE-NEXT: blr 94 %urem = urem i4 %X, 5 95 %cmp = icmp ne i4 %urem, 0 96 ret i1 %cmp 97} 98 99define i1 @test_urem_negative_odd(i9 %X) nounwind { 100; PPC-LABEL: test_urem_negative_odd: 101; PPC: # %bb.0: 102; PPC-NEXT: mulli 3, 3, 307 103; PPC-NEXT: clrlwi 3, 3, 23 104; PPC-NEXT: li 4, 0 105; PPC-NEXT: cmplwi 3, 1 106; PPC-NEXT: li 3, 1 107; PPC-NEXT: bclr 12, 1, 0 108; PPC-NEXT: # %bb.1: 109; PPC-NEXT: ori 3, 4, 0 110; PPC-NEXT: blr 111; 112; PPC64LE-LABEL: test_urem_negative_odd: 113; PPC64LE: # %bb.0: 114; PPC64LE-NEXT: mulli 3, 3, 307 115; PPC64LE-NEXT: li 4, 0 116; PPC64LE-NEXT: clrlwi 3, 3, 23 117; PPC64LE-NEXT: cmplwi 3, 1 118; PPC64LE-NEXT: li 3, 1 119; PPC64LE-NEXT: iselgt 3, 3, 4 120; PPC64LE-NEXT: blr 121 %urem = urem i9 %X, -5 122 %cmp = icmp ne i9 %urem, 0 123 ret i1 %cmp 124} 125 126define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind { 127; PPC-LABEL: test_urem_vec: 128; PPC: # %bb.0: 129; PPC-NEXT: mulli 3, 3, 683 130; PPC-NEXT: rlwinm 7, 3, 31, 22, 31 131; PPC-NEXT: rlwimi 7, 3, 10, 21, 21 132; PPC-NEXT: mulli 5, 5, 819 133; PPC-NEXT: li 6, 0 134; PPC-NEXT: cmplwi 7, 341 135; PPC-NEXT: mulli 3, 4, 1463 136; PPC-NEXT: addi 4, 5, -1638 137; PPC-NEXT: addi 3, 3, -1463 138; PPC-NEXT: clrlwi 4, 4, 21 139; PPC-NEXT: clrlwi 3, 3, 21 140; PPC-NEXT: cmplwi 1, 4, 1 141; PPC-NEXT: cmplwi 5, 3, 292 142; PPC-NEXT: li 3, 1 143; PPC-NEXT: bc 12, 21, .LBB4_2 144; PPC-NEXT: # %bb.1: 145; PPC-NEXT: ori 4, 6, 0 146; PPC-NEXT: b .LBB4_3 147; PPC-NEXT: .LBB4_2: 148; PPC-NEXT: addi 4, 3, 0 149; PPC-NEXT: .LBB4_3: 150; PPC-NEXT: bc 12, 5, .LBB4_5 151; PPC-NEXT: # %bb.4: 152; PPC-NEXT: ori 5, 6, 0 153; PPC-NEXT: b .LBB4_6 154; PPC-NEXT: .LBB4_5: 155; PPC-NEXT: addi 5, 3, 0 156; PPC-NEXT: .LBB4_6: 157; PPC-NEXT: bclr 12, 1, 0 158; PPC-NEXT: # %bb.7: 159; PPC-NEXT: ori 3, 6, 0 160; PPC-NEXT: blr 161; 162; PPC64LE-LABEL: test_urem_vec: 163; PPC64LE: # %bb.0: 164; PPC64LE-NEXT: mtvsrwz 34, 3 165; PPC64LE-NEXT: addis 3, 2, .LCPI4_0@toc@ha 166; PPC64LE-NEXT: mtvsrwz 35, 4 167; PPC64LE-NEXT: addi 3, 3, .LCPI4_0@toc@l 168; PPC64LE-NEXT: addis 4, 2, .LCPI4_2@toc@ha 169; PPC64LE-NEXT: mtvsrwz 36, 5 170; PPC64LE-NEXT: vmrghw 2, 3, 2 171; PPC64LE-NEXT: lvx 3, 0, 3 172; PPC64LE-NEXT: addis 3, 2, .LCPI4_1@toc@ha 173; PPC64LE-NEXT: addi 3, 3, .LCPI4_1@toc@l 174; PPC64LE-NEXT: vperm 2, 4, 2, 3 175; PPC64LE-NEXT: vspltisw 3, -11 176; PPC64LE-NEXT: lvx 4, 0, 3 177; PPC64LE-NEXT: addi 3, 4, .LCPI4_2@toc@l 178; PPC64LE-NEXT: addis 4, 2, .LCPI4_4@toc@ha 179; PPC64LE-NEXT: lvx 5, 0, 3 180; PPC64LE-NEXT: addis 3, 2, .LCPI4_3@toc@ha 181; PPC64LE-NEXT: addi 4, 4, .LCPI4_4@toc@l 182; PPC64LE-NEXT: addi 3, 3, .LCPI4_3@toc@l 183; PPC64LE-NEXT: vsrw 3, 3, 3 184; PPC64LE-NEXT: vsubuwm 2, 2, 4 185; PPC64LE-NEXT: lvx 4, 0, 3 186; PPC64LE-NEXT: addis 3, 2, .LCPI4_5@toc@ha 187; PPC64LE-NEXT: addi 3, 3, .LCPI4_5@toc@l 188; PPC64LE-NEXT: vmuluwm 2, 2, 5 189; PPC64LE-NEXT: lvx 5, 0, 4 190; PPC64LE-NEXT: xxland 32, 34, 35 191; PPC64LE-NEXT: vslw 2, 2, 4 192; PPC64LE-NEXT: vsrw 4, 0, 5 193; PPC64LE-NEXT: xxlor 0, 36, 34 194; PPC64LE-NEXT: lvx 2, 0, 3 195; PPC64LE-NEXT: xxland 35, 0, 35 196; PPC64LE-NEXT: vcmpgtuw 2, 3, 2 197; PPC64LE-NEXT: xxswapd 0, 34 198; PPC64LE-NEXT: xxsldwi 1, 34, 34, 1 199; PPC64LE-NEXT: mfvsrwz 5, 34 200; PPC64LE-NEXT: mffprwz 3, 0 201; PPC64LE-NEXT: mffprwz 4, 1 202; PPC64LE-NEXT: blr 203 %urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5> 204 %cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2> 205 ret <3 x i1> %cmp 206} 207 208define i1 @test_urem_oversized(i66 %X) nounwind { 209; PPC-LABEL: test_urem_oversized: 210; PPC: # %bb.0: 211; PPC-NEXT: mflr 0 212; PPC-NEXT: stw 0, 4(1) 213; PPC-NEXT: stwu 1, -16(1) 214; PPC-NEXT: mr 6, 5 215; PPC-NEXT: mr 5, 4 216; PPC-NEXT: mr 4, 3 217; PPC-NEXT: lis 3, 12057 218; PPC-NEXT: lis 7, -12795 219; PPC-NEXT: ori 9, 3, 37186 220; PPC-NEXT: ori 10, 7, 40665 221; PPC-NEXT: li 3, 0 222; PPC-NEXT: li 7, 0 223; PPC-NEXT: li 8, 2 224; PPC-NEXT: bl __multi3 225; PPC-NEXT: rotlwi 7, 6, 31 226; PPC-NEXT: lis 3, -5526 227; PPC-NEXT: rlwimi 7, 5, 31, 0, 0 228; PPC-NEXT: rotlwi 5, 5, 31 229; PPC-NEXT: rlwimi 5, 4, 31, 0, 0 230; PPC-NEXT: ori 3, 3, 61135 231; PPC-NEXT: cmplwi 1, 5, 13 232; PPC-NEXT: cmplw 7, 3 233; PPC-NEXT: rlwinm 4, 4, 31, 31, 31 234; PPC-NEXT: crand 20, 6, 0 235; PPC-NEXT: crandc 21, 4, 6 236; PPC-NEXT: rlwimi. 4, 6, 1, 30, 30 237; PPC-NEXT: cror 20, 20, 21 238; PPC-NEXT: crnand 20, 2, 20 239; PPC-NEXT: li 3, 1 240; PPC-NEXT: bc 12, 20, .LBB5_1 241; PPC-NEXT: b .LBB5_2 242; PPC-NEXT: .LBB5_1: 243; PPC-NEXT: li 3, 0 244; PPC-NEXT: .LBB5_2: 245; PPC-NEXT: lwz 0, 20(1) 246; PPC-NEXT: addi 1, 1, 16 247; PPC-NEXT: mtlr 0 248; PPC-NEXT: blr 249; 250; PPC64LE-LABEL: test_urem_oversized: 251; PPC64LE: # %bb.0: 252; PPC64LE-NEXT: lis 5, 6028 253; PPC64LE-NEXT: ori 5, 5, 51361 254; PPC64LE-NEXT: rldic 5, 5, 33, 2 255; PPC64LE-NEXT: oris 5, 5, 52741 256; PPC64LE-NEXT: ori 5, 5, 40665 257; PPC64LE-NEXT: mulhdu 6, 3, 5 258; PPC64LE-NEXT: mulld 4, 4, 5 259; PPC64LE-NEXT: mulld 5, 3, 5 260; PPC64LE-NEXT: sldi 3, 3, 1 261; PPC64LE-NEXT: add 3, 6, 3 262; PPC64LE-NEXT: add 3, 3, 4 263; PPC64LE-NEXT: lis 4, -8538 264; PPC64LE-NEXT: rotldi 6, 5, 63 265; PPC64LE-NEXT: ori 4, 4, 44780 266; PPC64LE-NEXT: rldimi 6, 3, 63, 0 267; PPC64LE-NEXT: rlwinm 3, 3, 31, 31, 31 268; PPC64LE-NEXT: rldicl 4, 4, 4, 28 269; PPC64LE-NEXT: rlwimi. 3, 5, 1, 30, 30 270; PPC64LE-NEXT: cmpld 1, 6, 4 271; PPC64LE-NEXT: li 3, 1 272; PPC64LE-NEXT: crnand 20, 2, 4 273; PPC64LE-NEXT: isel 3, 0, 3, 20 274; PPC64LE-NEXT: blr 275 %urem = urem i66 %X, 1234567890 276 %cmp = icmp eq i66 %urem, 0 277 ret i1 %cmp 278} 279