1*9880d681SAndroid Build Coastguard Worker; Test high-part i32->i64 multiplications. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; We don't provide *MUL_LOHI or MULH* for the patterns in this file, 6*9880d681SAndroid Build Coastguard Worker; but they should at least still work. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; Check zero-extended multiplication in which only the high part is used. 9*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a, i32 %b) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 11*9880d681SAndroid Build Coastguard Worker; CHECK: msgr 12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 13*9880d681SAndroid Build Coastguard Worker %ax = zext i32 %a to i64 14*9880d681SAndroid Build Coastguard Worker %bx = zext i32 %b to i64 15*9880d681SAndroid Build Coastguard Worker %mulx = mul i64 %ax, %bx 16*9880d681SAndroid Build Coastguard Worker %highx = lshr i64 %mulx, 32 17*9880d681SAndroid Build Coastguard Worker %high = trunc i64 %highx to i32 18*9880d681SAndroid Build Coastguard Worker ret i32 %high 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Check sign-extended multiplication in which only the high part is used. 22*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 24*9880d681SAndroid Build Coastguard Worker; CHECK: msgfr 25*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 26*9880d681SAndroid Build Coastguard Worker %ax = sext i32 %a to i64 27*9880d681SAndroid Build Coastguard Worker %bx = sext i32 %b to i64 28*9880d681SAndroid Build Coastguard Worker %mulx = mul i64 %ax, %bx 29*9880d681SAndroid Build Coastguard Worker %highx = lshr i64 %mulx, 32 30*9880d681SAndroid Build Coastguard Worker %high = trunc i64 %highx to i32 31*9880d681SAndroid Build Coastguard Worker ret i32 %high 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; Check zero-extended multiplication in which the result is split into 35*9880d681SAndroid Build Coastguard Worker; high and low halves. 36*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 38*9880d681SAndroid Build Coastguard Worker; CHECK: msgr 39*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 40*9880d681SAndroid Build Coastguard Worker %ax = zext i32 %a to i64 41*9880d681SAndroid Build Coastguard Worker %bx = zext i32 %b to i64 42*9880d681SAndroid Build Coastguard Worker %mulx = mul i64 %ax, %bx 43*9880d681SAndroid Build Coastguard Worker %highx = lshr i64 %mulx, 32 44*9880d681SAndroid Build Coastguard Worker %high = trunc i64 %highx to i32 45*9880d681SAndroid Build Coastguard Worker %low = trunc i64 %mulx to i32 46*9880d681SAndroid Build Coastguard Worker %or = or i32 %high, %low 47*9880d681SAndroid Build Coastguard Worker ret i32 %or 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; Check sign-extended multiplication in which the result is split into 51*9880d681SAndroid Build Coastguard Worker; high and low halves. 52*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %b) { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 54*9880d681SAndroid Build Coastguard Worker; CHECK: msgfr 55*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 56*9880d681SAndroid Build Coastguard Worker %ax = sext i32 %a to i64 57*9880d681SAndroid Build Coastguard Worker %bx = sext i32 %b to i64 58*9880d681SAndroid Build Coastguard Worker %mulx = mul i64 %ax, %bx 59*9880d681SAndroid Build Coastguard Worker %highx = lshr i64 %mulx, 32 60*9880d681SAndroid Build Coastguard Worker %high = trunc i64 %highx to i32 61*9880d681SAndroid Build Coastguard Worker %low = trunc i64 %mulx to i32 62*9880d681SAndroid Build Coastguard Worker %or = or i32 %high, %low 63*9880d681SAndroid Build Coastguard Worker ret i32 %or 64*9880d681SAndroid Build Coastguard Worker} 65