150 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu -mcpu=ppc64 < %s | FileCheck --check-prefix=CHECK %s3; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu -mcpu=ppc < %s | FileCheck --check-prefix=CHECK %s4 5define i32 @fold_srem_positive_odd(i32 %x) {6; CHECK-LABEL: fold_srem_positive_odd:7; CHECK: # %bb.0:8; CHECK-NEXT: lis 4, -213869; CHECK-NEXT: ori 4, 4, 3725310; CHECK-NEXT: mulhw 4, 3, 411; CHECK-NEXT: add 4, 4, 312; CHECK-NEXT: srwi 5, 4, 3113; CHECK-NEXT: srawi 4, 4, 614; CHECK-NEXT: add 4, 4, 515; CHECK-NEXT: mulli 4, 4, 9516; CHECK-NEXT: sub 3, 3, 417; CHECK-NEXT: blr18 %1 = srem i32 %x, 9519 ret i32 %120}21 22 23define i32 @fold_srem_positive_even(i32 %x) {24; CHECK-LABEL: fold_srem_positive_even:25; CHECK: # %bb.0:26; CHECK-NEXT: lis 4, 1582727; CHECK-NEXT: ori 4, 4, 3684928; CHECK-NEXT: mulhw 4, 3, 429; CHECK-NEXT: srwi 5, 4, 3130; CHECK-NEXT: srawi 4, 4, 831; CHECK-NEXT: add 4, 4, 532; CHECK-NEXT: mulli 4, 4, 106033; CHECK-NEXT: sub 3, 3, 434; CHECK-NEXT: blr35 %1 = srem i32 %x, 106036 ret i32 %137}38 39 40define i32 @fold_srem_negative_odd(i32 %x) {41; CHECK-LABEL: fold_srem_negative_odd:42; CHECK: # %bb.0:43; CHECK-NEXT: lis 4, -2320644; CHECK-NEXT: ori 4, 4, 6544545; CHECK-NEXT: mulhw 4, 3, 446; CHECK-NEXT: srwi 5, 4, 3147; CHECK-NEXT: srawi 4, 4, 848; CHECK-NEXT: add 4, 4, 549; CHECK-NEXT: mulli 4, 4, -72350; CHECK-NEXT: sub 3, 3, 451; CHECK-NEXT: blr52 %1 = srem i32 %x, -72353 ret i32 %154}55 56 57define i32 @fold_srem_negative_even(i32 %x) {58; CHECK-LABEL: fold_srem_negative_even:59; CHECK: # %bb.0:60; CHECK-NEXT: lis 4, -73161; CHECK-NEXT: ori 4, 4, 6243962; CHECK-NEXT: mulhw 4, 3, 463; CHECK-NEXT: srwi 5, 4, 3164; CHECK-NEXT: srawi 4, 4, 865; CHECK-NEXT: add 4, 4, 566; CHECK-NEXT: mulli 4, 4, -2298167; CHECK-NEXT: sub 3, 3, 468; CHECK-NEXT: blr69 %1 = srem i32 %x, -2298170 ret i32 %171}72 73 74; Don't fold if we can combine srem with sdiv.75define i32 @combine_srem_sdiv(i32 %x) {76; CHECK-LABEL: combine_srem_sdiv:77; CHECK: # %bb.0:78; CHECK-NEXT: lis 4, -2138679; CHECK-NEXT: ori 4, 4, 3725380; CHECK-NEXT: mulhw 4, 3, 481; CHECK-NEXT: add 4, 4, 382; CHECK-NEXT: srwi 5, 4, 3183; CHECK-NEXT: srawi 4, 4, 684; CHECK-NEXT: add 4, 4, 585; CHECK-NEXT: mulli 5, 4, 9586; CHECK-NEXT: sub 3, 3, 587; CHECK-NEXT: add 3, 3, 488; CHECK-NEXT: blr89 %1 = srem i32 %x, 9590 %2 = sdiv i32 %x, 9591 %3 = add i32 %1, %292 ret i32 %393}94 95; Don't fold for divisors that are a power of two.96define i32 @dont_fold_srem_power_of_two(i32 %x) {97; CHECK-LABEL: dont_fold_srem_power_of_two:98; CHECK: # %bb.0:99; CHECK-NEXT: srawi 4, 3, 6100; CHECK-NEXT: addze 4, 4101; CHECK-NEXT: slwi 4, 4, 6102; CHECK-NEXT: sub 3, 3, 4103; CHECK-NEXT: blr104 %1 = srem i32 %x, 64105 ret i32 %1106}107 108; Don't fold if the divisor is one.109define i32 @dont_fold_srem_one(i32 %x) {110; CHECK-LABEL: dont_fold_srem_one:111; CHECK: # %bb.0:112; CHECK-NEXT: li 3, 0113; CHECK-NEXT: blr114 %1 = srem i32 %x, 1115 ret i32 %1116}117 118; Don't fold if the divisor is 2^31.119define i32 @dont_fold_srem_i32_smax(i32 %x) {120; CHECK-LABEL: dont_fold_srem_i32_smax:121; CHECK: # %bb.0:122; CHECK-NEXT: srawi 4, 3, 31123; CHECK-NEXT: addze 4, 4124; CHECK-NEXT: slwi 4, 4, 31125; CHECK-NEXT: add 3, 3, 4126; CHECK-NEXT: blr127 %1 = srem i32 %x, 2147483648128 ret i32 %1129}130 131; Don't fold i64 srem132define i64 @dont_fold_srem_i64(i64 %x) {133; CHECK-LABEL: dont_fold_srem_i64:134; CHECK: # %bb.0:135; CHECK-NEXT: mflr 0136; CHECK-NEXT: stwu 1, -16(1)137; CHECK-NEXT: stw 0, 20(1)138; CHECK-NEXT: .cfi_def_cfa_offset 16139; CHECK-NEXT: .cfi_offset lr, 4140; CHECK-NEXT: li 5, 0141; CHECK-NEXT: li 6, 98142; CHECK-NEXT: bl __moddi3143; CHECK-NEXT: lwz 0, 20(1)144; CHECK-NEXT: addi 1, 1, 16145; CHECK-NEXT: mtlr 0146; CHECK-NEXT: blr147 %1 = srem i64 %x, 98148 ret i64 %1149}150