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