107 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_urem_positive_odd(i32 %x) {6; CHECK-LABEL: fold_urem_positive_odd:7; CHECK: # %bb.0:8; CHECK-NEXT: lis 4, 227659; CHECK-NEXT: ori 4, 4, 896910; CHECK-NEXT: mulhwu 4, 3, 411; CHECK-NEXT: sub 5, 3, 412; CHECK-NEXT: srwi 5, 5, 113; CHECK-NEXT: add 4, 5, 414; CHECK-NEXT: srwi 4, 4, 615; CHECK-NEXT: mulli 4, 4, 9516; CHECK-NEXT: sub 3, 3, 417; CHECK-NEXT: blr18 %1 = urem i32 %x, 9519 ret i32 %120}21 22 23define i32 @fold_urem_positive_even(i32 %x) {24; CHECK-LABEL: fold_urem_positive_even:25; CHECK: # %bb.0:26; CHECK-NEXT: lis 4, -222627; CHECK-NEXT: ori 4, 4, 1632328; CHECK-NEXT: mulhwu 4, 3, 429; CHECK-NEXT: srwi 4, 4, 1030; CHECK-NEXT: mulli 4, 4, 106031; CHECK-NEXT: sub 3, 3, 432; CHECK-NEXT: blr33 %1 = urem i32 %x, 106034 ret i32 %135}36 37 38; Don't fold if we can combine urem with udiv.39define i32 @combine_urem_udiv(i32 %x) {40; CHECK-LABEL: combine_urem_udiv:41; CHECK: # %bb.0:42; CHECK-NEXT: lis 4, 2276543; CHECK-NEXT: ori 4, 4, 896944; CHECK-NEXT: mulhwu 4, 3, 445; CHECK-NEXT: sub 5, 3, 446; CHECK-NEXT: srwi 5, 5, 147; CHECK-NEXT: add 4, 5, 448; CHECK-NEXT: srwi 4, 4, 649; CHECK-NEXT: mulli 5, 4, 9550; CHECK-NEXT: sub 3, 3, 551; CHECK-NEXT: add 3, 3, 452; CHECK-NEXT: blr53 %1 = urem i32 %x, 9554 %2 = udiv i32 %x, 9555 %3 = add i32 %1, %256 ret i32 %357}58 59; Don't fold for divisors that are a power of two.60define i32 @dont_fold_urem_power_of_two(i32 %x) {61; CHECK-LABEL: dont_fold_urem_power_of_two:62; CHECK: # %bb.0:63; CHECK-NEXT: clrlwi 3, 3, 2664; CHECK-NEXT: blr65 %1 = urem i32 %x, 6466 ret i32 %167}68 69; Don't fold if the divisor is one.70define i32 @dont_fold_urem_one(i32 %x) {71; CHECK-LABEL: dont_fold_urem_one:72; CHECK: # %bb.0:73; CHECK-NEXT: li 3, 074; CHECK-NEXT: blr75 %1 = urem i32 %x, 176 ret i32 %177}78 79; Don't fold if the divisor is 2^32.80define i32 @dont_fold_urem_i32_umax(i32 %x) {81; CHECK-LABEL: dont_fold_urem_i32_umax:82; CHECK: # %bb.0:83; CHECK-NEXT: blr84 %1 = urem i32 %x, 429496729685 ret i32 %186}87 88; Don't fold i64 urem89define i64 @dont_fold_urem_i64(i64 %x) {90; CHECK-LABEL: dont_fold_urem_i64:91; CHECK: # %bb.0:92; CHECK-NEXT: mflr 093; CHECK-NEXT: stwu 1, -16(1)94; CHECK-NEXT: stw 0, 20(1)95; CHECK-NEXT: .cfi_def_cfa_offset 1696; CHECK-NEXT: .cfi_offset lr, 497; CHECK-NEXT: li 5, 098; CHECK-NEXT: li 6, 9899; CHECK-NEXT: bl __umoddi3100; CHECK-NEXT: lwz 0, 20(1)101; CHECK-NEXT: addi 1, 1, 16102; CHECK-NEXT: mtlr 0103; CHECK-NEXT: blr104 %1 = urem i64 %x, 98105 ret i64 %1106}107