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