1e25b30d9SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub 2e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \ 3cd3c1658SCraig Topper; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I 4e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+m,+xtheadba -verify-machineinstrs < %s \ 5cd3c1658SCraig Topper; RUN: | FileCheck %s -check-prefixes=CHECK,RV32XTHEADBA 6e25b30d9SPhilipp Tomsich 7e25b30d9SPhilipp Tomsichdefine signext i16 @th_addsl_1(i64 %0, ptr %1) { 8e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_1: 9e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 10e25b30d9SPhilipp Tomsich; RV32I-NEXT: slli a0, a0, 1 11e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a2, a0 12e25b30d9SPhilipp Tomsich; RV32I-NEXT: lh a0, 0(a0) 13e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 14e25b30d9SPhilipp Tomsich; 15e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_1: 16e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 17e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a2, a0, 1 18e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: lh a0, 0(a0) 19e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 20e25b30d9SPhilipp Tomsich %3 = getelementptr inbounds i16, ptr %1, i64 %0 21e25b30d9SPhilipp Tomsich %4 = load i16, ptr %3 22e25b30d9SPhilipp Tomsich ret i16 %4 23e25b30d9SPhilipp Tomsich} 24e25b30d9SPhilipp Tomsich 25e25b30d9SPhilipp Tomsichdefine signext i32 @th_addsl_2(i64 %0, ptr %1) { 26e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_2: 27e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 28e25b30d9SPhilipp Tomsich; RV32I-NEXT: slli a0, a0, 2 29e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a2, a0 30e25b30d9SPhilipp Tomsich; RV32I-NEXT: lw a0, 0(a0) 31e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 32e25b30d9SPhilipp Tomsich; 33e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_2: 34e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 35e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a2, a0, 2 36e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: lw a0, 0(a0) 37e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 38e25b30d9SPhilipp Tomsich %3 = getelementptr inbounds i32, ptr %1, i64 %0 39e25b30d9SPhilipp Tomsich %4 = load i32, ptr %3 40e25b30d9SPhilipp Tomsich ret i32 %4 41e25b30d9SPhilipp Tomsich} 42e25b30d9SPhilipp Tomsich 43e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_3(i64 %0, ptr %1) { 44e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_3: 45e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 46e25b30d9SPhilipp Tomsich; RV32I-NEXT: slli a0, a0, 3 47e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a2, a2, a0 48e25b30d9SPhilipp Tomsich; RV32I-NEXT: lw a0, 0(a2) 49e25b30d9SPhilipp Tomsich; RV32I-NEXT: lw a1, 4(a2) 50e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 51e25b30d9SPhilipp Tomsich; 52e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_3: 53e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 54e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a1, a2, a0, 3 55e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: lw a0, 0(a1) 56e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: lw a1, 4(a1) 57e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 58e25b30d9SPhilipp Tomsich %3 = getelementptr inbounds i64, ptr %1, i64 %0 59e25b30d9SPhilipp Tomsich %4 = load i64, ptr %3 60e25b30d9SPhilipp Tomsich ret i64 %4 61e25b30d9SPhilipp Tomsich} 62e25b30d9SPhilipp Tomsich 63e25b30d9SPhilipp Tomsich; Type legalization inserts a sext_inreg after the first add. That add will be 64e25b30d9SPhilipp Tomsich; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable 65e25b30d9SPhilipp Tomsich; to remove the sext_inreg because it has multiple uses. The ashr will use the 66e25b30d9SPhilipp Tomsich; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl. 67e25b30d9SPhilipp Tomsich; If the shl is selected as sllw, we don't need the sext_inreg. 68e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) { 69e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_2_extra_sext: 70e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 71e25b30d9SPhilipp Tomsich; RV32I-NEXT: slli a0, a0, 2 72e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 73e25b30d9SPhilipp Tomsich; RV32I-NEXT: sll a1, a2, a0 74e25b30d9SPhilipp Tomsich; RV32I-NEXT: srai a2, a0, 2 75e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a1, a2 76e25b30d9SPhilipp Tomsich; RV32I-NEXT: mulh a1, a1, a2 77e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 78e25b30d9SPhilipp Tomsich; 79e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_2_extra_sext: 80e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 81e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 82e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: sll a1, a2, a0 83e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: srai a2, a0, 2 84e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: mul a0, a1, a2 85e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: mulh a1, a1, a2 86e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 87e25b30d9SPhilipp Tomsich %a = shl i32 %x, 2 88e25b30d9SPhilipp Tomsich %b = add i32 %a, %y 89e25b30d9SPhilipp Tomsich %c = shl i32 %z, %b 90e25b30d9SPhilipp Tomsich %d = ashr i32 %b, 2 91e25b30d9SPhilipp Tomsich %e = sext i32 %c to i64 92e25b30d9SPhilipp Tomsich %f = sext i32 %d to i64 93e25b30d9SPhilipp Tomsich %g = mul i64 %e, %f 94e25b30d9SPhilipp Tomsich ret i64 %g 95e25b30d9SPhilipp Tomsich} 96e25b30d9SPhilipp Tomsich 97e25b30d9SPhilipp Tomsichdefine i32 @addmul6(i32 %a, i32 %b) { 98e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul6: 99e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 1003e55ac94SPhilip Reames; RV32I-NEXT: slli a2, a0, 1 1013e55ac94SPhilip Reames; RV32I-NEXT: slli a0, a0, 3 1023e55ac94SPhilip Reames; RV32I-NEXT: sub a0, a0, a2 103e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 104e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 105e25b30d9SPhilipp Tomsich; 106e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul6: 107e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 108e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 109e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 110e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 111e25b30d9SPhilipp Tomsich %c = mul i32 %a, 6 112e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 113e25b30d9SPhilipp Tomsich ret i32 %d 114e25b30d9SPhilipp Tomsich} 115e25b30d9SPhilipp Tomsich 116e25b30d9SPhilipp Tomsichdefine i32 @addmul10(i32 %a, i32 %b) { 117e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul10: 118e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 119e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 10 120e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 121e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 122e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 123e25b30d9SPhilipp Tomsich; 124e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul10: 125e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 126e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 127e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 128e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 129e25b30d9SPhilipp Tomsich %c = mul i32 %a, 10 130e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 131e25b30d9SPhilipp Tomsich ret i32 %d 132e25b30d9SPhilipp Tomsich} 133e25b30d9SPhilipp Tomsich 134e25b30d9SPhilipp Tomsichdefine i32 @addmul12(i32 %a, i32 %b) { 135e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul12: 136e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 1373e55ac94SPhilip Reames; RV32I-NEXT: slli a2, a0, 2 1383e55ac94SPhilip Reames; RV32I-NEXT: slli a0, a0, 4 1393e55ac94SPhilip Reames; RV32I-NEXT: sub a0, a0, a2 140e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 141e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 142e25b30d9SPhilipp Tomsich; 143e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul12: 144e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 145e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 146e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 147e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 148e25b30d9SPhilipp Tomsich %c = mul i32 %a, 12 149e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 150e25b30d9SPhilipp Tomsich ret i32 %d 151e25b30d9SPhilipp Tomsich} 152e25b30d9SPhilipp Tomsich 153e25b30d9SPhilipp Tomsichdefine i32 @addmul18(i32 %a, i32 %b) { 154e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul18: 155e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 156e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 18 157e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 158e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 159e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 160e25b30d9SPhilipp Tomsich; 161e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul18: 162e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 163e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 164e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 165e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 166e25b30d9SPhilipp Tomsich %c = mul i32 %a, 18 167e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 168e25b30d9SPhilipp Tomsich ret i32 %d 169e25b30d9SPhilipp Tomsich} 170e25b30d9SPhilipp Tomsich 171e25b30d9SPhilipp Tomsichdefine i32 @addmul20(i32 %a, i32 %b) { 172e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul20: 173e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 174e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 20 175e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 176e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 177e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 178e25b30d9SPhilipp Tomsich; 179e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul20: 180e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 181e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 182e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 183e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 184e25b30d9SPhilipp Tomsich %c = mul i32 %a, 20 185e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 186e25b30d9SPhilipp Tomsich ret i32 %d 187e25b30d9SPhilipp Tomsich} 188e25b30d9SPhilipp Tomsich 189e25b30d9SPhilipp Tomsichdefine i32 @addmul24(i32 %a, i32 %b) { 190e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul24: 191e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 1923e55ac94SPhilip Reames; RV32I-NEXT: slli a2, a0, 3 1933e55ac94SPhilip Reames; RV32I-NEXT: slli a0, a0, 5 1943e55ac94SPhilip Reames; RV32I-NEXT: sub a0, a0, a2 195e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 196e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 197e25b30d9SPhilipp Tomsich; 198e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul24: 199e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 200e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 201e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 202e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 203e25b30d9SPhilipp Tomsich %c = mul i32 %a, 24 204e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 205e25b30d9SPhilipp Tomsich ret i32 %d 206e25b30d9SPhilipp Tomsich} 207e25b30d9SPhilipp Tomsich 208e25b30d9SPhilipp Tomsichdefine i32 @addmul36(i32 %a, i32 %b) { 209e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul36: 210e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 211e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 36 212e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 213e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 214e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 215e25b30d9SPhilipp Tomsich; 216e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul36: 217e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 218e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 219e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 220e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 221e25b30d9SPhilipp Tomsich %c = mul i32 %a, 36 222e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 223e25b30d9SPhilipp Tomsich ret i32 %d 224e25b30d9SPhilipp Tomsich} 225e25b30d9SPhilipp Tomsich 226e25b30d9SPhilipp Tomsichdefine i32 @addmul40(i32 %a, i32 %b) { 227e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul40: 228e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 229e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 40 230e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 231e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 232e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 233e25b30d9SPhilipp Tomsich; 234e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul40: 235e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 236e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 237e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 238e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 239e25b30d9SPhilipp Tomsich %c = mul i32 %a, 40 240e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 241e25b30d9SPhilipp Tomsich ret i32 %d 242e25b30d9SPhilipp Tomsich} 243e25b30d9SPhilipp Tomsich 244e25b30d9SPhilipp Tomsichdefine i32 @addmul72(i32 %a, i32 %b) { 245e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul72: 246e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 247e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a2, 72 248e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a2 249e25b30d9SPhilipp Tomsich; RV32I-NEXT: add a0, a0, a1 250e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 251e25b30d9SPhilipp Tomsich; 252e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul72: 253e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 254e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 255e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 256e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 257e25b30d9SPhilipp Tomsich %c = mul i32 %a, 72 258e25b30d9SPhilipp Tomsich %d = add i32 %c, %b 259e25b30d9SPhilipp Tomsich ret i32 %d 260e25b30d9SPhilipp Tomsich} 261e25b30d9SPhilipp Tomsich 262e25b30d9SPhilipp Tomsichdefine i32 @mul96(i32 %a) { 263e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul96: 264e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 2653e55ac94SPhilip Reames; RV32I-NEXT: slli a1, a0, 5 2663e55ac94SPhilip Reames; RV32I-NEXT: slli a0, a0, 7 2673e55ac94SPhilip Reames; RV32I-NEXT: sub a0, a0, a1 268e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 269e25b30d9SPhilipp Tomsich; 270e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul96: 271e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 272e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 273e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: slli a0, a0, 5 274e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 275e25b30d9SPhilipp Tomsich %c = mul i32 %a, 96 276e25b30d9SPhilipp Tomsich ret i32 %c 277e25b30d9SPhilipp Tomsich} 278e25b30d9SPhilipp Tomsich 279e25b30d9SPhilipp Tomsichdefine i32 @mul160(i32 %a) { 280e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul160: 281e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 282e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a1, 160 283e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a1 284e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 285e25b30d9SPhilipp Tomsich; 286e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul160: 287e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 288e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 289e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: slli a0, a0, 5 290e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 291e25b30d9SPhilipp Tomsich %c = mul i32 %a, 160 292e25b30d9SPhilipp Tomsich ret i32 %c 293e25b30d9SPhilipp Tomsich} 294e25b30d9SPhilipp Tomsich 295e25b30d9SPhilipp Tomsichdefine i32 @mul200(i32 %a) { 296e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul200: 297e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 298e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a1, 200 299e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a1 300e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 301e25b30d9SPhilipp Tomsich; 302e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul200: 303e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 304e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 305e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 306e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: slli a0, a0, 3 307e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 308e25b30d9SPhilipp Tomsich %c = mul i32 %a, 200 309e25b30d9SPhilipp Tomsich ret i32 %c 310e25b30d9SPhilipp Tomsich} 311e25b30d9SPhilipp Tomsich 312e25b30d9SPhilipp Tomsichdefine i32 @mul288(i32 %a) { 313e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul288: 314e25b30d9SPhilipp Tomsich; RV32I: # %bb.0: 315e25b30d9SPhilipp Tomsich; RV32I-NEXT: li a1, 288 316e25b30d9SPhilipp Tomsich; RV32I-NEXT: mul a0, a0, a1 317e25b30d9SPhilipp Tomsich; RV32I-NEXT: ret 318e25b30d9SPhilipp Tomsich; 319e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul288: 320e25b30d9SPhilipp Tomsich; RV32XTHEADBA: # %bb.0: 321e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 322e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: slli a0, a0, 5 323e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT: ret 324e25b30d9SPhilipp Tomsich %c = mul i32 %a, 288 325e25b30d9SPhilipp Tomsich ret i32 %c 326e25b30d9SPhilipp Tomsich} 327cd3c1658SCraig Topper 328cd3c1658SCraig Topperdefine i32 @mul258(i32 %a) { 329cd3c1658SCraig Topper; RV32I-LABEL: mul258: 330cd3c1658SCraig Topper; RV32I: # %bb.0: 331cd3c1658SCraig Topper; RV32I-NEXT: li a1, 258 332cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 333cd3c1658SCraig Topper; RV32I-NEXT: ret 334cd3c1658SCraig Topper; 335cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul258: 336cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 337cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 8 338cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 339cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 340cd3c1658SCraig Topper %c = mul i32 %a, 258 341cd3c1658SCraig Topper ret i32 %c 342cd3c1658SCraig Topper} 343cd3c1658SCraig Topper 344cd3c1658SCraig Topperdefine i32 @mul260(i32 %a) { 345cd3c1658SCraig Topper; RV32I-LABEL: mul260: 346cd3c1658SCraig Topper; RV32I: # %bb.0: 347cd3c1658SCraig Topper; RV32I-NEXT: li a1, 260 348cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 349cd3c1658SCraig Topper; RV32I-NEXT: ret 350cd3c1658SCraig Topper; 351cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul260: 352cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 353cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 8 354cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 355cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 356cd3c1658SCraig Topper %c = mul i32 %a, 260 357cd3c1658SCraig Topper ret i32 %c 358cd3c1658SCraig Topper} 359cd3c1658SCraig Topper 360cd3c1658SCraig Topperdefine i32 @mul264(i32 %a) { 361cd3c1658SCraig Topper; RV32I-LABEL: mul264: 362cd3c1658SCraig Topper; RV32I: # %bb.0: 363cd3c1658SCraig Topper; RV32I-NEXT: li a1, 264 364cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 365cd3c1658SCraig Topper; RV32I-NEXT: ret 366cd3c1658SCraig Topper; 367cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul264: 368cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 369cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 8 370cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 371cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 372cd3c1658SCraig Topper %c = mul i32 %a, 264 373cd3c1658SCraig Topper ret i32 %c 374cd3c1658SCraig Topper} 375cd3c1658SCraig Topper 376cd3c1658SCraig Topperdefine i32 @mul11(i32 %a) { 377cd3c1658SCraig Topper; RV32I-LABEL: mul11: 378cd3c1658SCraig Topper; RV32I: # %bb.0: 379cd3c1658SCraig Topper; RV32I-NEXT: li a1, 11 380cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 381cd3c1658SCraig Topper; RV32I-NEXT: ret 382cd3c1658SCraig Topper; 383cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul11: 384cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 385cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 386cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 387cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 388cd3c1658SCraig Topper %c = mul i32 %a, 11 389cd3c1658SCraig Topper ret i32 %c 390cd3c1658SCraig Topper} 391cd3c1658SCraig Topper 392cd3c1658SCraig Topperdefine i32 @mul19(i32 %a) { 393cd3c1658SCraig Topper; RV32I-LABEL: mul19: 394cd3c1658SCraig Topper; RV32I: # %bb.0: 395cd3c1658SCraig Topper; RV32I-NEXT: li a1, 19 396cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 397cd3c1658SCraig Topper; RV32I-NEXT: ret 398cd3c1658SCraig Topper; 399cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul19: 400cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 401cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 402cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 403cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 404cd3c1658SCraig Topper %c = mul i32 %a, 19 405cd3c1658SCraig Topper ret i32 %c 406cd3c1658SCraig Topper} 407cd3c1658SCraig Topper 408cd3c1658SCraig Topperdefine i32 @mul13(i32 %a) { 409cd3c1658SCraig Topper; RV32I-LABEL: mul13: 410cd3c1658SCraig Topper; RV32I: # %bb.0: 411cd3c1658SCraig Topper; RV32I-NEXT: li a1, 13 412cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 413cd3c1658SCraig Topper; RV32I-NEXT: ret 414cd3c1658SCraig Topper; 415cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul13: 416cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 417cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 1 418cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 419cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 420cd3c1658SCraig Topper %c = mul i32 %a, 13 421cd3c1658SCraig Topper ret i32 %c 422cd3c1658SCraig Topper} 423cd3c1658SCraig Topper 424cd3c1658SCraig Topperdefine i32 @mul21(i32 %a) { 425cd3c1658SCraig Topper; RV32I-LABEL: mul21: 426cd3c1658SCraig Topper; RV32I: # %bb.0: 427cd3c1658SCraig Topper; RV32I-NEXT: li a1, 21 428cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 429cd3c1658SCraig Topper; RV32I-NEXT: ret 430cd3c1658SCraig Topper; 431cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul21: 432cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 433cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 434cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 435cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 436cd3c1658SCraig Topper %c = mul i32 %a, 21 437cd3c1658SCraig Topper ret i32 %c 438cd3c1658SCraig Topper} 439cd3c1658SCraig Topper 440cd3c1658SCraig Topperdefine i32 @mul37(i32 %a) { 441cd3c1658SCraig Topper; RV32I-LABEL: mul37: 442cd3c1658SCraig Topper; RV32I: # %bb.0: 443cd3c1658SCraig Topper; RV32I-NEXT: li a1, 37 444cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 445cd3c1658SCraig Topper; RV32I-NEXT: ret 446cd3c1658SCraig Topper; 447cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul37: 448cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 449cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 450cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 451cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 452cd3c1658SCraig Topper %c = mul i32 %a, 37 453cd3c1658SCraig Topper ret i32 %c 454cd3c1658SCraig Topper} 455cd3c1658SCraig Topper 456cd3c1658SCraig Topperdefine i32 @mul25(i32 %a) { 457cd3c1658SCraig Topper; RV32I-LABEL: mul25: 458cd3c1658SCraig Topper; RV32I: # %bb.0: 459cd3c1658SCraig Topper; RV32I-NEXT: li a1, 25 460cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 461cd3c1658SCraig Topper; RV32I-NEXT: ret 462cd3c1658SCraig Topper; 463cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul25: 464cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 465cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 466cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 467cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 468cd3c1658SCraig Topper %c = mul i32 %a, 25 469cd3c1658SCraig Topper ret i32 %c 470cd3c1658SCraig Topper} 471cd3c1658SCraig Topper 472cd3c1658SCraig Topperdefine i32 @mul41(i32 %a) { 473cd3c1658SCraig Topper; RV32I-LABEL: mul41: 474cd3c1658SCraig Topper; RV32I: # %bb.0: 475cd3c1658SCraig Topper; RV32I-NEXT: li a1, 41 476cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 477cd3c1658SCraig Topper; RV32I-NEXT: ret 478cd3c1658SCraig Topper; 479cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul41: 480cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 481cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 482cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 483cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 484cd3c1658SCraig Topper %c = mul i32 %a, 41 485cd3c1658SCraig Topper ret i32 %c 486cd3c1658SCraig Topper} 487cd3c1658SCraig Topper 488cd3c1658SCraig Topperdefine i32 @mul73(i32 %a) { 489cd3c1658SCraig Topper; RV32I-LABEL: mul73: 490cd3c1658SCraig Topper; RV32I: # %bb.0: 491cd3c1658SCraig Topper; RV32I-NEXT: li a1, 73 492cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 493cd3c1658SCraig Topper; RV32I-NEXT: ret 494cd3c1658SCraig Topper; 495cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul73: 496cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 497cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 498cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 499cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 500cd3c1658SCraig Topper %c = mul i32 %a, 73 501cd3c1658SCraig Topper ret i32 %c 502cd3c1658SCraig Topper} 503cd3c1658SCraig Topper 504cd3c1658SCraig Topperdefine i32 @mul27(i32 %a) { 505cd3c1658SCraig Topper; RV32I-LABEL: mul27: 506cd3c1658SCraig Topper; RV32I: # %bb.0: 507cd3c1658SCraig Topper; RV32I-NEXT: li a1, 27 508cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 509cd3c1658SCraig Topper; RV32I-NEXT: ret 510cd3c1658SCraig Topper; 511cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul27: 512cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 513cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 514cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 515cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 516cd3c1658SCraig Topper %c = mul i32 %a, 27 517cd3c1658SCraig Topper ret i32 %c 518cd3c1658SCraig Topper} 519cd3c1658SCraig Topper 520cd3c1658SCraig Topperdefine i32 @mul45(i32 %a) { 521cd3c1658SCraig Topper; RV32I-LABEL: mul45: 522cd3c1658SCraig Topper; RV32I: # %bb.0: 523cd3c1658SCraig Topper; RV32I-NEXT: li a1, 45 524cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 525cd3c1658SCraig Topper; RV32I-NEXT: ret 526cd3c1658SCraig Topper; 527cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul45: 528cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 529cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 530cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 531cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 532cd3c1658SCraig Topper %c = mul i32 %a, 45 533cd3c1658SCraig Topper ret i32 %c 534cd3c1658SCraig Topper} 535cd3c1658SCraig Topper 536cd3c1658SCraig Topperdefine i32 @mul81(i32 %a) { 537cd3c1658SCraig Topper; RV32I-LABEL: mul81: 538cd3c1658SCraig Topper; RV32I: # %bb.0: 539cd3c1658SCraig Topper; RV32I-NEXT: li a1, 81 540cd3c1658SCraig Topper; RV32I-NEXT: mul a0, a0, a1 541cd3c1658SCraig Topper; RV32I-NEXT: ret 542cd3c1658SCraig Topper; 543cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul81: 544cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 545cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 546cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 547cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 548cd3c1658SCraig Topper %c = mul i32 %a, 81 549cd3c1658SCraig Topper ret i32 %c 550cd3c1658SCraig Topper} 551cd3c1658SCraig Topper 552cd3c1658SCraig Topperdefine i32 @mul4098(i32 %a) { 553cd3c1658SCraig Topper; RV32I-LABEL: mul4098: 554cd3c1658SCraig Topper; RV32I: # %bb.0: 555cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a0, 1 556cd3c1658SCraig Topper; RV32I-NEXT: slli a0, a0, 12 557cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 558cd3c1658SCraig Topper; RV32I-NEXT: ret 559cd3c1658SCraig Topper; 560cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4098: 561cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 562cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 12 563cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 564cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 565cd3c1658SCraig Topper %c = mul i32 %a, 4098 566cd3c1658SCraig Topper ret i32 %c 567cd3c1658SCraig Topper} 568cd3c1658SCraig Topper 569cd3c1658SCraig Topperdefine i32 @mul4100(i32 %a) { 570cd3c1658SCraig Topper; RV32I-LABEL: mul4100: 571cd3c1658SCraig Topper; RV32I: # %bb.0: 572cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a0, 2 573cd3c1658SCraig Topper; RV32I-NEXT: slli a0, a0, 12 574cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 575cd3c1658SCraig Topper; RV32I-NEXT: ret 576cd3c1658SCraig Topper; 577cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4100: 578cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 579cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 12 580cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 581cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 582cd3c1658SCraig Topper %c = mul i32 %a, 4100 583cd3c1658SCraig Topper ret i32 %c 584cd3c1658SCraig Topper} 585cd3c1658SCraig Topper 586cd3c1658SCraig Topperdefine i32 @mul4104(i32 %a) { 587cd3c1658SCraig Topper; RV32I-LABEL: mul4104: 588cd3c1658SCraig Topper; RV32I: # %bb.0: 589cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a0, 3 590cd3c1658SCraig Topper; RV32I-NEXT: slli a0, a0, 12 591cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 592cd3c1658SCraig Topper; RV32I-NEXT: ret 593cd3c1658SCraig Topper; 594cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4104: 595cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 596cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: slli a1, a0, 12 597cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 598cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 599cd3c1658SCraig Topper %c = mul i32 %a, 4104 600cd3c1658SCraig Topper ret i32 %c 601cd3c1658SCraig Topper} 602cd3c1658SCraig Topper 603cd3c1658SCraig Topperdefine i32 @add4104(i32 %a) { 604*814902a0SCraig Topper; RV32I-LABEL: add4104: 605*814902a0SCraig Topper; RV32I: # %bb.0: 606*814902a0SCraig Topper; RV32I-NEXT: lui a1, 1 607*814902a0SCraig Topper; RV32I-NEXT: addi a1, a1, 8 608*814902a0SCraig Topper; RV32I-NEXT: add a0, a0, a1 609*814902a0SCraig Topper; RV32I-NEXT: ret 610*814902a0SCraig Topper; 611*814902a0SCraig Topper; RV32XTHEADBA-LABEL: add4104: 612*814902a0SCraig Topper; RV32XTHEADBA: # %bb.0: 613*814902a0SCraig Topper; RV32XTHEADBA-NEXT: li a1, 1026 614*814902a0SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 615*814902a0SCraig Topper; RV32XTHEADBA-NEXT: ret 616cd3c1658SCraig Topper %c = add i32 %a, 4104 617cd3c1658SCraig Topper ret i32 %c 618cd3c1658SCraig Topper} 619cd3c1658SCraig Topper 620cd3c1658SCraig Topperdefine i32 @add8208(i32 %a) { 621*814902a0SCraig Topper; RV32I-LABEL: add8208: 622*814902a0SCraig Topper; RV32I: # %bb.0: 623*814902a0SCraig Topper; RV32I-NEXT: lui a1, 2 624*814902a0SCraig Topper; RV32I-NEXT: addi a1, a1, 16 625*814902a0SCraig Topper; RV32I-NEXT: add a0, a0, a1 626*814902a0SCraig Topper; RV32I-NEXT: ret 627*814902a0SCraig Topper; 628*814902a0SCraig Topper; RV32XTHEADBA-LABEL: add8208: 629*814902a0SCraig Topper; RV32XTHEADBA: # %bb.0: 630*814902a0SCraig Topper; RV32XTHEADBA-NEXT: li a1, 1026 631*814902a0SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 632*814902a0SCraig Topper; RV32XTHEADBA-NEXT: ret 633cd3c1658SCraig Topper %c = add i32 %a, 8208 634cd3c1658SCraig Topper ret i32 %c 635cd3c1658SCraig Topper} 636cd3c1658SCraig Topper 637cd3c1658SCraig Topperdefine i32 @add8192(i32 %a) { 638cd3c1658SCraig Topper; CHECK-LABEL: add8192: 639cd3c1658SCraig Topper; CHECK: # %bb.0: 640cd3c1658SCraig Topper; CHECK-NEXT: lui a1, 2 641cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 642cd3c1658SCraig Topper; CHECK-NEXT: ret 643cd3c1658SCraig Topper %c = add i32 %a, 8192 644cd3c1658SCraig Topper ret i32 %c 645cd3c1658SCraig Topper} 646cd3c1658SCraig Topper 647cd3c1658SCraig Topperdefine i32 @addshl_5_6(i32 %a, i32 %b) { 648cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_6: 649cd3c1658SCraig Topper; CHECK: # %bb.0: 650cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 651cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 6 652cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 653cd3c1658SCraig Topper; CHECK-NEXT: ret 654cd3c1658SCraig Topper %c = shl i32 %a, 5 655cd3c1658SCraig Topper %d = shl i32 %b, 6 656cd3c1658SCraig Topper %e = add i32 %c, %d 657cd3c1658SCraig Topper ret i32 %e 658cd3c1658SCraig Topper} 659cd3c1658SCraig Topper 660cd3c1658SCraig Topperdefine i32 @addshl_5_7(i32 %a, i32 %b) { 661cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_7: 662cd3c1658SCraig Topper; CHECK: # %bb.0: 663cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 664cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 7 665cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 666cd3c1658SCraig Topper; CHECK-NEXT: ret 667cd3c1658SCraig Topper %c = shl i32 %a, 5 668cd3c1658SCraig Topper %d = shl i32 %b, 7 669cd3c1658SCraig Topper %e = add i32 %c, %d 670cd3c1658SCraig Topper ret i32 %e 671cd3c1658SCraig Topper} 672cd3c1658SCraig Topper 673cd3c1658SCraig Topperdefine i32 @addshl_5_8(i32 %a, i32 %b) { 674cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_8: 675cd3c1658SCraig Topper; CHECK: # %bb.0: 676cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 677cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 8 678cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 679cd3c1658SCraig Topper; CHECK-NEXT: ret 680cd3c1658SCraig Topper %c = shl i32 %a, 5 681cd3c1658SCraig Topper %d = shl i32 %b, 8 682cd3c1658SCraig Topper %e = add i32 %c, %d 683cd3c1658SCraig Topper ret i32 %e 684cd3c1658SCraig Topper} 685cd3c1658SCraig Topper 686cd3c1658SCraig Topperdefine i32 @srli_1_sh2add(ptr %0, i32 %1) { 687cd3c1658SCraig Topper; RV32I-LABEL: srli_1_sh2add: 688cd3c1658SCraig Topper; RV32I: # %bb.0: 689cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a1, 1 690cd3c1658SCraig Topper; RV32I-NEXT: andi a1, a1, -4 691cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 692cd3c1658SCraig Topper; RV32I-NEXT: lw a0, 0(a0) 693cd3c1658SCraig Topper; RV32I-NEXT: ret 694cd3c1658SCraig Topper; 695cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_1_sh2add: 696cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 697cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: srli a1, a1, 1 698cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 699cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a0, 0(a0) 700cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 701cd3c1658SCraig Topper %3 = lshr i32 %1, 1 702cd3c1658SCraig Topper %4 = getelementptr inbounds i32, ptr %0, i32 %3 703cd3c1658SCraig Topper %5 = load i32, ptr %4, align 4 704cd3c1658SCraig Topper ret i32 %5 705cd3c1658SCraig Topper} 706cd3c1658SCraig Topper 707cd3c1658SCraig Topperdefine i64 @srli_2_sh3add(ptr %0, i32 %1) { 708cd3c1658SCraig Topper; RV32I-LABEL: srli_2_sh3add: 709cd3c1658SCraig Topper; RV32I: # %bb.0: 710cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a1, 1 711cd3c1658SCraig Topper; RV32I-NEXT: andi a1, a1, -8 712cd3c1658SCraig Topper; RV32I-NEXT: add a1, a0, a1 713cd3c1658SCraig Topper; RV32I-NEXT: lw a0, 0(a1) 714cd3c1658SCraig Topper; RV32I-NEXT: lw a1, 4(a1) 715cd3c1658SCraig Topper; RV32I-NEXT: ret 716cd3c1658SCraig Topper; 717cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_2_sh3add: 718cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 719cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: srli a1, a1, 2 720cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a1, 3 721cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a0, 0(a1) 722cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a1, 4(a1) 723cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 724cd3c1658SCraig Topper %3 = lshr i32 %1, 2 725cd3c1658SCraig Topper %4 = getelementptr inbounds i64, ptr %0, i32 %3 726cd3c1658SCraig Topper %5 = load i64, ptr %4, align 8 727cd3c1658SCraig Topper ret i64 %5 728cd3c1658SCraig Topper} 729cd3c1658SCraig Topper 730cd3c1658SCraig Topperdefine signext i16 @srli_2_sh1add(ptr %0, i32 %1) { 731cd3c1658SCraig Topper; RV32I-LABEL: srli_2_sh1add: 732cd3c1658SCraig Topper; RV32I: # %bb.0: 733cd3c1658SCraig Topper; RV32I-NEXT: srli a1, a1, 1 734cd3c1658SCraig Topper; RV32I-NEXT: andi a1, a1, -2 735cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 736cd3c1658SCraig Topper; RV32I-NEXT: lh a0, 0(a0) 737cd3c1658SCraig Topper; RV32I-NEXT: ret 738cd3c1658SCraig Topper; 739cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_2_sh1add: 740cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 741cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: srli a1, a1, 2 742cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 743cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lh a0, 0(a0) 744cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 745cd3c1658SCraig Topper %3 = lshr i32 %1, 2 746cd3c1658SCraig Topper %4 = getelementptr inbounds i16, ptr %0, i32 %3 747cd3c1658SCraig Topper %5 = load i16, ptr %4, align 2 748cd3c1658SCraig Topper ret i16 %5 749cd3c1658SCraig Topper} 750cd3c1658SCraig Topper 751cd3c1658SCraig Topperdefine i32 @srli_3_sh2add(ptr %0, i32 %1) { 752cd3c1658SCraig Topper; RV32I-LABEL: srli_3_sh2add: 753cd3c1658SCraig Topper; RV32I: # %bb.0: 754cd3c1658SCraig Topper; RV32I-NEXT: srli a1, a1, 1 755cd3c1658SCraig Topper; RV32I-NEXT: andi a1, a1, -4 756cd3c1658SCraig Topper; RV32I-NEXT: add a0, a0, a1 757cd3c1658SCraig Topper; RV32I-NEXT: lw a0, 0(a0) 758cd3c1658SCraig Topper; RV32I-NEXT: ret 759cd3c1658SCraig Topper; 760cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_3_sh2add: 761cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 762cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: srli a1, a1, 3 763cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 764cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a0, 0(a0) 765cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 766cd3c1658SCraig Topper %3 = lshr i32 %1, 3 767cd3c1658SCraig Topper %4 = getelementptr inbounds i32, ptr %0, i32 %3 768cd3c1658SCraig Topper %5 = load i32, ptr %4, align 4 769cd3c1658SCraig Topper ret i32 %5 770cd3c1658SCraig Topper} 771cd3c1658SCraig Topper 772cd3c1658SCraig Topperdefine i64 @srli_4_sh3add(ptr %0, i32 %1) { 773cd3c1658SCraig Topper; RV32I-LABEL: srli_4_sh3add: 774cd3c1658SCraig Topper; RV32I: # %bb.0: 775cd3c1658SCraig Topper; RV32I-NEXT: srli a1, a1, 1 776cd3c1658SCraig Topper; RV32I-NEXT: andi a1, a1, -8 777cd3c1658SCraig Topper; RV32I-NEXT: add a1, a0, a1 778cd3c1658SCraig Topper; RV32I-NEXT: lw a0, 0(a1) 779cd3c1658SCraig Topper; RV32I-NEXT: lw a1, 4(a1) 780cd3c1658SCraig Topper; RV32I-NEXT: ret 781cd3c1658SCraig Topper; 782cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_4_sh3add: 783cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 784cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: srli a1, a1, 4 785cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a1, a0, a1, 3 786cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a0, 0(a1) 787cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: lw a1, 4(a1) 788cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 789cd3c1658SCraig Topper %3 = lshr i32 %1, 4 790cd3c1658SCraig Topper %4 = getelementptr inbounds i64, ptr %0, i32 %3 791cd3c1658SCraig Topper %5 = load i64, ptr %4, align 8 792cd3c1658SCraig Topper ret i64 %5 793cd3c1658SCraig Topper} 794cd3c1658SCraig Topper 795cd3c1658SCraig Topperdefine i32 @mul_neg1(i32 %a) { 796cd3c1658SCraig Topper; CHECK-LABEL: mul_neg1: 797cd3c1658SCraig Topper; CHECK: # %bb.0: 798cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 799cd3c1658SCraig Topper; CHECK-NEXT: ret 800cd3c1658SCraig Topper %c = mul i32 %a, -1 801cd3c1658SCraig Topper ret i32 %c 802cd3c1658SCraig Topper} 803cd3c1658SCraig Topper 804cd3c1658SCraig Topperdefine i32 @mul_neg2(i32 %a) { 805cd3c1658SCraig Topper; CHECK-LABEL: mul_neg2: 806cd3c1658SCraig Topper; CHECK: # %bb.0: 807cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 1 808cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 809cd3c1658SCraig Topper; CHECK-NEXT: ret 810cd3c1658SCraig Topper %c = mul i32 %a, -2 811cd3c1658SCraig Topper ret i32 %c 812cd3c1658SCraig Topper} 813cd3c1658SCraig Topper 814cd3c1658SCraig Topperdefine i32 @mul_neg3(i32 %a) { 815cd3c1658SCraig Topper; RV32I-LABEL: mul_neg3: 816cd3c1658SCraig Topper; RV32I: # %bb.0: 817cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a0, 1 818cd3c1658SCraig Topper; RV32I-NEXT: neg a0, a0 819cd3c1658SCraig Topper; RV32I-NEXT: sub a0, a0, a1 820cd3c1658SCraig Topper; RV32I-NEXT: ret 821cd3c1658SCraig Topper; 822cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul_neg3: 823cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 824cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 825cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: neg a0, a0 826cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 827cd3c1658SCraig Topper %c = mul i32 %a, -3 828cd3c1658SCraig Topper ret i32 %c 829cd3c1658SCraig Topper} 830cd3c1658SCraig Topper 831cd3c1658SCraig Topperdefine i32 @mul_neg4(i32 %a) { 832cd3c1658SCraig Topper; CHECK-LABEL: mul_neg4: 833cd3c1658SCraig Topper; CHECK: # %bb.0: 834cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 2 835cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 836cd3c1658SCraig Topper; CHECK-NEXT: ret 837cd3c1658SCraig Topper %c = mul i32 %a, -4 838cd3c1658SCraig Topper ret i32 %c 839cd3c1658SCraig Topper} 840cd3c1658SCraig Topper 841cd3c1658SCraig Topperdefine i32 @mul_neg5(i32 %a) { 842cd3c1658SCraig Topper; RV32I-LABEL: mul_neg5: 843cd3c1658SCraig Topper; RV32I: # %bb.0: 844cd3c1658SCraig Topper; RV32I-NEXT: slli a1, a0, 2 845cd3c1658SCraig Topper; RV32I-NEXT: neg a0, a0 846cd3c1658SCraig Topper; RV32I-NEXT: sub a0, a0, a1 847cd3c1658SCraig Topper; RV32I-NEXT: ret 848cd3c1658SCraig Topper; 849cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul_neg5: 850cd3c1658SCraig Topper; RV32XTHEADBA: # %bb.0: 851cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 852cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: neg a0, a0 853cd3c1658SCraig Topper; RV32XTHEADBA-NEXT: ret 854cd3c1658SCraig Topper %c = mul i32 %a, -5 855cd3c1658SCraig Topper ret i32 %c 856cd3c1658SCraig Topper} 857cd3c1658SCraig Topper 858cd3c1658SCraig Topperdefine i32 @mul_neg6(i32 %a) { 859cd3c1658SCraig Topper; CHECK-LABEL: mul_neg6: 860cd3c1658SCraig Topper; CHECK: # %bb.0: 861cd3c1658SCraig Topper; CHECK-NEXT: li a1, -6 862cd3c1658SCraig Topper; CHECK-NEXT: mul a0, a0, a1 863cd3c1658SCraig Topper; CHECK-NEXT: ret 864cd3c1658SCraig Topper %c = mul i32 %a, -6 865cd3c1658SCraig Topper ret i32 %c 866cd3c1658SCraig Topper} 867cd3c1658SCraig Topper 868cd3c1658SCraig Topperdefine i32 @mul_neg7(i32 %a) { 869cd3c1658SCraig Topper; CHECK-LABEL: mul_neg7: 870cd3c1658SCraig Topper; CHECK: # %bb.0: 871cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a0, 3 872cd3c1658SCraig Topper; CHECK-NEXT: sub a0, a0, a1 873cd3c1658SCraig Topper; CHECK-NEXT: ret 874cd3c1658SCraig Topper %c = mul i32 %a, -7 875cd3c1658SCraig Topper ret i32 %c 876cd3c1658SCraig Topper} 877cd3c1658SCraig Topper 878cd3c1658SCraig Topperdefine i32 @mul_neg8(i32 %a) { 879cd3c1658SCraig Topper; CHECK-LABEL: mul_neg8: 880cd3c1658SCraig Topper; CHECK: # %bb.0: 881cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 3 882cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 883cd3c1658SCraig Topper; CHECK-NEXT: ret 884cd3c1658SCraig Topper %c = mul i32 %a, -8 885cd3c1658SCraig Topper ret i32 %c 886cd3c1658SCraig Topper} 887