1; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s 2; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s 3; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not mod[us][wd] 4; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | \ 5; RUN: llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-DRP 6; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 | \ 7; RUN: llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-DRP 8; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | \ 9; RUN: llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not mod[us][wd] 10 11@mod_resultsw = local_unnamed_addr global i32 0, align 4 12@mod_resultud = local_unnamed_addr global i64 0, align 8 13@div_resultsw = local_unnamed_addr global i32 0, align 4 14@mod_resultuw = local_unnamed_addr global i32 0, align 4 15@div_resultuw = local_unnamed_addr global i32 0, align 4 16@div_resultsd = local_unnamed_addr global i64 0, align 8 17@mod_resultsd = local_unnamed_addr global i64 0, align 8 18@div_resultud = local_unnamed_addr global i64 0, align 8 19 20; Function Attrs: norecurse nounwind 21define void @modulo_sw(i32 signext %a, i32 signext %b) local_unnamed_addr { 22entry: 23 %rem = srem i32 %a, %b 24 store i32 %rem, ptr @mod_resultsw, align 4 25 ret void 26; CHECK-LABEL: modulo_sw 27; CHECK: modsw {{[0-9]+}}, 3, 4 28; CHECK: blr 29; CHECK-PWR8-LABEL: modulo_sw 30; CHECK-PWR8: div 31; CHECK-PWR8: mull 32; CHECK-PWR8: sub 33; CHECK-PWR8: blr 34} 35 36; Function Attrs: norecurse nounwind readnone 37define zeroext i32 @modulo_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr { 38entry: 39 %rem = urem i32 %a, %b 40 ret i32 %rem 41; CHECK-LABEL: modulo_uw 42; CHECK: moduw {{[0-9]+}}, 3, 4 43; CHECK: blr 44; CHECK-PWR8-LABEL: modulo_uw 45; CHECK-PWR8: div 46; CHECK-PWR8: mull 47; CHECK-PWR8: sub 48; CHECK-PWR8: blr 49} 50 51; Function Attrs: norecurse nounwind readnone 52define i64 @modulo_sd(i64 %a, i64 %b) local_unnamed_addr { 53entry: 54 %rem = srem i64 %a, %b 55 ret i64 %rem 56; CHECK-LABEL: modulo_sd 57; CHECK: modsd {{[0-9]+}}, 3, 4 58; CHECK: blr 59; CHECK-PWR8-LABEL: modulo_sd 60; CHECK-PWR8: div 61; CHECK-PWR8: mull 62; CHECK-PWR8: sub 63; CHECK-PWR8: blr 64} 65 66; Function Attrs: norecurse nounwind 67define void @modulo_ud(i64 %a, i64 %b) local_unnamed_addr { 68entry: 69 %rem = urem i64 %a, %b 70 store i64 %rem, ptr @mod_resultud, align 8 71 ret void 72; CHECK-LABEL: modulo_ud 73; CHECK: modud {{[0-9]+}}, 3, 4 74; CHECK: blr 75; CHECK-PWR8-LABEL: modulo_ud 76; CHECK-PWR8: div 77; CHECK-PWR8: mull 78; CHECK-PWR8: sub 79; CHECK-PWR8: blr 80} 81 82; Function Attrs: norecurse nounwind 83define void @modulo_div_sw(i32 signext %a, i32 signext %b) local_unnamed_addr { 84entry: 85 %rem = srem i32 %a, %b 86 store i32 %rem, ptr @mod_resultsw, align 4 87 %div = sdiv i32 %a, %b 88 store i32 %div, ptr @div_resultsw, align 4 89 ret void 90; CHECK-LABEL: modulo_div_sw 91; CHECK: modsw {{[0-9]+}}, 3, 4 92; CHECK: blr 93; CHECK-DRP-LABEL: modulo_div_sw 94; CHECK-DRP-NOT: modsw 95; CHECK-DRP: div 96; CHECK-DRP-NOT: modsw 97; CHECK-DRP: mull 98; CHECK-DRP-NOT: modsw 99; CHECK-DRP: sub 100; CHECK-DRP: blr 101; CHECK-PWR8-LABEL: modulo_div_sw 102; CHECK-PWR8: div 103; CHECK-PWR8: mull 104; CHECK-PWR8: sub 105; CHECK-PWR8: blr 106} 107 108; Function Attrs: norecurse nounwind 109define void @modulo_div_abc_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr { 110entry: 111 %rem = srem i32 %a, %c 112 store i32 %rem, ptr @mod_resultsw, align 4 113 %div = sdiv i32 %b, %c 114 store i32 %div, ptr @div_resultsw, align 4 115 ret void 116; CHECK-LABEL: modulo_div_abc_sw 117; CHECK: modsw {{[0-9]+}}, 3, 5 118; CHECK: blr 119; CHECK-PWR8-LABEL: modulo_div_abc_sw 120; CHECK-PWR8: div 121; CHECK-PWR8: mull 122; CHECK-PWR8: sub 123; CHECK-PWR8: blr 124} 125 126; Function Attrs: norecurse nounwind 127define void @modulo_div_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr { 128entry: 129 %rem = urem i32 %a, %b 130 store i32 %rem, ptr @mod_resultuw, align 4 131 %div = udiv i32 %a, %b 132 store i32 %div, ptr @div_resultuw, align 4 133 ret void 134; CHECK-LABEL: modulo_div_uw 135; CHECK: moduw {{[0-9]+}}, 3, 4 136; CHECK: blr 137; CHECK-DRP-LABEL: modulo_div_uw 138; CHECK-DRP-NOT: moduw 139; CHECK-DRP: div 140; CHECK-DRP-NOT: moduw 141; CHECK-DRP: mull 142; CHECK-DRP-NOT: moduw 143; CHECK-DRP: sub 144; CHECK-DRP: blr 145; CHECK-PWR8-LABEL: modulo_div_uw 146; CHECK-PWR8: div 147; CHECK-PWR8: mull 148; CHECK-PWR8: sub 149; CHECK-PWR8: blr 150} 151 152; Function Attrs: norecurse nounwind 153define void @modulo_div_swuw(i32 signext %a, i32 signext %b) local_unnamed_addr { 154entry: 155 %rem = srem i32 %a, %b 156 store i32 %rem, ptr @mod_resultsw, align 4 157 %div = udiv i32 %a, %b 158 store i32 %div, ptr @div_resultsw, align 4 159 ret void 160; CHECK-LABEL: modulo_div_swuw 161; CHECK: modsw {{[0-9]+}}, 3, 4 162; CHECK: blr 163; CHECK-PWR8-LABEL: modulo_div_swuw 164; CHECK-PWR8: div 165; CHECK-PWR8: mull 166; CHECK-PWR8: sub 167; CHECK-PWR8: blr 168} 169 170; Function Attrs: norecurse nounwind 171define void @modulo_div_udsd(i64 %a, i64 %b) local_unnamed_addr { 172entry: 173 %rem = urem i64 %a, %b 174 store i64 %rem, ptr @mod_resultud, align 8 175 %div = sdiv i64 %a, %b 176 store i64 %div, ptr @div_resultsd, align 8 177 ret void 178; CHECK-LABEL: modulo_div_udsd 179; CHECK: modud {{[0-9]+}}, 3, 4 180; CHECK: blr 181; CHECK-PWR8-LABEL: modulo_div_udsd 182; CHECK-PWR8: div 183; CHECK-PWR8: mull 184; CHECK-PWR8: sub 185; CHECK-PWR8: blr 186} 187 188; Function Attrs: norecurse nounwind 189define void @modulo_const32_sw(i32 signext %a) local_unnamed_addr { 190entry: 191 %rem = srem i32 %a, 32 192 store i32 %rem, ptr @mod_resultsw, align 4 193 ret void 194; CHECK-LABEL: modulo_const32_sw 195; CHECK-NOT: modsw 196; CHECK: srawi 197; CHECK-NOT: modsw 198; CHECK: addze 199; CHECK-NOT: modsw 200; CHECK: slwi 201; CHECK-NOT: modsw 202; CHECK: sub 203; CHECK-NOT: modsw 204; CHECK: blr 205; CHECK-PWR8-LABEL: modulo_const32_sw 206; CHECK-PWR8: srawi 207; CHECK-PWR8: addze 208; CHECK-PWR8: slwi 209; CHECK-PWR8: sub 210; CHECK-PWR8: blr 211} 212 213; Function Attrs: norecurse nounwind readnone 214define signext i32 @modulo_const3_sw(i32 signext %a) local_unnamed_addr { 215entry: 216 %rem = srem i32 %a, 3 217 ret i32 %rem 218; CHECK-LABEL: modulo_const3_sw 219; CHECK-NOT: modsw 220; CHECK: mulh 221; CHECK-NOT: modsw 222; CHECK: sub 223; CHECK-NOT: modsw 224; CHECK: blr 225; CHECK-PWR8-LABEL: modulo_const3_sw 226; CHECK-PWR8: mulh 227; CHECK-PWR8: sub 228; CHECK-PWR8: blr 229} 230 231; Function Attrs: norecurse nounwind readnone 232define signext i32 @const2_modulo_sw(i32 signext %a) local_unnamed_addr { 233entry: 234 %rem = srem i32 2, %a 235 ret i32 %rem 236; CHECK-LABEL: const2_modulo_sw 237; CHECK: modsw {{[0-9]+}}, {{[0-9]+}}, 3 238; CHECK: blr 239; CHECK-PWR8-LABEL: const2_modulo_sw 240; CHECK-PWR8: div 241; CHECK-PWR8: mull 242; CHECK-PWR8: sub 243; CHECK-PWR8: blr 244} 245 246; Function Attrs: norecurse nounwind 247define void @blocks_modulo_div_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr { 248entry: 249 %div = sdiv i32 %a, %b 250 store i32 %div, ptr @div_resultsw, align 4 251 %cmp = icmp sgt i32 %c, 0 252 br i1 %cmp, label %if.then, label %if.end 253 254if.then: ; preds = %entry 255 %rem = srem i32 %a, %b 256 store i32 %rem, ptr @mod_resultsw, align 4 257 br label %if.end 258 259if.end: ; preds = %if.then, %entry 260 ret void 261; CHECK-LABEL: blocks_modulo_div_sw 262; CHECK: div 263; CHECK: modsw {{[0-9]+}}, 3, 4 264; CHECK: blr 265; CHECK-DRP-LABEL: blocks_modulo_div_sw 266; CHECK-DRP-NOT: modsw 267; CHECK-DRP: div 268; CHECK-DRP-NOT: modsw 269; CHECK-DRP: mull 270; CHECK-DRP-NOT: modsw 271; CHECK-DRP: sub 272; CHECK-DRP: blr 273; CHECK-PWR8-LABEL: blocks_modulo_div_sw 274; CHECK-PWR8: div 275; CHECK-PWR8: mull 276; CHECK-PWR8: sub 277; CHECK-PWR8: blr 278} 279 280