1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; rdar://9296808 4*9880d681SAndroid Build Coastguard Worker; rdar://9349137 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i128 @t1(i64 %a, i64 %b) nounwind readnone ssp { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1: 9*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 10*9880d681SAndroid Build Coastguard Worker; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 11*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i64 %a to i128 12*9880d681SAndroid Build Coastguard Worker %tmp2 = zext i64 %b to i128 13*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i128 %tmp1, %tmp2 14*9880d681SAndroid Build Coastguard Worker ret i128 %tmp3 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i128 @t2(i64 %a, i64 %b) nounwind readnone ssp { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 20*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 21*9880d681SAndroid Build Coastguard Worker; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 22*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i64 %a to i128 23*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i64 %b to i128 24*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i128 %tmp1, %tmp2 25*9880d681SAndroid Build Coastguard Worker ret i128 %tmp3 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(i32 %a, i32 %b) nounwind { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 31*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 32*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i32 %a to i64 33*9880d681SAndroid Build Coastguard Worker %tmp2 = zext i32 %b to i64 34*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 35*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i64 @t4(i32 %a, i32 %b) nounwind { 39*9880d681SAndroid Build Coastguard Workerentry: 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 41*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 42*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i32 %a to i64 43*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i32 %b to i64 44*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 45*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i32 %a, i32 %b, i64 %c) nounwind { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 51*9880d681SAndroid Build Coastguard Worker; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 52*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i32 %a to i64 53*9880d681SAndroid Build Coastguard Worker %tmp2 = zext i32 %b to i64 54*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 55*9880d681SAndroid Build Coastguard Worker %tmp4 = add i64 %c, %tmp3 56*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i64 @t6(i32 %a, i32 %b, i64 %c) nounwind { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t6: 62*9880d681SAndroid Build Coastguard Worker; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 63*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i32 %a to i64 64*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i32 %b to i64 65*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 66*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 %c, %tmp3 67*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine i64 @t7(i32 %a, i32 %b) nounwind { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t7: 73*9880d681SAndroid Build Coastguard Worker; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 74*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i32 %a to i64 75*9880d681SAndroid Build Coastguard Worker %tmp2 = zext i32 %b to i64 76*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 77*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 0, %tmp3 78*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine i64 @t8(i32 %a, i32 %b) nounwind { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t8: 84*9880d681SAndroid Build Coastguard Worker; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 85*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i32 %a to i64 86*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i32 %b to i64 87*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, %tmp2 88*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 0, %tmp3 89*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine i64 @t9(i32 %a) nounwind { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t9: 95*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 96*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i32 %a to i64 97*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i64 %tmp1, 139968 98*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; Check 64-bit multiplication is used for constants > 32 bits. 102*9880d681SAndroid Build Coastguard Workerdefine i64 @t10(i32 %a) nounwind { 103*9880d681SAndroid Build Coastguard Workerentry: 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t10: 105*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 106*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i32 %a to i64 107*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i64 %tmp1, 2147483650 ; = 2^31 + 2 108*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Check the sext_inreg case. 112*9880d681SAndroid Build Coastguard Workerdefine i64 @t11(i64 %a) nounwind { 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t11: 115*9880d681SAndroid Build Coastguard Worker; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 116*9880d681SAndroid Build Coastguard Worker %tmp1 = trunc i64 %a to i32 117*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i32 %tmp1 to i64 118*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp2, -2395238 119*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 0, %tmp3 120*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i64 @t12(i64 %a, i64 %b) nounwind { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t12: 126*9880d681SAndroid Build Coastguard Worker; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 127*9880d681SAndroid Build Coastguard Worker %tmp1 = trunc i64 %a to i32 128*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i32 %tmp1 to i64 129*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp2, -34567890 130*9880d681SAndroid Build Coastguard Worker %tmp4 = add i64 %b, %tmp3 131*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine i64 @t13(i32 %a, i64 %b) nounwind { 135*9880d681SAndroid Build Coastguard Workerentry: 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t13: 137*9880d681SAndroid Build Coastguard Worker; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 138*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i32 %a to i64 139*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, 12345678 140*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 %b, %tmp3 141*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine i64 @t14(i32 %a, i64 %b) nounwind { 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t14: 147*9880d681SAndroid Build Coastguard Worker; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 148*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i32 %a to i64 149*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i64 %tmp1, -12345678 150*9880d681SAndroid Build Coastguard Worker %tmp4 = sub i64 %b, %tmp3 151*9880d681SAndroid Build Coastguard Worker ret i64 %tmp4 152*9880d681SAndroid Build Coastguard Worker} 153