1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips3 | \ 2*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips4 | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64 | \ 6*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | \ 8*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 9*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | \ 10*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 11*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | \ 12*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,PRE-R6 13*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | \ 14*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,R6 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; Check that we don't emit redundant SLLs for sequences of 17*9880d681SAndroid Build Coastguard Worker; (AssertZext:i32 (trunc:i32 (AssertZext:i64 X, i32)), i8) 18*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @udiv_i8(i8 zeroext %a, i8 zeroext %b) { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: udiv_i8: 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker ; PRE-R6-NOT: sll {{.*}} 23*9880d681SAndroid Build Coastguard Worker ; PRE-R6: divu $zero, $4, $5 24*9880d681SAndroid Build Coastguard Worker ; PRE-R6: teq $5, $zero, 7 25*9880d681SAndroid Build Coastguard Worker ; PRE-R6: mflo $2 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker ; R6-NOT: sll {{.*}} 28*9880d681SAndroid Build Coastguard Worker ; R6: divu $2, $4, $5 29*9880d681SAndroid Build Coastguard Worker ; R6: teq $5, $zero, 7 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker %r = udiv i8 %a, %b 32*9880d681SAndroid Build Coastguard Worker ret i8 %r 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; Check that we do sign-extend when we have a (trunc:i32 (AssertZext:i64 X, i32)) 36*9880d681SAndroid Build Coastguard Workerdefine i64 @foo1(i64 zeroext %var) { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: foo1: 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker %shr = lshr i64 %var, 32 41*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %shr, 0 42*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.end6, label %if.then 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker ; ALL: dsrl $[[T0:[0-9]+]], $4, 32 45*9880d681SAndroid Build Coastguard Worker ; ALL: sll $[[T1:[0-9]+]], $[[T0]], 0 46*9880d681SAndroid Build Coastguard Worker if.then: ; preds = %entry 47*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %shr to i32 48*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp slt i32 %conv, 0 49*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %if.then4, label %if.else 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker if.then4: ; preds = %if.then 52*9880d681SAndroid Build Coastguard Worker %add = add i64 %var, 16 53*9880d681SAndroid Build Coastguard Worker br label %if.end6 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker if.else: ; preds = %if.then 56*9880d681SAndroid Build Coastguard Worker %add5 = add i64 %var, 32 57*9880d681SAndroid Build Coastguard Worker br label %if.end6 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker if.end6: ; preds = %entry, %if.then4, %if.else 60*9880d681SAndroid Build Coastguard Worker %var.addr.0 = phi i64 [ %add, %if.then4 ], [ %add5, %if.else ], [ %var, %entry ] 61*9880d681SAndroid Build Coastguard Worker ret i64 %var.addr.0 62*9880d681SAndroid Build Coastguard Worker} 63