1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O2 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-n32:64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64le-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1 6*9880d681SAndroid Build Coastguard Workerdefine i8 @test1(i32 %a) { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rlwinm {{{[0-9]+}}}, {{[0-9]+}}, 0, 24, 27 9*9880d681SAndroid Build Coastguard Worker; CHECK: rlwinm. [[REG:[0-9]+]], {{[0-9]+}}, 0, 24, 27 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmplwi [[REG]], 0 11*9880d681SAndroid Build Coastguard Worker; CHECK: beq 0 12*9880d681SAndroid Build Coastguard Worker %0 = and i32 %a, 240 13*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 14*9880d681SAndroid Build Coastguard Worker br i1 %1, label %eq0, label %neq0 15*9880d681SAndroid Build Coastguard Workereq0: 16*9880d681SAndroid Build Coastguard Worker ret i8 102 17*9880d681SAndroid Build Coastguard Workerneq0: 18*9880d681SAndroid Build Coastguard Worker ret i8 116 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 22*9880d681SAndroid Build Coastguard Workerdefine i8 @test2(i32 %a) { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker; CHECK: rlwinm [[REG:[0-9]+]], {{[0-9]+}}, 0, 28, 23 25*9880d681SAndroid Build Coastguard Worker; CHECK: cmplwi [[REG]], 0 26*9880d681SAndroid Build Coastguard Worker; CHECK: beq 0 27*9880d681SAndroid Build Coastguard Worker %0 = and i32 %a, -241 28*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 29*9880d681SAndroid Build Coastguard Worker br i1 %1, label %eq0, label %neq0 30*9880d681SAndroid Build Coastguard Workereq0: 31*9880d681SAndroid Build Coastguard Worker ret i8 102 32*9880d681SAndroid Build Coastguard Workerneq0: 33*9880d681SAndroid Build Coastguard Worker ret i8 116 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.ssub.with.overflow.i32(i32 %a, i32 %b) 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3 39*9880d681SAndroid Build Coastguard Workerdefine i8 @test3(i32 %a, i32 %b) { 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rlwnm {{{[0-9]+}}}, {{[0-9]+}}, {{{[0-9]+}}}, 28, 31 42*9880d681SAndroid Build Coastguard Worker; CHECK: rlwnm. [[REG:[0-9]+]], {{[0-9]+}}, 4, 28, 31 43*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmplwi [[REG]], 0 44*9880d681SAndroid Build Coastguard Worker; CHECK: beq 0 45*9880d681SAndroid Build Coastguard Worker %left = shl i32 %a, %b 46*9880d681SAndroid Build Coastguard Worker %res = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 32, i32 %b) 47*9880d681SAndroid Build Coastguard Worker %right_amount = extractvalue {i32, i1} %res, 0 48*9880d681SAndroid Build Coastguard Worker %right = lshr i32 %a, %right_amount 49*9880d681SAndroid Build Coastguard Worker %0 = or i32 %left, %right 50*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 15 51*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i32 %1, 0 52*9880d681SAndroid Build Coastguard Worker br i1 %2, label %eq0, label %neq0 53*9880d681SAndroid Build Coastguard Workereq0: 54*9880d681SAndroid Build Coastguard Worker ret i8 102 55*9880d681SAndroid Build Coastguard Workerneq0: 56*9880d681SAndroid Build Coastguard Worker ret i8 116 57*9880d681SAndroid Build Coastguard Worker} 58