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_srem_odd(i29 %X) nounwind { 6; PPC-LABEL: test_srem_odd: 7; PPC: # %bb.0: 8; PPC-NEXT: lis 4, 8026 9; PPC-NEXT: ori 4, 4, 33099 10; PPC-NEXT: mullw 3, 3, 4 11; PPC-NEXT: addi 3, 3, 24493 12; PPC-NEXT: lis 4, 82 13; PPC-NEXT: addis 3, 3, 41 14; PPC-NEXT: clrlwi 3, 3, 3 15; PPC-NEXT: ori 4, 4, 48987 16; PPC-NEXT: cmplw 3, 4 17; PPC-NEXT: li 3, 1 18; PPC-NEXT: bclr 12, 0, 0 19; PPC-NEXT: # %bb.1: 20; PPC-NEXT: li 3, 0 21; PPC-NEXT: blr 22; 23; PPC64LE-LABEL: test_srem_odd: 24; PPC64LE: # %bb.0: 25; PPC64LE-NEXT: lis 4, 8026 26; PPC64LE-NEXT: ori 4, 4, 33099 27; PPC64LE-NEXT: mullw 3, 3, 4 28; PPC64LE-NEXT: lis 4, 82 29; PPC64LE-NEXT: ori 4, 4, 48987 30; PPC64LE-NEXT: addi 3, 3, 24493 31; PPC64LE-NEXT: addis 3, 3, 41 32; PPC64LE-NEXT: clrlwi 3, 3, 3 33; PPC64LE-NEXT: cmplw 3, 4 34; PPC64LE-NEXT: li 3, 0 35; PPC64LE-NEXT: li 4, 1 36; PPC64LE-NEXT: isellt 3, 4, 3 37; PPC64LE-NEXT: blr 38 %srem = srem i29 %X, 99 39 %cmp = icmp eq i29 %srem, 0 40 ret i1 %cmp 41} 42 43define i1 @test_srem_even(i4 %X) nounwind { 44; PPC-LABEL: test_srem_even: 45; PPC: # %bb.0: 46; PPC-NEXT: slwi 4, 3, 28 47; PPC-NEXT: srawi 4, 4, 28 48; PPC-NEXT: mulli 4, 4, 3 49; PPC-NEXT: srwi 5, 4, 31 50; PPC-NEXT: srwi 4, 4, 4 51; PPC-NEXT: add 4, 4, 5 52; PPC-NEXT: mulli 4, 4, 6 53; PPC-NEXT: sub 3, 3, 4 54; PPC-NEXT: clrlwi 3, 3, 28 55; PPC-NEXT: cmpwi 3, 1 56; PPC-NEXT: li 3, 1 57; PPC-NEXT: bclr 12, 2, 0 58; PPC-NEXT: # %bb.1: 59; PPC-NEXT: li 3, 0 60; PPC-NEXT: blr 61; 62; PPC64LE-LABEL: test_srem_even: 63; PPC64LE: # %bb.0: 64; PPC64LE-NEXT: slwi 4, 3, 28 65; PPC64LE-NEXT: srawi 4, 4, 28 66; PPC64LE-NEXT: slwi 5, 4, 1 67; PPC64LE-NEXT: add 4, 4, 5 68; PPC64LE-NEXT: srwi 5, 4, 31 69; PPC64LE-NEXT: srwi 4, 4, 4 70; PPC64LE-NEXT: add 4, 4, 5 71; PPC64LE-NEXT: mulli 4, 4, 6 72; PPC64LE-NEXT: sub 3, 3, 4 73; PPC64LE-NEXT: li 4, 1 74; PPC64LE-NEXT: clrlwi 3, 3, 28 75; PPC64LE-NEXT: cmpwi 3, 1 76; PPC64LE-NEXT: li 3, 0 77; PPC64LE-NEXT: iseleq 3, 4, 3 78; PPC64LE-NEXT: blr 79 %srem = srem i4 %X, 6 80 %cmp = icmp eq i4 %srem, 1 81 ret i1 %cmp 82} 83 84define i1 @test_srem_pow2_setne(i6 %X) nounwind { 85; PPC-LABEL: test_srem_pow2_setne: 86; PPC: # %bb.0: 87; PPC-NEXT: slwi 4, 3, 26 88; PPC-NEXT: srawi 4, 4, 31 89; PPC-NEXT: clrlwi 4, 4, 30 90; PPC-NEXT: add 4, 3, 4 91; PPC-NEXT: rlwinm 4, 4, 0, 26, 29 92; PPC-NEXT: sub 3, 3, 4 93; PPC-NEXT: clrlwi 3, 3, 26 94; PPC-NEXT: cntlzw 3, 3 95; PPC-NEXT: not 3, 3 96; PPC-NEXT: rlwinm 3, 3, 27, 31, 31 97; PPC-NEXT: blr 98; 99; PPC64LE-LABEL: test_srem_pow2_setne: 100; PPC64LE: # %bb.0: 101; PPC64LE-NEXT: slwi 4, 3, 26 102; PPC64LE-NEXT: srawi 4, 4, 31 103; PPC64LE-NEXT: clrlwi 4, 4, 30 104; PPC64LE-NEXT: add 4, 3, 4 105; PPC64LE-NEXT: rlwinm 4, 4, 0, 26, 29 106; PPC64LE-NEXT: sub 3, 3, 4 107; PPC64LE-NEXT: clrlwi 3, 3, 26 108; PPC64LE-NEXT: cntlzw 3, 3 109; PPC64LE-NEXT: not 3, 3 110; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31 111; PPC64LE-NEXT: blr 112 %srem = srem i6 %X, 4 113 %cmp = icmp ne i6 %srem, 0 114 ret i1 %cmp 115} 116 117define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind { 118; PPC-LABEL: test_srem_vec: 119; PPC: # %bb.0: 120; PPC-NEXT: mflr 0 121; PPC-NEXT: stwu 1, -48(1) 122; PPC-NEXT: stw 0, 52(1) 123; PPC-NEXT: clrlwi 5, 5, 31 124; PPC-NEXT: stw 29, 36(1) # 4-byte Folded Spill 125; PPC-NEXT: mr 29, 6 126; PPC-NEXT: clrlwi 6, 7, 31 127; PPC-NEXT: clrlwi 3, 3, 31 128; PPC-NEXT: stw 27, 28(1) # 4-byte Folded Spill 129; PPC-NEXT: neg 27, 6 130; PPC-NEXT: stw 28, 32(1) # 4-byte Folded Spill 131; PPC-NEXT: neg 28, 5 132; PPC-NEXT: neg 3, 3 133; PPC-NEXT: li 5, 0 134; PPC-NEXT: li 6, 9 135; PPC-NEXT: stw 25, 20(1) # 4-byte Folded Spill 136; PPC-NEXT: stw 26, 24(1) # 4-byte Folded Spill 137; PPC-NEXT: stw 30, 40(1) # 4-byte Folded Spill 138; PPC-NEXT: mr 30, 8 139; PPC-NEXT: bl __moddi3 140; PPC-NEXT: mr 26, 3 141; PPC-NEXT: mr 25, 4 142; PPC-NEXT: mr 3, 27 143; PPC-NEXT: mr 4, 30 144; PPC-NEXT: li 5, -1 145; PPC-NEXT: li 6, -9 146; PPC-NEXT: bl __moddi3 147; PPC-NEXT: mr 30, 3 148; PPC-NEXT: mr 27, 4 149; PPC-NEXT: mr 3, 28 150; PPC-NEXT: mr 4, 29 151; PPC-NEXT: li 5, 0 152; PPC-NEXT: li 6, 9 153; PPC-NEXT: bl __moddi3 154; PPC-NEXT: not 3, 3 155; PPC-NEXT: xori 4, 4, 65533 156; PPC-NEXT: xori 5, 27, 3 157; PPC-NEXT: xori 6, 25, 3 158; PPC-NEXT: clrlwi 3, 3, 31 159; PPC-NEXT: xoris 4, 4, 65535 160; PPC-NEXT: or 5, 5, 30 161; PPC-NEXT: or 6, 6, 26 162; PPC-NEXT: or 4, 4, 3 163; PPC-NEXT: cntlzw 6, 6 164; PPC-NEXT: cntlzw 5, 5 165; PPC-NEXT: cntlzw 4, 4 166; PPC-NEXT: not 3, 6 167; PPC-NEXT: not 5, 5 168; PPC-NEXT: not 4, 4 169; PPC-NEXT: rlwinm 3, 3, 27, 31, 31 170; PPC-NEXT: rlwinm 5, 5, 27, 31, 31 171; PPC-NEXT: rlwinm 4, 4, 27, 31, 31 172; PPC-NEXT: lwz 30, 40(1) # 4-byte Folded Reload 173; PPC-NEXT: lwz 29, 36(1) # 4-byte Folded Reload 174; PPC-NEXT: lwz 28, 32(1) # 4-byte Folded Reload 175; PPC-NEXT: lwz 27, 28(1) # 4-byte Folded Reload 176; PPC-NEXT: lwz 26, 24(1) # 4-byte Folded Reload 177; PPC-NEXT: lwz 25, 20(1) # 4-byte Folded Reload 178; PPC-NEXT: lwz 0, 52(1) 179; PPC-NEXT: addi 1, 1, 48 180; PPC-NEXT: mtlr 0 181; PPC-NEXT: blr 182; 183; PPC64LE-LABEL: test_srem_vec: 184; PPC64LE: # %bb.0: 185; PPC64LE-NEXT: lis 6, 1820 186; PPC64LE-NEXT: sldi 3, 3, 31 187; PPC64LE-NEXT: sldi 4, 4, 31 188; PPC64LE-NEXT: sldi 5, 5, 31 189; PPC64LE-NEXT: ori 6, 6, 29127 190; PPC64LE-NEXT: sradi 3, 3, 31 191; PPC64LE-NEXT: sradi 4, 4, 31 192; PPC64LE-NEXT: sradi 5, 5, 31 193; PPC64LE-NEXT: rldic 6, 6, 34, 3 194; PPC64LE-NEXT: oris 6, 6, 29127 195; PPC64LE-NEXT: ori 7, 6, 7282 196; PPC64LE-NEXT: mulhd 8, 3, 7 197; PPC64LE-NEXT: rldicl 9, 8, 1, 63 198; PPC64LE-NEXT: add 8, 8, 9 199; PPC64LE-NEXT: sldi 9, 8, 3 200; PPC64LE-NEXT: add 8, 8, 9 201; PPC64LE-NEXT: sub 3, 3, 8 202; PPC64LE-NEXT: mtfprd 0, 3 203; PPC64LE-NEXT: mulhd 3, 4, 7 204; PPC64LE-NEXT: rldicl 7, 3, 1, 63 205; PPC64LE-NEXT: add 3, 3, 7 206; PPC64LE-NEXT: sldi 7, 3, 3 207; PPC64LE-NEXT: add 3, 3, 7 208; PPC64LE-NEXT: sub 3, 4, 3 209; PPC64LE-NEXT: mtfprd 1, 3 210; PPC64LE-NEXT: ori 3, 6, 7281 211; PPC64LE-NEXT: mulhd 3, 5, 3 212; PPC64LE-NEXT: sub 3, 3, 5 213; PPC64LE-NEXT: rldicl 4, 3, 1, 63 214; PPC64LE-NEXT: sradi 3, 3, 3 215; PPC64LE-NEXT: add 3, 3, 4 216; PPC64LE-NEXT: sldi 4, 3, 3 217; PPC64LE-NEXT: add 3, 3, 4 218; PPC64LE-NEXT: add 3, 5, 3 219; PPC64LE-NEXT: xxmrghd 34, 1, 0 220; PPC64LE-NEXT: mtfprd 0, 3 221; PPC64LE-NEXT: addis 3, 2, .LCPI3_1@toc@ha 222; PPC64LE-NEXT: addi 3, 3, .LCPI3_1@toc@l 223; PPC64LE-NEXT: xxswapd 35, 0 224; PPC64LE-NEXT: lxvd2x 0, 0, 3 225; PPC64LE-NEXT: addis 3, 2, .LCPI3_2@toc@ha 226; PPC64LE-NEXT: addi 3, 3, .LCPI3_2@toc@l 227; PPC64LE-NEXT: xxswapd 36, 0 228; PPC64LE-NEXT: lxvd2x 0, 0, 3 229; PPC64LE-NEXT: addis 3, 2, .LCPI3_0@toc@ha 230; PPC64LE-NEXT: addi 3, 3, .LCPI3_0@toc@l 231; PPC64LE-NEXT: xxswapd 37, 0 232; PPC64LE-NEXT: lxvd2x 0, 0, 3 233; PPC64LE-NEXT: xxland 34, 34, 0 234; PPC64LE-NEXT: xxland 35, 35, 0 235; PPC64LE-NEXT: vcmpequd 2, 2, 4 236; PPC64LE-NEXT: xxlnor 0, 34, 34 237; PPC64LE-NEXT: vcmpequd 2, 3, 5 238; PPC64LE-NEXT: xxlnor 34, 34, 34 239; PPC64LE-NEXT: mffprwz 4, 0 240; PPC64LE-NEXT: xxswapd 1, 0 241; PPC64LE-NEXT: mffprwz 3, 1 242; PPC64LE-NEXT: xxswapd 2, 34 243; PPC64LE-NEXT: mffprwz 5, 2 244; PPC64LE-NEXT: blr 245 %srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9> 246 %cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3> 247 ret <3 x i1> %cmp 248} 249