1 ; RUN: llc < %s -march=arm64 | FileCheck %s 2 3 ; rdar://9296808 4 ; rdar://9349137 5 6 define i128 @t1(i64 %a, i64 %b) nounwind readnone ssp { 7 entry: 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 17 define i128 @t2(i64 %a, i64 %b) nounwind readnone ssp { 18 entry: 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 28 define i64 @t3(i32 %a, i32 %b) nounwind { 29 entry: 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 38 define i64 @t4(i32 %a, i32 %b) nounwind { 39 entry: 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 48 define i64 @t5(i32 %a, i32 %b, i64 %c) nounwind { 49 entry: 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 59 define i64 @t6(i32 %a, i32 %b, i64 %c) nounwind { 60 entry: 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 70 define i64 @t7(i32 %a, i32 %b) nounwind { 71 entry: 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 81 define i64 @t8(i32 %a, i32 %b) nounwind { 82 entry: 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 92 define i64 @t9(i32 %a) nounwind { 93 entry: 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. 102 define i64 @t10(i32 %a) nounwind { 103 entry: 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. 112 define i64 @t11(i64 %a) nounwind { 113 entry: 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 123 define i64 @t12(i64 %a, i64 %b) nounwind { 124 entry: 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 134 define i64 @t13(i32 %a, i64 %b) nounwind { 135 entry: 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 144 define i64 @t14(i32 %a, i64 %b) nounwind { 145 entry: 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