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