1 ; Test 64-bit multiplication in which the second operand is constant. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 ; Check multiplication by 2, which should use shifts. 6 define i64 @f1(i64 %a, i64 *%dest) { 7 ; CHECK-LABEL: f1: 8 ; CHECK: sllg %r2, %r2, 1 9 ; CHECK: br %r14 10 %mul = mul i64 %a, 2 11 ret i64 %mul 12 } 13 14 ; Check multiplication by 3. 15 define i64 @f2(i64 %a, i64 *%dest) { 16 ; CHECK-LABEL: f2: 17 ; CHECK: mghi %r2, 3 18 ; CHECK: br %r14 19 %mul = mul i64 %a, 3 20 ret i64 %mul 21 } 22 23 ; Check the high end of the MGHI range. 24 define i64 @f3(i64 %a, i64 *%dest) { 25 ; CHECK-LABEL: f3: 26 ; CHECK: mghi %r2, 32767 27 ; CHECK: br %r14 28 %mul = mul i64 %a, 32767 29 ret i64 %mul 30 } 31 32 ; Check the next value up, which should use shifts. 33 define i64 @f4(i64 %a, i64 *%dest) { 34 ; CHECK-LABEL: f4: 35 ; CHECK: sllg %r2, %r2, 15 36 ; CHECK: br %r14 37 %mul = mul i64 %a, 32768 38 ret i64 %mul 39 } 40 41 ; Check the next value up again, which can use MSGFI. 42 define i64 @f5(i64 %a, i64 *%dest) { 43 ; CHECK-LABEL: f5: 44 ; CHECK: msgfi %r2, 32769 45 ; CHECK: br %r14 46 %mul = mul i64 %a, 32769 47 ret i64 %mul 48 } 49 50 ; Check the high end of the MSGFI range. 51 define i64 @f6(i64 %a, i64 *%dest) { 52 ; CHECK-LABEL: f6: 53 ; CHECK: msgfi %r2, 2147483647 54 ; CHECK: br %r14 55 %mul = mul i64 %a, 2147483647 56 ret i64 %mul 57 } 58 59 ; Check the next value up, which should use shifts. 60 define i64 @f7(i64 %a, i64 *%dest) { 61 ; CHECK-LABEL: f7: 62 ; CHECK: sllg %r2, %r2, 31 63 ; CHECK: br %r14 64 %mul = mul i64 %a, 2147483648 65 ret i64 %mul 66 } 67 68 ; Check the next value up again, which cannot use a constant multiplicatoin. 69 define i64 @f8(i64 %a, i64 *%dest) { 70 ; CHECK-LABEL: f8: 71 ; CHECK-NOT: msgfi 72 ; CHECK: br %r14 73 %mul = mul i64 %a, 2147483649 74 ret i64 %mul 75 } 76 77 ; Check multiplication by -1, which is a negation. 78 define i64 @f9(i64 %a, i64 *%dest) { 79 ; CHECK-LABEL: f9: 80 ; CHECK: lcgr {{%r[0-5]}}, %r2 81 ; CHECK: br %r14 82 %mul = mul i64 %a, -1 83 ret i64 %mul 84 } 85 86 ; Check multiplication by -2, which should use shifts. 87 define i64 @f10(i64 %a, i64 *%dest) { 88 ; CHECK-LABEL: f10: 89 ; CHECK: sllg [[SHIFTED:%r[0-5]]], %r2, 1 90 ; CHECK: lcgr %r2, [[SHIFTED]] 91 ; CHECK: br %r14 92 %mul = mul i64 %a, -2 93 ret i64 %mul 94 } 95 96 ; Check multiplication by -3. 97 define i64 @f11(i64 %a, i64 *%dest) { 98 ; CHECK-LABEL: f11: 99 ; CHECK: mghi %r2, -3 100 ; CHECK: br %r14 101 %mul = mul i64 %a, -3 102 ret i64 %mul 103 } 104 105 ; Check the lowest useful MGHI value. 106 define i64 @f12(i64 %a, i64 *%dest) { 107 ; CHECK-LABEL: f12: 108 ; CHECK: mghi %r2, -32767 109 ; CHECK: br %r14 110 %mul = mul i64 %a, -32767 111 ret i64 %mul 112 } 113 114 ; Check the next value down, which should use shifts. 115 define i64 @f13(i64 %a, i64 *%dest) { 116 ; CHECK-LABEL: f13: 117 ; CHECK: sllg [[SHIFTED:%r[0-5]]], %r2, 15 118 ; CHECK: lcgr %r2, [[SHIFTED]] 119 ; CHECK: br %r14 120 %mul = mul i64 %a, -32768 121 ret i64 %mul 122 } 123 124 ; Check the next value down again, which can use MSGFI. 125 define i64 @f14(i64 %a, i64 *%dest) { 126 ; CHECK-LABEL: f14: 127 ; CHECK: msgfi %r2, -32769 128 ; CHECK: br %r14 129 %mul = mul i64 %a, -32769 130 ret i64 %mul 131 } 132 133 ; Check the lowest useful MSGFI value. 134 define i64 @f15(i64 %a, i64 *%dest) { 135 ; CHECK-LABEL: f15: 136 ; CHECK: msgfi %r2, -2147483647 137 ; CHECK: br %r14 138 %mul = mul i64 %a, -2147483647 139 ret i64 %mul 140 } 141 142 ; Check the next value down, which should use shifts. 143 define i64 @f16(i64 %a, i64 *%dest) { 144 ; CHECK-LABEL: f16: 145 ; CHECK: sllg [[SHIFTED:%r[0-5]]], %r2, 31 146 ; CHECK: lcgr %r2, [[SHIFTED]] 147 ; CHECK: br %r14 148 %mul = mul i64 %a, -2147483648 149 ret i64 %mul 150 } 151 152 ; Check the next value down again, which cannot use constant multiplication 153 define i64 @f17(i64 %a, i64 *%dest) { 154 ; CHECK-LABEL: f17: 155 ; CHECK-NOT: msgfi 156 ; CHECK: br %r14 157 %mul = mul i64 %a, -2147483649 158 ret i64 %mul 159 } 160