1e25b30d9SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub 2e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \ 3cd3c1658SCraig Topper; RUN: | FileCheck %s -check-prefixes=CHECK,RV64I 4e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+m,+xtheadba -verify-machineinstrs < %s \ 5cd3c1658SCraig Topper; RUN: | FileCheck %s -check-prefixes=CHECK,RV64XTHEADBA 6e25b30d9SPhilipp Tomsich 7e25b30d9SPhilipp Tomsichdefine signext i16 @th_addsl_1(i64 %0, ptr %1) { 8e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_1: 9e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 10e25b30d9SPhilipp Tomsich; RV64I-NEXT: slli a0, a0, 1 11e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a1, a0 12e25b30d9SPhilipp Tomsich; RV64I-NEXT: lh a0, 0(a0) 13e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 14e25b30d9SPhilipp Tomsich; 15e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_1: 16e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 17e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 18e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: lh a0, 0(a0) 19e25b30d9SPhilipp Tomsich; RV64XTHEADBA-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; RV64I-LABEL: th_addsl_2: 27e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 28e25b30d9SPhilipp Tomsich; RV64I-NEXT: slli a0, a0, 2 29e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a1, a0 30e25b30d9SPhilipp Tomsich; RV64I-NEXT: lw a0, 0(a0) 31e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 32e25b30d9SPhilipp Tomsich; 33e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_2: 34e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 35e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 36e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: lw a0, 0(a0) 37e25b30d9SPhilipp Tomsich; RV64XTHEADBA-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; RV64I-LABEL: th_addsl_3: 45e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 46e25b30d9SPhilipp Tomsich; RV64I-NEXT: slli a0, a0, 3 47e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a1, a0 48e25b30d9SPhilipp Tomsich; RV64I-NEXT: ld a0, 0(a0) 49e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 50e25b30d9SPhilipp Tomsich; 51e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_3: 52e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 53e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 54e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ld a0, 0(a0) 55e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 56e25b30d9SPhilipp Tomsich %3 = getelementptr inbounds i64, ptr %1, i64 %0 57e25b30d9SPhilipp Tomsich %4 = load i64, ptr %3 58e25b30d9SPhilipp Tomsich ret i64 %4 59e25b30d9SPhilipp Tomsich} 60e25b30d9SPhilipp Tomsich 61e25b30d9SPhilipp Tomsich; Type legalization inserts a sext_inreg after the first add. That add will be 62e25b30d9SPhilipp Tomsich; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable 63e25b30d9SPhilipp Tomsich; to remove the sext_inreg because it has multiple uses. The ashr will use the 64e25b30d9SPhilipp Tomsich; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl. 65e25b30d9SPhilipp Tomsich; If the shl is selected as sllw, we don't need the sext_inreg. 66e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) { 67e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_2_extra_sext: 68e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 69e25b30d9SPhilipp Tomsich; RV64I-NEXT: slli a0, a0, 2 70e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 71e25b30d9SPhilipp Tomsich; RV64I-NEXT: sllw a1, a2, a0 72e25b30d9SPhilipp Tomsich; RV64I-NEXT: sraiw a0, a0, 2 73e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a1, a0 74e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 75e25b30d9SPhilipp Tomsich; 76e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_2_extra_sext: 77e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 78e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 79e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: sllw a1, a2, a0 80e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: sraiw a0, a0, 2 81e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: mul a0, a1, a0 82e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 83e25b30d9SPhilipp Tomsich %a = shl i32 %x, 2 84e25b30d9SPhilipp Tomsich %b = add i32 %a, %y 85e25b30d9SPhilipp Tomsich %c = shl i32 %z, %b 86e25b30d9SPhilipp Tomsich %d = ashr i32 %b, 2 87e25b30d9SPhilipp Tomsich %e = sext i32 %c to i64 88e25b30d9SPhilipp Tomsich %f = sext i32 %d to i64 89e25b30d9SPhilipp Tomsich %g = mul i64 %e, %f 90e25b30d9SPhilipp Tomsich ret i64 %g 91e25b30d9SPhilipp Tomsich} 92e25b30d9SPhilipp Tomsich 93e25b30d9SPhilipp Tomsichdefine i64 @addmul6(i64 %a, i64 %b) { 94e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul6: 95e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 963e55ac94SPhilip Reames; RV64I-NEXT: slli a2, a0, 1 973e55ac94SPhilip Reames; RV64I-NEXT: slli a0, a0, 3 983e55ac94SPhilip Reames; RV64I-NEXT: sub a0, a0, a2 99e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 100e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 101e25b30d9SPhilipp Tomsich; 102e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul6: 103e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 104e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 105e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 106e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 107e25b30d9SPhilipp Tomsich %c = mul i64 %a, 6 108e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 109e25b30d9SPhilipp Tomsich ret i64 %d 110e25b30d9SPhilipp Tomsich} 111e25b30d9SPhilipp Tomsich 112*c557ce9fSCraig Topperdefine i64 @disjointormul6(i64 %a, i64 %b) { 113*c557ce9fSCraig Topper; RV64I-LABEL: disjointormul6: 114*c557ce9fSCraig Topper; RV64I: # %bb.0: 115*c557ce9fSCraig Topper; RV64I-NEXT: slli a2, a0, 1 116*c557ce9fSCraig Topper; RV64I-NEXT: slli a0, a0, 3 117*c557ce9fSCraig Topper; RV64I-NEXT: sub a0, a0, a2 118*c557ce9fSCraig Topper; RV64I-NEXT: or a0, a0, a1 119*c557ce9fSCraig Topper; RV64I-NEXT: ret 120*c557ce9fSCraig Topper; 121*c557ce9fSCraig Topper; RV64XTHEADBA-LABEL: disjointormul6: 122*c557ce9fSCraig Topper; RV64XTHEADBA: # %bb.0: 123*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 124*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 125*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: ret 126*c557ce9fSCraig Topper %c = mul i64 %a, 6 127*c557ce9fSCraig Topper %d = or disjoint i64 %c, %b 128*c557ce9fSCraig Topper ret i64 %d 129*c557ce9fSCraig Topper} 130*c557ce9fSCraig Topper 131e25b30d9SPhilipp Tomsichdefine i64 @addmul10(i64 %a, i64 %b) { 132e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul10: 133e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 134e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 10 135e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 136e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 137e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 138e25b30d9SPhilipp Tomsich; 139e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul10: 140e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 141e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 142e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 143e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 144e25b30d9SPhilipp Tomsich %c = mul i64 %a, 10 145e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 146e25b30d9SPhilipp Tomsich ret i64 %d 147e25b30d9SPhilipp Tomsich} 148e25b30d9SPhilipp Tomsich 149e25b30d9SPhilipp Tomsichdefine i64 @addmul12(i64 %a, i64 %b) { 150e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul12: 151e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 1523e55ac94SPhilip Reames; RV64I-NEXT: slli a2, a0, 2 1533e55ac94SPhilip Reames; RV64I-NEXT: slli a0, a0, 4 1543e55ac94SPhilip Reames; RV64I-NEXT: sub a0, a0, a2 155e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 156e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 157e25b30d9SPhilipp Tomsich; 158e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul12: 159e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 160e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 161e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 162e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 163e25b30d9SPhilipp Tomsich %c = mul i64 %a, 12 164e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 165e25b30d9SPhilipp Tomsich ret i64 %d 166e25b30d9SPhilipp Tomsich} 167e25b30d9SPhilipp Tomsich 168e25b30d9SPhilipp Tomsichdefine i64 @addmul18(i64 %a, i64 %b) { 169e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul18: 170e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 171e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 18 172e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 173e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 174e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 175e25b30d9SPhilipp Tomsich; 176e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul18: 177e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 178e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 179e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 180e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 181e25b30d9SPhilipp Tomsich %c = mul i64 %a, 18 182e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 183e25b30d9SPhilipp Tomsich ret i64 %d 184e25b30d9SPhilipp Tomsich} 185e25b30d9SPhilipp Tomsich 186e25b30d9SPhilipp Tomsichdefine i64 @addmul20(i64 %a, i64 %b) { 187e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul20: 188e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 189e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 20 190e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 191e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 192e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 193e25b30d9SPhilipp Tomsich; 194e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul20: 195e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 196e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 197e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 198e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 199e25b30d9SPhilipp Tomsich %c = mul i64 %a, 20 200e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 201e25b30d9SPhilipp Tomsich ret i64 %d 202e25b30d9SPhilipp Tomsich} 203e25b30d9SPhilipp Tomsich 204cd3c1658SCraig Topperdefine i64 @addmul22(i64 %a, i64 %b) { 205cd3c1658SCraig Topper; CHECK-LABEL: addmul22: 206cd3c1658SCraig Topper; CHECK: # %bb.0: 207cd3c1658SCraig Topper; CHECK-NEXT: li a2, 22 208cd3c1658SCraig Topper; CHECK-NEXT: mul a0, a0, a2 209cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 210cd3c1658SCraig Topper; CHECK-NEXT: ret 211cd3c1658SCraig Topper %c = mul i64 %a, 22 212cd3c1658SCraig Topper %d = add i64 %c, %b 213cd3c1658SCraig Topper ret i64 %d 214cd3c1658SCraig Topper} 215cd3c1658SCraig Topper 216e25b30d9SPhilipp Tomsichdefine i64 @addmul24(i64 %a, i64 %b) { 217e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul24: 218e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 2193e55ac94SPhilip Reames; RV64I-NEXT: slli a2, a0, 3 2203e55ac94SPhilip Reames; RV64I-NEXT: slli a0, a0, 5 2213e55ac94SPhilip Reames; RV64I-NEXT: sub a0, a0, a2 222e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 223e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 224e25b30d9SPhilipp Tomsich; 225e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul24: 226e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 227e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 228e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 229e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 230e25b30d9SPhilipp Tomsich %c = mul i64 %a, 24 231e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 232e25b30d9SPhilipp Tomsich ret i64 %d 233e25b30d9SPhilipp Tomsich} 234e25b30d9SPhilipp Tomsich 235e25b30d9SPhilipp Tomsichdefine i64 @addmul36(i64 %a, i64 %b) { 236e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul36: 237e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 238e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 36 239e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 240e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 241e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 242e25b30d9SPhilipp Tomsich; 243e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul36: 244e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 245e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 246e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 247e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 248e25b30d9SPhilipp Tomsich %c = mul i64 %a, 36 249e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 250e25b30d9SPhilipp Tomsich ret i64 %d 251e25b30d9SPhilipp Tomsich} 252e25b30d9SPhilipp Tomsich 253e25b30d9SPhilipp Tomsichdefine i64 @addmul40(i64 %a, i64 %b) { 254e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul40: 255e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 256e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 40 257e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 258e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 259e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 260e25b30d9SPhilipp Tomsich; 261e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul40: 262e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 263e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 264e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 265e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 266e25b30d9SPhilipp Tomsich %c = mul i64 %a, 40 267e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 268e25b30d9SPhilipp Tomsich ret i64 %d 269e25b30d9SPhilipp Tomsich} 270e25b30d9SPhilipp Tomsich 271e25b30d9SPhilipp Tomsichdefine i64 @addmul72(i64 %a, i64 %b) { 272e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul72: 273e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 274e25b30d9SPhilipp Tomsich; RV64I-NEXT: li a2, 72 275e25b30d9SPhilipp Tomsich; RV64I-NEXT: mul a0, a0, a2 276e25b30d9SPhilipp Tomsich; RV64I-NEXT: add a0, a0, a1 277e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 278e25b30d9SPhilipp Tomsich; 279e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul72: 280e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 281e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 282e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 283e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 284e25b30d9SPhilipp Tomsich %c = mul i64 %a, 72 285e25b30d9SPhilipp Tomsich %d = add i64 %c, %b 286e25b30d9SPhilipp Tomsich ret i64 %d 287e25b30d9SPhilipp Tomsich} 288e25b30d9SPhilipp Tomsich 289cd3c1658SCraig Topperdefine i64 @mul50(i64 %a) { 290cd3c1658SCraig Topper; RV64I-LABEL: mul50: 291cd3c1658SCraig Topper; RV64I: # %bb.0: 292cd3c1658SCraig Topper; RV64I-NEXT: li a1, 50 293cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 294cd3c1658SCraig Topper; RV64I-NEXT: ret 295cd3c1658SCraig Topper; 296cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul50: 297cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 298cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 299cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 300cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 1 301cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 302cd3c1658SCraig Topper %c = mul i64 %a, 50 303cd3c1658SCraig Topper ret i64 %c 304cd3c1658SCraig Topper} 305cd3c1658SCraig Topper 306cd3c1658SCraig Topperdefine i64 @addmul50(i64 %a, i64 %b) { 307cd3c1658SCraig Topper; RV64I-LABEL: addmul50: 308cd3c1658SCraig Topper; RV64I: # %bb.0: 309cd3c1658SCraig Topper; RV64I-NEXT: li a2, 50 310cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a2 311cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 312cd3c1658SCraig Topper; RV64I-NEXT: ret 313cd3c1658SCraig Topper; 314cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul50: 315cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 316cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 317cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 318cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 319cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 320cd3c1658SCraig Topper %c = mul i64 %a, 50 321cd3c1658SCraig Topper %d = add i64 %c, %b 322cd3c1658SCraig Topper ret i64 %d 323cd3c1658SCraig Topper} 324cd3c1658SCraig Topper 325cd3c1658SCraig Topperdefine i64 @mul100(i64 %a) { 326cd3c1658SCraig Topper; RV64I-LABEL: mul100: 327cd3c1658SCraig Topper; RV64I: # %bb.0: 328cd3c1658SCraig Topper; RV64I-NEXT: li a1, 100 329cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 330cd3c1658SCraig Topper; RV64I-NEXT: ret 331cd3c1658SCraig Topper; 332cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul100: 333cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 334cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 335cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 336cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 2 337cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 338cd3c1658SCraig Topper %c = mul i64 %a, 100 339cd3c1658SCraig Topper ret i64 %c 340cd3c1658SCraig Topper} 341cd3c1658SCraig Topper 342cd3c1658SCraig Topperdefine i64 @addmul100(i64 %a, i64 %b) { 343cd3c1658SCraig Topper; RV64I-LABEL: addmul100: 344cd3c1658SCraig Topper; RV64I: # %bb.0: 345cd3c1658SCraig Topper; RV64I-NEXT: li a2, 100 346cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a2 347cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 348cd3c1658SCraig Topper; RV64I-NEXT: ret 349cd3c1658SCraig Topper; 350cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul100: 351cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 352cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 353cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 354cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 355cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 356cd3c1658SCraig Topper %c = mul i64 %a, 100 357cd3c1658SCraig Topper %d = add i64 %c, %b 358cd3c1658SCraig Topper ret i64 %d 359cd3c1658SCraig Topper} 360cd3c1658SCraig Topper 361cd3c1658SCraig Topperdefine i64 @mul162(i64 %a) { 362cd3c1658SCraig Topper; RV64I-LABEL: mul162: 363cd3c1658SCraig Topper; RV64I: # %bb.0: 364cd3c1658SCraig Topper; RV64I-NEXT: li a1, 162 365cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 366cd3c1658SCraig Topper; RV64I-NEXT: ret 367cd3c1658SCraig Topper; 368cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul162: 369cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 370cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 371cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 372cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 1 373cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 374cd3c1658SCraig Topper %c = mul i64 %a, 162 375cd3c1658SCraig Topper ret i64 %c 376cd3c1658SCraig Topper} 377cd3c1658SCraig Topper 378cd3c1658SCraig Topperdefine i64 @addmul162(i64 %a, i64 %b) { 379cd3c1658SCraig Topper; RV64I-LABEL: addmul162: 380cd3c1658SCraig Topper; RV64I: # %bb.0: 381cd3c1658SCraig Topper; RV64I-NEXT: li a2, 162 382cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a2 383cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 384cd3c1658SCraig Topper; RV64I-NEXT: ret 385cd3c1658SCraig Topper; 386cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul162: 387cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 388cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 389cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 390cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 391cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 392cd3c1658SCraig Topper %c = mul i64 %a, 162 393cd3c1658SCraig Topper %d = add i64 %c, %b 394cd3c1658SCraig Topper ret i64 %d 395cd3c1658SCraig Topper} 396cd3c1658SCraig Topper 397cd3c1658SCraig Topperdefine i64 @mul180(i64 %a) { 398cd3c1658SCraig Topper; RV64I-LABEL: mul180: 399cd3c1658SCraig Topper; RV64I: # %bb.0: 400cd3c1658SCraig Topper; RV64I-NEXT: li a1, 180 401cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 402cd3c1658SCraig Topper; RV64I-NEXT: ret 403cd3c1658SCraig Topper; 404cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul180: 405cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 406cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 407cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 408cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 2 409cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 410cd3c1658SCraig Topper %c = mul i64 %a, 180 411cd3c1658SCraig Topper ret i64 %c 412cd3c1658SCraig Topper} 413cd3c1658SCraig Topper 414cd3c1658SCraig Topperdefine i64 @addmul180(i64 %a, i64 %b) { 415cd3c1658SCraig Topper; RV64I-LABEL: addmul180: 416cd3c1658SCraig Topper; RV64I: # %bb.0: 417cd3c1658SCraig Topper; RV64I-NEXT: li a2, 180 418cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a2 419cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 420cd3c1658SCraig Topper; RV64I-NEXT: ret 421cd3c1658SCraig Topper; 422cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul180: 423cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 424cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 425cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 426cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 427cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 428cd3c1658SCraig Topper %c = mul i64 %a, 180 429cd3c1658SCraig Topper %d = add i64 %c, %b 430cd3c1658SCraig Topper ret i64 %d 431cd3c1658SCraig Topper} 432cd3c1658SCraig Topper 433cd3c1658SCraig Topperdefine i64 @add255mul180(i64 %a) { 434cd3c1658SCraig Topper; RV64I-LABEL: add255mul180: 435cd3c1658SCraig Topper; RV64I: # %bb.0: 436cd3c1658SCraig Topper; RV64I-NEXT: li a1, 180 437cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 438cd3c1658SCraig Topper; RV64I-NEXT: addi a0, a0, 255 439cd3c1658SCraig Topper; RV64I-NEXT: ret 440cd3c1658SCraig Topper; 441cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: add255mul180: 442cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 443cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 444cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 445*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 2 446*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: addi a0, a0, 255 447cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 448cd3c1658SCraig Topper %c = mul i64 %a, 180 449cd3c1658SCraig Topper %d = add i64 %c, 255 450cd3c1658SCraig Topper ret i64 %d 451cd3c1658SCraig Topper} 452cd3c1658SCraig Topper 453cd3c1658SCraig Topperdefine i64 @mul200(i64 %a) { 454cd3c1658SCraig Topper; RV64I-LABEL: mul200: 455cd3c1658SCraig Topper; RV64I: # %bb.0: 456cd3c1658SCraig Topper; RV64I-NEXT: li a1, 200 457cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 458cd3c1658SCraig Topper; RV64I-NEXT: ret 459cd3c1658SCraig Topper; 460cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul200: 461cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 462cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 463cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 464cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 3 465cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 466cd3c1658SCraig Topper %c = mul i64 %a, 200 467cd3c1658SCraig Topper ret i64 %c 468cd3c1658SCraig Topper} 469cd3c1658SCraig Topper 470cd3c1658SCraig Topperdefine i64 @addmul200(i64 %a, i64 %b) { 471cd3c1658SCraig Topper; RV64I-LABEL: addmul200: 472cd3c1658SCraig Topper; RV64I: # %bb.0: 473cd3c1658SCraig Topper; RV64I-NEXT: li a2, 200 474cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a2 475cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 476cd3c1658SCraig Topper; RV64I-NEXT: ret 477cd3c1658SCraig Topper; 478cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul200: 479cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 480cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 481cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 482cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 483cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 484cd3c1658SCraig Topper %c = mul i64 %a, 200 485cd3c1658SCraig Topper %d = add i64 %c, %b 486cd3c1658SCraig Topper ret i64 %d 487cd3c1658SCraig Topper} 488cd3c1658SCraig Topper 489cd3c1658SCraig Topperdefine i64 @addmul4096(i64 %a, i64 %b) { 490cd3c1658SCraig Topper; CHECK-LABEL: addmul4096: 491cd3c1658SCraig Topper; CHECK: # %bb.0: 492cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 12 493cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 494cd3c1658SCraig Topper; CHECK-NEXT: ret 495cd3c1658SCraig Topper %c = mul i64 %a, 4096 496cd3c1658SCraig Topper %d = add i64 %c, %b 497cd3c1658SCraig Topper ret i64 %d 498cd3c1658SCraig Topper} 499cd3c1658SCraig Topper 500cd3c1658SCraig Topperdefine i64 @addmul4230(i64 %a, i64 %b) { 501cd3c1658SCraig Topper; CHECK-LABEL: addmul4230: 502cd3c1658SCraig Topper; CHECK: # %bb.0: 503cd3c1658SCraig Topper; CHECK-NEXT: lui a2, 1 504cd3c1658SCraig Topper; CHECK-NEXT: addiw a2, a2, 134 505cd3c1658SCraig Topper; CHECK-NEXT: mul a0, a0, a2 506cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 507cd3c1658SCraig Topper; CHECK-NEXT: ret 508cd3c1658SCraig Topper %c = mul i64 %a, 4230 509cd3c1658SCraig Topper %d = add i64 %c, %b 510cd3c1658SCraig Topper ret i64 %d 511cd3c1658SCraig Topper} 512cd3c1658SCraig Topper 513cd3c1658SCraig Topperdefine i64 @mul96(i64 %a) { 514cd3c1658SCraig Topper; RV64I-LABEL: mul96: 515cd3c1658SCraig Topper; RV64I: # %bb.0: 516cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 5 517cd3c1658SCraig Topper; RV64I-NEXT: slli a0, a0, 7 518cd3c1658SCraig Topper; RV64I-NEXT: sub a0, a0, a1 519cd3c1658SCraig Topper; RV64I-NEXT: ret 520cd3c1658SCraig Topper; 521cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul96: 522cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 523cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 524cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 5 525cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 526cd3c1658SCraig Topper %c = mul i64 %a, 96 527cd3c1658SCraig Topper ret i64 %c 528cd3c1658SCraig Topper} 529cd3c1658SCraig Topper 530cd3c1658SCraig Topperdefine i64 @mul119(i64 %a) { 531cd3c1658SCraig Topper; RV64I-LABEL: mul119: 532cd3c1658SCraig Topper; RV64I: # %bb.0: 533cd3c1658SCraig Topper; RV64I-NEXT: li a1, 119 534cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 535cd3c1658SCraig Topper; RV64I-NEXT: ret 536cd3c1658SCraig Topper; 537cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul119: 538cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 539cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 540cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 541cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: sub a0, a0, a1 542cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 543cd3c1658SCraig Topper %c = mul i64 %a, 119 544cd3c1658SCraig Topper ret i64 %c 545cd3c1658SCraig Topper} 546cd3c1658SCraig Topper 547cd3c1658SCraig Topperdefine i64 @mul123(i64 %a) { 548cd3c1658SCraig Topper; RV64I-LABEL: mul123: 549cd3c1658SCraig Topper; RV64I: # %bb.0: 550cd3c1658SCraig Topper; RV64I-NEXT: li a1, 123 551cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 552cd3c1658SCraig Topper; RV64I-NEXT: ret 553cd3c1658SCraig Topper; 554cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul123: 555cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 556cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 557cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 558cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: sub a0, a0, a1 559cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 560cd3c1658SCraig Topper %c = mul i64 %a, 123 561cd3c1658SCraig Topper ret i64 %c 562cd3c1658SCraig Topper} 563cd3c1658SCraig Topper 564cd3c1658SCraig Topperdefine i64 @mul125(i64 %a) { 565cd3c1658SCraig Topper; RV64I-LABEL: mul125: 566cd3c1658SCraig Topper; RV64I: # %bb.0: 567cd3c1658SCraig Topper; RV64I-NEXT: li a1, 125 568cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 569cd3c1658SCraig Topper; RV64I-NEXT: ret 570cd3c1658SCraig Topper; 571cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul125: 572cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 573cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 1 574cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 575cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: sub a0, a0, a1 576cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 577cd3c1658SCraig Topper %c = mul i64 %a, 125 578cd3c1658SCraig Topper ret i64 %c 579cd3c1658SCraig Topper} 580cd3c1658SCraig Topper 581cd3c1658SCraig Topperdefine i64 @mul131(i64 %a) { 582cd3c1658SCraig Topper; RV64I-LABEL: mul131: 583cd3c1658SCraig Topper; RV64I: # %bb.0: 584cd3c1658SCraig Topper; RV64I-NEXT: li a1, 131 585cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 586cd3c1658SCraig Topper; RV64I-NEXT: ret 587cd3c1658SCraig Topper; 588cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul131: 589cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 590cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 1 591cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 592cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 593cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 594cd3c1658SCraig Topper %c = mul i64 %a, 131 595cd3c1658SCraig Topper ret i64 %c 596cd3c1658SCraig Topper} 597cd3c1658SCraig Topper 598cd3c1658SCraig Topperdefine i64 @mul133(i64 %a) { 599cd3c1658SCraig Topper; RV64I-LABEL: mul133: 600cd3c1658SCraig Topper; RV64I: # %bb.0: 601cd3c1658SCraig Topper; RV64I-NEXT: li a1, 133 602cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 603cd3c1658SCraig Topper; RV64I-NEXT: ret 604cd3c1658SCraig Topper; 605cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul133: 606cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 607cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 608cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 609cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 610cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 611cd3c1658SCraig Topper %c = mul i64 %a, 133 612cd3c1658SCraig Topper ret i64 %c 613cd3c1658SCraig Topper} 614cd3c1658SCraig Topper 615cd3c1658SCraig Topperdefine i64 @mul137(i64 %a) { 616cd3c1658SCraig Topper; RV64I-LABEL: mul137: 617cd3c1658SCraig Topper; RV64I: # %bb.0: 618cd3c1658SCraig Topper; RV64I-NEXT: li a1, 137 619cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 620cd3c1658SCraig Topper; RV64I-NEXT: ret 621cd3c1658SCraig Topper; 622cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul137: 623cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 624cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 625cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 7 626cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 627cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 628cd3c1658SCraig Topper %c = mul i64 %a, 137 629cd3c1658SCraig Topper ret i64 %c 630cd3c1658SCraig Topper} 631cd3c1658SCraig Topper 632cd3c1658SCraig Topperdefine i64 @mul160(i64 %a) { 633cd3c1658SCraig Topper; RV64I-LABEL: mul160: 634cd3c1658SCraig Topper; RV64I: # %bb.0: 635cd3c1658SCraig Topper; RV64I-NEXT: li a1, 160 636cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 637cd3c1658SCraig Topper; RV64I-NEXT: ret 638cd3c1658SCraig Topper; 639cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul160: 640cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 641cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 642cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 5 643cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 644cd3c1658SCraig Topper %c = mul i64 %a, 160 645cd3c1658SCraig Topper ret i64 %c 646cd3c1658SCraig Topper} 647cd3c1658SCraig Topper 648cd3c1658SCraig Topperdefine i64 @mul288(i64 %a) { 649cd3c1658SCraig Topper; RV64I-LABEL: mul288: 650cd3c1658SCraig Topper; RV64I: # %bb.0: 651cd3c1658SCraig Topper; RV64I-NEXT: li a1, 288 652cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 653cd3c1658SCraig Topper; RV64I-NEXT: ret 654cd3c1658SCraig Topper; 655cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul288: 656cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 657cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 658cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a0, a0, 5 659cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 660cd3c1658SCraig Topper %c = mul i64 %a, 288 661cd3c1658SCraig Topper ret i64 %c 662cd3c1658SCraig Topper} 663cd3c1658SCraig Topper 664*c557ce9fSCraig Topperdefine i64 @sh1add_imm(i64 %0) { 665*c557ce9fSCraig Topper; CHECK-LABEL: sh1add_imm: 666*c557ce9fSCraig Topper; CHECK: # %bb.0: 667*c557ce9fSCraig Topper; CHECK-NEXT: slli a0, a0, 1 668*c557ce9fSCraig Topper; CHECK-NEXT: addi a0, a0, 5 669*c557ce9fSCraig Topper; CHECK-NEXT: ret 670*c557ce9fSCraig Topper %a = shl i64 %0, 1 671*c557ce9fSCraig Topper %b = add i64 %a, 5 672*c557ce9fSCraig Topper ret i64 %b 673*c557ce9fSCraig Topper} 674*c557ce9fSCraig Topper 675*c557ce9fSCraig Topperdefine i64 @sh2add_imm(i64 %0) { 676*c557ce9fSCraig Topper; CHECK-LABEL: sh2add_imm: 677*c557ce9fSCraig Topper; CHECK: # %bb.0: 678*c557ce9fSCraig Topper; CHECK-NEXT: slli a0, a0, 2 679*c557ce9fSCraig Topper; CHECK-NEXT: addi a0, a0, -6 680*c557ce9fSCraig Topper; CHECK-NEXT: ret 681*c557ce9fSCraig Topper %a = shl i64 %0, 2 682*c557ce9fSCraig Topper %b = add i64 %a, -6 683*c557ce9fSCraig Topper ret i64 %b 684*c557ce9fSCraig Topper} 685*c557ce9fSCraig Topper 686*c557ce9fSCraig Topperdefine i64 @sh3add_imm(i64 %0) { 687*c557ce9fSCraig Topper; CHECK-LABEL: sh3add_imm: 688*c557ce9fSCraig Topper; CHECK: # %bb.0: 689*c557ce9fSCraig Topper; CHECK-NEXT: slli a0, a0, 3 690*c557ce9fSCraig Topper; CHECK-NEXT: addi a0, a0, 7 691*c557ce9fSCraig Topper; CHECK-NEXT: ret 692*c557ce9fSCraig Topper %a = shl i64 %0, 3 693*c557ce9fSCraig Topper %b = add i64 %a, 7 694*c557ce9fSCraig Topper ret i64 %b 695*c557ce9fSCraig Topper} 696*c557ce9fSCraig Topper 697cd3c1658SCraig Topperdefine i64 @mul258(i64 %a) { 698cd3c1658SCraig Topper; RV64I-LABEL: mul258: 699cd3c1658SCraig Topper; RV64I: # %bb.0: 700cd3c1658SCraig Topper; RV64I-NEXT: li a1, 258 701cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 702cd3c1658SCraig Topper; RV64I-NEXT: ret 703cd3c1658SCraig Topper; 704cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul258: 705cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 706cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 8 707cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 708cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 709cd3c1658SCraig Topper %c = mul i64 %a, 258 710cd3c1658SCraig Topper ret i64 %c 711cd3c1658SCraig Topper} 712cd3c1658SCraig Topper 713cd3c1658SCraig Topperdefine i64 @mul260(i64 %a) { 714cd3c1658SCraig Topper; RV64I-LABEL: mul260: 715cd3c1658SCraig Topper; RV64I: # %bb.0: 716cd3c1658SCraig Topper; RV64I-NEXT: li a1, 260 717cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 718cd3c1658SCraig Topper; RV64I-NEXT: ret 719cd3c1658SCraig Topper; 720cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul260: 721cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 722cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 8 723cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 724cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 725cd3c1658SCraig Topper %c = mul i64 %a, 260 726cd3c1658SCraig Topper ret i64 %c 727cd3c1658SCraig Topper} 728cd3c1658SCraig Topper 729cd3c1658SCraig Topperdefine i64 @mul264(i64 %a) { 730cd3c1658SCraig Topper; RV64I-LABEL: mul264: 731cd3c1658SCraig Topper; RV64I: # %bb.0: 732cd3c1658SCraig Topper; RV64I-NEXT: li a1, 264 733cd3c1658SCraig Topper; RV64I-NEXT: mul a0, a0, a1 734cd3c1658SCraig Topper; RV64I-NEXT: ret 735cd3c1658SCraig Topper; 736cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul264: 737cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 738cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 8 739cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 740cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 741cd3c1658SCraig Topper %c = mul i64 %a, 264 742cd3c1658SCraig Topper ret i64 %c 743cd3c1658SCraig Topper} 744282ab543SPhilip Reamesdefine i64 @mul11(i64 %a) { 745282ab543SPhilip Reames; RV64I-LABEL: mul11: 746282ab543SPhilip Reames; RV64I: # %bb.0: 747282ab543SPhilip Reames; RV64I-NEXT: li a1, 11 748282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 749282ab543SPhilip Reames; RV64I-NEXT: ret 750282ab543SPhilip Reames; 751282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul11: 752282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 753282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 754282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 755282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 756282ab543SPhilip Reames %c = mul i64 %a, 11 757282ab543SPhilip Reames ret i64 %c 758282ab543SPhilip Reames} 759282ab543SPhilip Reames 760282ab543SPhilip Reamesdefine i64 @mul19(i64 %a) { 761282ab543SPhilip Reames; RV64I-LABEL: mul19: 762282ab543SPhilip Reames; RV64I: # %bb.0: 763282ab543SPhilip Reames; RV64I-NEXT: li a1, 19 764282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 765282ab543SPhilip Reames; RV64I-NEXT: ret 766282ab543SPhilip Reames; 767282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul19: 768282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 769282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 770282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 771282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 772282ab543SPhilip Reames %c = mul i64 %a, 19 773282ab543SPhilip Reames ret i64 %c 774282ab543SPhilip Reames} 775282ab543SPhilip Reames 776282ab543SPhilip Reamesdefine i64 @mul13(i64 %a) { 777282ab543SPhilip Reames; RV64I-LABEL: mul13: 778282ab543SPhilip Reames; RV64I: # %bb.0: 779282ab543SPhilip Reames; RV64I-NEXT: li a1, 13 780282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 781282ab543SPhilip Reames; RV64I-NEXT: ret 782282ab543SPhilip Reames; 783282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul13: 784282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 785282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 1 786282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 787282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 788282ab543SPhilip Reames %c = mul i64 %a, 13 789282ab543SPhilip Reames ret i64 %c 790282ab543SPhilip Reames} 791282ab543SPhilip Reames 792282ab543SPhilip Reamesdefine i64 @mul21(i64 %a) { 793282ab543SPhilip Reames; RV64I-LABEL: mul21: 794282ab543SPhilip Reames; RV64I: # %bb.0: 795282ab543SPhilip Reames; RV64I-NEXT: li a1, 21 796282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 797282ab543SPhilip Reames; RV64I-NEXT: ret 798282ab543SPhilip Reames; 799282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul21: 800282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 801282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 802282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 803282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 804282ab543SPhilip Reames %c = mul i64 %a, 21 805282ab543SPhilip Reames ret i64 %c 806282ab543SPhilip Reames} 807282ab543SPhilip Reames 808282ab543SPhilip Reamesdefine i64 @mul37(i64 %a) { 809282ab543SPhilip Reames; RV64I-LABEL: mul37: 810282ab543SPhilip Reames; RV64I: # %bb.0: 811282ab543SPhilip Reames; RV64I-NEXT: li a1, 37 812282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 813282ab543SPhilip Reames; RV64I-NEXT: ret 814282ab543SPhilip Reames; 815282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul37: 816282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 817282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 818282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 819282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 820282ab543SPhilip Reames %c = mul i64 %a, 37 821282ab543SPhilip Reames ret i64 %c 822282ab543SPhilip Reames} 823282ab543SPhilip Reames 824282ab543SPhilip Reamesdefine i64 @mul25(i64 %a) { 825282ab543SPhilip Reames; RV64I-LABEL: mul25: 826282ab543SPhilip Reames; RV64I: # %bb.0: 827282ab543SPhilip Reames; RV64I-NEXT: li a1, 25 828282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 829282ab543SPhilip Reames; RV64I-NEXT: ret 830282ab543SPhilip Reames; 831282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul25: 832282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 833282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 834282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 835282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 836282ab543SPhilip Reames %c = mul i64 %a, 25 837282ab543SPhilip Reames ret i64 %c 838282ab543SPhilip Reames} 839282ab543SPhilip Reames 840282ab543SPhilip Reamesdefine i64 @mul41(i64 %a) { 841282ab543SPhilip Reames; RV64I-LABEL: mul41: 842282ab543SPhilip Reames; RV64I: # %bb.0: 843282ab543SPhilip Reames; RV64I-NEXT: li a1, 41 844282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 845282ab543SPhilip Reames; RV64I-NEXT: ret 846282ab543SPhilip Reames; 847282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul41: 848282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 849282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 2 850282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 851282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 852282ab543SPhilip Reames %c = mul i64 %a, 41 853282ab543SPhilip Reames ret i64 %c 854282ab543SPhilip Reames} 855282ab543SPhilip Reames 856282ab543SPhilip Reamesdefine i64 @mul73(i64 %a) { 857282ab543SPhilip Reames; RV64I-LABEL: mul73: 858282ab543SPhilip Reames; RV64I: # %bb.0: 859282ab543SPhilip Reames; RV64I-NEXT: li a1, 73 860282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 861282ab543SPhilip Reames; RV64I-NEXT: ret 862282ab543SPhilip Reames; 863282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul73: 864282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 865282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a1, a0, a0, 3 866282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 867282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 868282ab543SPhilip Reames %c = mul i64 %a, 73 869282ab543SPhilip Reames ret i64 %c 870282ab543SPhilip Reames} 871282ab543SPhilip Reames 872282ab543SPhilip Reamesdefine i64 @mul27(i64 %a) { 873282ab543SPhilip Reames; RV64I-LABEL: mul27: 874282ab543SPhilip Reames; RV64I: # %bb.0: 875282ab543SPhilip Reames; RV64I-NEXT: li a1, 27 876282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 877282ab543SPhilip Reames; RV64I-NEXT: ret 878282ab543SPhilip Reames; 879282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul27: 880282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 881282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 88203760ad0SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 883282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 884282ab543SPhilip Reames %c = mul i64 %a, 27 885282ab543SPhilip Reames ret i64 %c 886282ab543SPhilip Reames} 887282ab543SPhilip Reames 888282ab543SPhilip Reamesdefine i64 @mul45(i64 %a) { 889282ab543SPhilip Reames; RV64I-LABEL: mul45: 890282ab543SPhilip Reames; RV64I: # %bb.0: 891282ab543SPhilip Reames; RV64I-NEXT: li a1, 45 892282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 893282ab543SPhilip Reames; RV64I-NEXT: ret 894282ab543SPhilip Reames; 895282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul45: 896282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 897282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 89803760ad0SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 899282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 900282ab543SPhilip Reames %c = mul i64 %a, 45 901282ab543SPhilip Reames ret i64 %c 902282ab543SPhilip Reames} 903282ab543SPhilip Reames 904282ab543SPhilip Reamesdefine i64 @mul81(i64 %a) { 905282ab543SPhilip Reames; RV64I-LABEL: mul81: 906282ab543SPhilip Reames; RV64I: # %bb.0: 907282ab543SPhilip Reames; RV64I-NEXT: li a1, 81 908282ab543SPhilip Reames; RV64I-NEXT: mul a0, a0, a1 909282ab543SPhilip Reames; RV64I-NEXT: ret 910282ab543SPhilip Reames; 911282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul81: 912282ab543SPhilip Reames; RV64XTHEADBA: # %bb.0: 913282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 914282ab543SPhilip Reames; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 915282ab543SPhilip Reames; RV64XTHEADBA-NEXT: ret 916282ab543SPhilip Reames %c = mul i64 %a, 81 917282ab543SPhilip Reames ret i64 %c 918282ab543SPhilip Reames} 919282ab543SPhilip Reames 920cd3c1658SCraig Topperdefine i64 @mul4098(i64 %a) { 921cd3c1658SCraig Topper; RV64I-LABEL: mul4098: 922e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 923cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 1 924cd3c1658SCraig Topper; RV64I-NEXT: slli a0, a0, 12 925cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 926cd3c1658SCraig Topper; RV64I-NEXT: ret 927cd3c1658SCraig Topper; 928cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4098: 929cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 930cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 12 931cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1 932cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 933cd3c1658SCraig Topper %c = mul i64 %a, 4098 934cd3c1658SCraig Topper ret i64 %c 935cd3c1658SCraig Topper} 936cd3c1658SCraig Topper 937cd3c1658SCraig Topperdefine i64 @mul4100(i64 %a) { 938cd3c1658SCraig Topper; RV64I-LABEL: mul4100: 939cd3c1658SCraig Topper; RV64I: # %bb.0: 940cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 2 941cd3c1658SCraig Topper; RV64I-NEXT: slli a0, a0, 12 942cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 943cd3c1658SCraig Topper; RV64I-NEXT: ret 944cd3c1658SCraig Topper; 945cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4100: 946cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 947cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 12 948cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2 949cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 950cd3c1658SCraig Topper %c = mul i64 %a, 4100 951cd3c1658SCraig Topper ret i64 %c 952cd3c1658SCraig Topper} 953cd3c1658SCraig Topper 954cd3c1658SCraig Topperdefine i64 @mul4104(i64 %a) { 955cd3c1658SCraig Topper; RV64I-LABEL: mul4104: 956cd3c1658SCraig Topper; RV64I: # %bb.0: 957cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 3 958cd3c1658SCraig Topper; RV64I-NEXT: slli a0, a0, 12 959cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 960cd3c1658SCraig Topper; RV64I-NEXT: ret 961cd3c1658SCraig Topper; 962cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4104: 963cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 964cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a0, 12 965cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 3 966cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 967cd3c1658SCraig Topper %c = mul i64 %a, 4104 968cd3c1658SCraig Topper ret i64 %c 969cd3c1658SCraig Topper} 970cd3c1658SCraig Topper 971cd3c1658SCraig Topperdefine signext i32 @mulw192(i32 signext %a) { 972cd3c1658SCraig Topper; RV64I-LABEL: mulw192: 973cd3c1658SCraig Topper; RV64I: # %bb.0: 974cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 6 975cd3c1658SCraig Topper; RV64I-NEXT: slli a0, a0, 8 976cd3c1658SCraig Topper; RV64I-NEXT: subw a0, a0, a1 977cd3c1658SCraig Topper; RV64I-NEXT: ret 978cd3c1658SCraig Topper; 979cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw192: 980cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 981cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 982cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slliw a0, a0, 6 983cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 984cd3c1658SCraig Topper %c = mul i32 %a, 192 985cd3c1658SCraig Topper ret i32 %c 986cd3c1658SCraig Topper} 987cd3c1658SCraig Topper 988cd3c1658SCraig Topperdefine signext i32 @mulw320(i32 signext %a) { 989cd3c1658SCraig Topper; RV64I-LABEL: mulw320: 990cd3c1658SCraig Topper; RV64I: # %bb.0: 991cd3c1658SCraig Topper; RV64I-NEXT: li a1, 320 992cd3c1658SCraig Topper; RV64I-NEXT: mulw a0, a0, a1 993cd3c1658SCraig Topper; RV64I-NEXT: ret 994cd3c1658SCraig Topper; 995cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw320: 996cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 997cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 998cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slliw a0, a0, 6 999cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1000cd3c1658SCraig Topper %c = mul i32 %a, 320 1001cd3c1658SCraig Topper ret i32 %c 1002cd3c1658SCraig Topper} 1003cd3c1658SCraig Topper 1004cd3c1658SCraig Topperdefine signext i32 @mulw576(i32 signext %a) { 1005cd3c1658SCraig Topper; RV64I-LABEL: mulw576: 1006cd3c1658SCraig Topper; RV64I: # %bb.0: 1007cd3c1658SCraig Topper; RV64I-NEXT: li a1, 576 1008cd3c1658SCraig Topper; RV64I-NEXT: mulw a0, a0, a1 1009cd3c1658SCraig Topper; RV64I-NEXT: ret 1010cd3c1658SCraig Topper; 1011cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw576: 1012cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1013cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3 1014cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slliw a0, a0, 6 1015cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1016cd3c1658SCraig Topper %c = mul i32 %a, 576 1017cd3c1658SCraig Topper ret i32 %c 1018cd3c1658SCraig Topper} 1019cd3c1658SCraig Topper 1020cd3c1658SCraig Topperdefine i64 @add4104(i64 %a) { 1021814902a0SCraig Topper; RV64I-LABEL: add4104: 1022814902a0SCraig Topper; RV64I: # %bb.0: 1023814902a0SCraig Topper; RV64I-NEXT: lui a1, 1 1024814902a0SCraig Topper; RV64I-NEXT: addiw a1, a1, 8 1025814902a0SCraig Topper; RV64I-NEXT: add a0, a0, a1 1026814902a0SCraig Topper; RV64I-NEXT: ret 1027814902a0SCraig Topper; 1028814902a0SCraig Topper; RV64XTHEADBA-LABEL: add4104: 1029814902a0SCraig Topper; RV64XTHEADBA: # %bb.0: 1030814902a0SCraig Topper; RV64XTHEADBA-NEXT: li a1, 1026 1031814902a0SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1032814902a0SCraig Topper; RV64XTHEADBA-NEXT: ret 1033cd3c1658SCraig Topper %c = add i64 %a, 4104 1034cd3c1658SCraig Topper ret i64 %c 1035cd3c1658SCraig Topper} 1036cd3c1658SCraig Topper 1037cd3c1658SCraig Topperdefine i64 @add4104_2(i64 %a) { 1038*c557ce9fSCraig Topper; RV64I-LABEL: add4104_2: 1039*c557ce9fSCraig Topper; RV64I: # %bb.0: 1040*c557ce9fSCraig Topper; RV64I-NEXT: lui a1, 1 1041*c557ce9fSCraig Topper; RV64I-NEXT: addiw a1, a1, 8 1042*c557ce9fSCraig Topper; RV64I-NEXT: or a0, a0, a1 1043*c557ce9fSCraig Topper; RV64I-NEXT: ret 1044*c557ce9fSCraig Topper; 1045*c557ce9fSCraig Topper; RV64XTHEADBA-LABEL: add4104_2: 1046*c557ce9fSCraig Topper; RV64XTHEADBA: # %bb.0: 1047*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: li a1, 1026 1048*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1049*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT: ret 1050cd3c1658SCraig Topper %c = or disjoint i64 %a, 4104 1051cd3c1658SCraig Topper ret i64 %c 1052cd3c1658SCraig Topper} 1053cd3c1658SCraig Topper 1054cd3c1658SCraig Topperdefine i64 @add8208(i64 %a) { 1055814902a0SCraig Topper; RV64I-LABEL: add8208: 1056814902a0SCraig Topper; RV64I: # %bb.0: 1057814902a0SCraig Topper; RV64I-NEXT: lui a1, 2 1058814902a0SCraig Topper; RV64I-NEXT: addiw a1, a1, 16 1059814902a0SCraig Topper; RV64I-NEXT: add a0, a0, a1 1060814902a0SCraig Topper; RV64I-NEXT: ret 1061814902a0SCraig Topper; 1062814902a0SCraig Topper; RV64XTHEADBA-LABEL: add8208: 1063814902a0SCraig Topper; RV64XTHEADBA: # %bb.0: 1064814902a0SCraig Topper; RV64XTHEADBA-NEXT: li a1, 1026 1065814902a0SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1066814902a0SCraig Topper; RV64XTHEADBA-NEXT: ret 1067cd3c1658SCraig Topper %c = add i64 %a, 8208 1068cd3c1658SCraig Topper ret i64 %c 1069cd3c1658SCraig Topper} 1070cd3c1658SCraig Topper 1071cd3c1658SCraig Topper; Make sure we prefer LUI for the 8192 instead of using sh3add. 1072cd3c1658SCraig Topperdefine signext i32 @add8192_i32(i32 signext %a) { 1073cd3c1658SCraig Topper; CHECK-LABEL: add8192_i32: 1074cd3c1658SCraig Topper; CHECK: # %bb.0: 1075cd3c1658SCraig Topper; CHECK-NEXT: lui a1, 2 1076cd3c1658SCraig Topper; CHECK-NEXT: addw a0, a0, a1 1077cd3c1658SCraig Topper; CHECK-NEXT: ret 1078cd3c1658SCraig Topper %c = add i32 %a, 8192 1079cd3c1658SCraig Topper ret i32 %c 1080cd3c1658SCraig Topper} 1081cd3c1658SCraig Topper 1082cd3c1658SCraig Topper; Make sure we prefer LUI for the 8192 instead of using sh3add. 1083cd3c1658SCraig Topperdefine i64 @add8192(i64 %a) { 1084cd3c1658SCraig Topper; CHECK-LABEL: add8192: 1085cd3c1658SCraig Topper; CHECK: # %bb.0: 1086cd3c1658SCraig Topper; CHECK-NEXT: lui a1, 2 1087cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1088cd3c1658SCraig Topper; CHECK-NEXT: ret 1089cd3c1658SCraig Topper %c = add i64 %a, 8192 1090cd3c1658SCraig Topper ret i64 %c 1091cd3c1658SCraig Topper} 1092cd3c1658SCraig Topper 1093cd3c1658SCraig Topperdefine signext i32 @addshl32_5_6(i32 signext %a, i32 signext %b) { 1094cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_6: 1095cd3c1658SCraig Topper; CHECK: # %bb.0: 1096cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1097cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 6 1098cd3c1658SCraig Topper; CHECK-NEXT: addw a0, a0, a1 1099cd3c1658SCraig Topper; CHECK-NEXT: ret 1100cd3c1658SCraig Topper %c = shl i32 %a, 5 1101cd3c1658SCraig Topper %d = shl i32 %b, 6 1102cd3c1658SCraig Topper %e = add i32 %c, %d 1103cd3c1658SCraig Topper ret i32 %e 1104cd3c1658SCraig Topper} 1105cd3c1658SCraig Topper 1106cd3c1658SCraig Topperdefine i64 @addshl64_5_6(i64 %a, i64 %b) { 1107cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_6: 1108cd3c1658SCraig Topper; CHECK: # %bb.0: 1109cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1110cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 6 1111cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1112cd3c1658SCraig Topper; CHECK-NEXT: ret 1113cd3c1658SCraig Topper %c = shl i64 %a, 5 1114cd3c1658SCraig Topper %d = shl i64 %b, 6 1115cd3c1658SCraig Topper %e = add i64 %c, %d 1116cd3c1658SCraig Topper ret i64 %e 1117cd3c1658SCraig Topper} 1118cd3c1658SCraig Topper 1119cd3c1658SCraig Topperdefine signext i32 @addshl32_5_7(i32 signext %a, i32 signext %b) { 1120cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_7: 1121cd3c1658SCraig Topper; CHECK: # %bb.0: 1122cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1123cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 7 1124cd3c1658SCraig Topper; CHECK-NEXT: addw a0, a0, a1 1125cd3c1658SCraig Topper; CHECK-NEXT: ret 1126cd3c1658SCraig Topper %c = shl i32 %a, 5 1127cd3c1658SCraig Topper %d = shl i32 %b, 7 1128cd3c1658SCraig Topper %e = add i32 %c, %d 1129cd3c1658SCraig Topper ret i32 %e 1130cd3c1658SCraig Topper} 1131cd3c1658SCraig Topper 1132cd3c1658SCraig Topperdefine i64 @addshl64_5_7(i64 %a, i64 %b) { 1133cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_7: 1134cd3c1658SCraig Topper; CHECK: # %bb.0: 1135cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1136cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 7 1137cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1138cd3c1658SCraig Topper; CHECK-NEXT: ret 1139cd3c1658SCraig Topper %c = shl i64 %a, 5 1140cd3c1658SCraig Topper %d = shl i64 %b, 7 1141cd3c1658SCraig Topper %e = add i64 %c, %d 1142cd3c1658SCraig Topper ret i64 %e 1143cd3c1658SCraig Topper} 1144cd3c1658SCraig Topper 1145cd3c1658SCraig Topperdefine signext i32 @addshl32_5_8(i32 signext %a, i32 signext %b) { 1146cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_8: 1147cd3c1658SCraig Topper; CHECK: # %bb.0: 1148cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1149cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 8 1150cd3c1658SCraig Topper; CHECK-NEXT: addw a0, a0, a1 1151cd3c1658SCraig Topper; CHECK-NEXT: ret 1152cd3c1658SCraig Topper %c = shl i32 %a, 5 1153cd3c1658SCraig Topper %d = shl i32 %b, 8 1154cd3c1658SCraig Topper %e = add i32 %c, %d 1155cd3c1658SCraig Topper ret i32 %e 1156cd3c1658SCraig Topper} 1157cd3c1658SCraig Topper 1158cd3c1658SCraig Topperdefine i64 @addshl64_5_8(i64 %a, i64 %b) { 1159cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_8: 1160cd3c1658SCraig Topper; CHECK: # %bb.0: 1161cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 5 1162cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 8 1163cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1164cd3c1658SCraig Topper; CHECK-NEXT: ret 1165cd3c1658SCraig Topper %c = shl i64 %a, 5 1166cd3c1658SCraig Topper %d = shl i64 %b, 8 1167cd3c1658SCraig Topper %e = add i64 %c, %d 1168cd3c1658SCraig Topper ret i64 %e 1169cd3c1658SCraig Topper} 1170cd3c1658SCraig Topper 1171cd3c1658SCraig Topperdefine i64 @sh6_sh3_add1(i64 noundef %x, i64 noundef %y, i64 noundef %z) { 1172cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add1: 1173cd3c1658SCraig Topper; RV64I: # %bb.0: # %entry 1174cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1175cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1176cd3c1658SCraig Topper; RV64I-NEXT: add a1, a1, a2 1177cd3c1658SCraig Topper; RV64I-NEXT: add a0, a1, a0 1178cd3c1658SCraig Topper; RV64I-NEXT: ret 1179cd3c1658SCraig Topper; 1180cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add1: 1181cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: # %entry 1182cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1183cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a1, a2, 3 1184cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a1, a0 1185cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1186cd3c1658SCraig Topperentry: 1187cd3c1658SCraig Topper %shl = shl i64 %z, 3 1188cd3c1658SCraig Topper %shl1 = shl i64 %y, 6 1189cd3c1658SCraig Topper %add = add nsw i64 %shl1, %shl 1190cd3c1658SCraig Topper %add2 = add nsw i64 %add, %x 1191cd3c1658SCraig Topper ret i64 %add2 1192cd3c1658SCraig Topper} 1193cd3c1658SCraig Topper 1194cd3c1658SCraig Topperdefine i64 @sh6_sh3_add2(i64 noundef %x, i64 noundef %y, i64 noundef %z) { 1195cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add2: 1196cd3c1658SCraig Topper; RV64I: # %bb.0: # %entry 1197cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1198cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1199cd3c1658SCraig Topper; RV64I-NEXT: add a0, a1, a0 1200cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1201cd3c1658SCraig Topper; RV64I-NEXT: ret 1202cd3c1658SCraig Topper; 1203cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add2: 1204cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: # %entry 1205cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1206cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a1, a0 1207cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1208cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1209cd3c1658SCraig Topperentry: 1210cd3c1658SCraig Topper %shl = shl i64 %z, 3 1211cd3c1658SCraig Topper %shl1 = shl i64 %y, 6 1212cd3c1658SCraig Topper %add = add nsw i64 %shl1, %x 1213cd3c1658SCraig Topper %add2 = add nsw i64 %add, %shl 1214cd3c1658SCraig Topper ret i64 %add2 1215cd3c1658SCraig Topper} 1216cd3c1658SCraig Topper 1217cd3c1658SCraig Topperdefine i64 @sh6_sh3_add3(i64 noundef %x, i64 noundef %y, i64 noundef %z) { 1218cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add3: 1219cd3c1658SCraig Topper; RV64I: # %bb.0: # %entry 1220cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1221cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1222cd3c1658SCraig Topper; RV64I-NEXT: add a1, a1, a2 1223cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1224cd3c1658SCraig Topper; RV64I-NEXT: ret 1225cd3c1658SCraig Topper; 1226cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add3: 1227cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: # %entry 1228cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1229cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a1, a1, a2, 3 1230cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1231cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1232cd3c1658SCraig Topperentry: 1233cd3c1658SCraig Topper %shl = shl i64 %z, 3 1234cd3c1658SCraig Topper %shl1 = shl i64 %y, 6 1235cd3c1658SCraig Topper %add = add nsw i64 %shl1, %shl 1236cd3c1658SCraig Topper %add2 = add nsw i64 %x, %add 1237cd3c1658SCraig Topper ret i64 %add2 1238cd3c1658SCraig Topper} 1239cd3c1658SCraig Topper 1240cd3c1658SCraig Topperdefine i64 @sh6_sh3_add4(i64 noundef %x, i64 noundef %y, i64 noundef %z) { 1241cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add4: 1242cd3c1658SCraig Topper; RV64I: # %bb.0: # %entry 1243cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1244cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1245cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1246cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1247cd3c1658SCraig Topper; RV64I-NEXT: ret 1248cd3c1658SCraig Topper; 1249cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add4: 1250cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: # %entry 1251cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1252cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1253cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1254cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1255cd3c1658SCraig Topperentry: 1256cd3c1658SCraig Topper %shl = shl i64 %z, 3 1257cd3c1658SCraig Topper %shl1 = shl i64 %y, 6 1258cd3c1658SCraig Topper %add = add nsw i64 %x, %shl 1259cd3c1658SCraig Topper %add2 = add nsw i64 %add, %shl1 1260cd3c1658SCraig Topper ret i64 %add2 1261cd3c1658SCraig Topper} 1262cd3c1658SCraig Topper 1263cd3c1658SCraig Topperdefine signext i16 @srliw_1_sh1add(ptr %0, i32 signext %1) { 1264cd3c1658SCraig Topper; CHECK-LABEL: srliw_1_sh1add: 1265cd3c1658SCraig Topper; CHECK: # %bb.0: 1266cd3c1658SCraig Topper; CHECK-NEXT: srliw a1, a1, 1 1267cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 1 1268cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1269cd3c1658SCraig Topper; CHECK-NEXT: lh a0, 0(a0) 1270cd3c1658SCraig Topper; CHECK-NEXT: ret 1271cd3c1658SCraig Topper %3 = lshr i32 %1, 1 1272cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1273cd3c1658SCraig Topper %5 = getelementptr inbounds i16, ptr %0, i64 %4 1274cd3c1658SCraig Topper %6 = load i16, ptr %5, align 2 1275cd3c1658SCraig Topper ret i16 %6 1276cd3c1658SCraig Topper} 1277cd3c1658SCraig Topper 1278cd3c1658SCraig Topperdefine signext i32 @srliw_2_sh2add(ptr %0, i32 signext %1) { 1279cd3c1658SCraig Topper; CHECK-LABEL: srliw_2_sh2add: 1280cd3c1658SCraig Topper; CHECK: # %bb.0: 1281cd3c1658SCraig Topper; CHECK-NEXT: srliw a1, a1, 2 1282cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 2 1283cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1284cd3c1658SCraig Topper; CHECK-NEXT: lw a0, 0(a0) 1285cd3c1658SCraig Topper; CHECK-NEXT: ret 1286cd3c1658SCraig Topper %3 = lshr i32 %1, 2 1287cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1288cd3c1658SCraig Topper %5 = getelementptr inbounds i32, ptr %0, i64 %4 1289cd3c1658SCraig Topper %6 = load i32, ptr %5, align 4 1290cd3c1658SCraig Topper ret i32 %6 1291cd3c1658SCraig Topper} 1292cd3c1658SCraig Topper 1293cd3c1658SCraig Topperdefine i64 @srliw_3_sh3add(ptr %0, i32 signext %1) { 1294cd3c1658SCraig Topper; CHECK-LABEL: srliw_3_sh3add: 1295cd3c1658SCraig Topper; CHECK: # %bb.0: 1296cd3c1658SCraig Topper; CHECK-NEXT: srliw a1, a1, 3 1297cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 3 1298cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1299cd3c1658SCraig Topper; CHECK-NEXT: ld a0, 0(a0) 1300cd3c1658SCraig Topper; CHECK-NEXT: ret 1301cd3c1658SCraig Topper %3 = lshr i32 %1, 3 1302cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1303cd3c1658SCraig Topper %5 = getelementptr inbounds i64, ptr %0, i64 %4 1304cd3c1658SCraig Topper %6 = load i64, ptr %5, align 8 1305cd3c1658SCraig Topper ret i64 %6 1306cd3c1658SCraig Topper} 1307cd3c1658SCraig Topper 1308cd3c1658SCraig Topperdefine signext i32 @srliw_1_sh2add(ptr %0, i32 signext %1) { 1309cd3c1658SCraig Topper; RV64I-LABEL: srliw_1_sh2add: 1310cd3c1658SCraig Topper; RV64I: # %bb.0: 1311cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 1 1312cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 2 1313cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1314cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1315cd3c1658SCraig Topper; RV64I-NEXT: ret 1316cd3c1658SCraig Topper; 1317cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_1_sh2add: 1318cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1319cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 1 1320cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1321cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1322cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1323cd3c1658SCraig Topper %3 = lshr i32 %1, 1 1324cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1325cd3c1658SCraig Topper %5 = getelementptr inbounds i32, ptr %0, i64 %4 1326cd3c1658SCraig Topper %6 = load i32, ptr %5, align 4 1327cd3c1658SCraig Topper ret i32 %6 1328cd3c1658SCraig Topper} 1329cd3c1658SCraig Topper 1330cd3c1658SCraig Topperdefine i64 @srliw_1_sh3add(ptr %0, i32 signext %1) { 1331cd3c1658SCraig Topper; RV64I-LABEL: srliw_1_sh3add: 1332cd3c1658SCraig Topper; RV64I: # %bb.0: 1333cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 1 1334cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1335cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1336cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1337cd3c1658SCraig Topper; RV64I-NEXT: ret 1338cd3c1658SCraig Topper; 1339cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_1_sh3add: 1340cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1341cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 1 1342cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1343cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1344cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1345cd3c1658SCraig Topper %3 = lshr i32 %1, 1 1346cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1347cd3c1658SCraig Topper %5 = getelementptr inbounds i64, ptr %0, i64 %4 1348cd3c1658SCraig Topper %6 = load i64, ptr %5, align 8 1349cd3c1658SCraig Topper ret i64 %6 1350cd3c1658SCraig Topper} 1351cd3c1658SCraig Topper 1352cd3c1658SCraig Topperdefine i64 @srliw_2_sh3add(ptr %0, i32 signext %1) { 1353cd3c1658SCraig Topper; RV64I-LABEL: srliw_2_sh3add: 1354cd3c1658SCraig Topper; RV64I: # %bb.0: 1355cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 2 1356cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1357cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1358cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1359cd3c1658SCraig Topper; RV64I-NEXT: ret 1360cd3c1658SCraig Topper; 1361cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_2_sh3add: 1362cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1363cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 2 1364cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1365cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1366cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1367cd3c1658SCraig Topper %3 = lshr i32 %1, 2 1368cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1369cd3c1658SCraig Topper %5 = getelementptr inbounds i64, ptr %0, i64 %4 1370cd3c1658SCraig Topper %6 = load i64, ptr %5, align 8 1371cd3c1658SCraig Topper ret i64 %6 1372cd3c1658SCraig Topper} 1373cd3c1658SCraig Topper 1374cd3c1658SCraig Topperdefine signext i16 @srliw_2_sh1add(ptr %0, i32 signext %1) { 1375cd3c1658SCraig Topper; RV64I-LABEL: srliw_2_sh1add: 1376cd3c1658SCraig Topper; RV64I: # %bb.0: 1377cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 2 1378cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 1 1379cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1380cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1381cd3c1658SCraig Topper; RV64I-NEXT: ret 1382cd3c1658SCraig Topper; 1383cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_2_sh1add: 1384cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1385cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 2 1386cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 1387cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1388cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1389cd3c1658SCraig Topper %3 = lshr i32 %1, 2 1390cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1391cd3c1658SCraig Topper %5 = getelementptr inbounds i16, ptr %0, i64 %4 1392cd3c1658SCraig Topper %6 = load i16, ptr %5, align 2 1393cd3c1658SCraig Topper ret i16 %6 1394cd3c1658SCraig Topper} 1395cd3c1658SCraig Topper 1396cd3c1658SCraig Topper 1397cd3c1658SCraig Topperdefine signext i32 @srliw_3_sh2add(ptr %0, i32 signext %1) { 1398cd3c1658SCraig Topper; RV64I-LABEL: srliw_3_sh2add: 1399cd3c1658SCraig Topper; RV64I: # %bb.0: 1400cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 3 1401cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 2 1402cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1403cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1404cd3c1658SCraig Topper; RV64I-NEXT: ret 1405cd3c1658SCraig Topper; 1406cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_3_sh2add: 1407cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1408cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 3 1409cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1410cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1411cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1412cd3c1658SCraig Topper %3 = lshr i32 %1, 3 1413cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1414cd3c1658SCraig Topper %5 = getelementptr inbounds i32, ptr %0, i64 %4 1415cd3c1658SCraig Topper %6 = load i32, ptr %5, align 4 1416cd3c1658SCraig Topper ret i32 %6 1417cd3c1658SCraig Topper} 1418cd3c1658SCraig Topper 1419cd3c1658SCraig Topperdefine i64 @srliw_4_sh3add(ptr %0, i32 signext %1) { 1420cd3c1658SCraig Topper; RV64I-LABEL: srliw_4_sh3add: 1421cd3c1658SCraig Topper; RV64I: # %bb.0: 1422cd3c1658SCraig Topper; RV64I-NEXT: srliw a1, a1, 4 1423cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1424cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1425cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1426cd3c1658SCraig Topper; RV64I-NEXT: ret 1427cd3c1658SCraig Topper; 1428cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_4_sh3add: 1429cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1430cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srliw a1, a1, 4 1431cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1432cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1433cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1434cd3c1658SCraig Topper %3 = lshr i32 %1, 4 1435cd3c1658SCraig Topper %4 = zext i32 %3 to i64 1436cd3c1658SCraig Topper %5 = getelementptr inbounds i64, ptr %0, i64 %4 1437cd3c1658SCraig Topper %6 = load i64, ptr %5, align 8 1438cd3c1658SCraig Topper ret i64 %6 1439cd3c1658SCraig Topper} 1440cd3c1658SCraig Topper 1441cd3c1658SCraig Topperdefine signext i32 @srli_1_sh2add(ptr %0, i64 %1) { 1442cd3c1658SCraig Topper; RV64I-LABEL: srli_1_sh2add: 1443cd3c1658SCraig Topper; RV64I: # %bb.0: 1444cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 1 1445cd3c1658SCraig Topper; RV64I-NEXT: andi a1, a1, -4 1446cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1447cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1448cd3c1658SCraig Topper; RV64I-NEXT: ret 1449cd3c1658SCraig Topper; 1450cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_1_sh2add: 1451cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1452cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 1 1453cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1454cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1455cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1456cd3c1658SCraig Topper %3 = lshr i64 %1, 1 1457cd3c1658SCraig Topper %4 = getelementptr inbounds i32, ptr %0, i64 %3 1458cd3c1658SCraig Topper %5 = load i32, ptr %4, align 4 1459cd3c1658SCraig Topper ret i32 %5 1460cd3c1658SCraig Topper} 1461cd3c1658SCraig Topper 1462cd3c1658SCraig Topperdefine i64 @srli_2_sh3add(ptr %0, i64 %1) { 1463cd3c1658SCraig Topper; RV64I-LABEL: srli_2_sh3add: 1464cd3c1658SCraig Topper; RV64I: # %bb.0: 1465cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 1 1466cd3c1658SCraig Topper; RV64I-NEXT: andi a1, a1, -8 1467cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1468cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1469cd3c1658SCraig Topper; RV64I-NEXT: ret 1470cd3c1658SCraig Topper; 1471cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_2_sh3add: 1472cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1473cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 2 1474cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1475cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1476cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1477cd3c1658SCraig Topper %3 = lshr i64 %1, 2 1478cd3c1658SCraig Topper %4 = getelementptr inbounds i64, ptr %0, i64 %3 1479cd3c1658SCraig Topper %5 = load i64, ptr %4, align 8 1480cd3c1658SCraig Topper ret i64 %5 1481cd3c1658SCraig Topper} 1482cd3c1658SCraig Topper 1483cd3c1658SCraig Topperdefine signext i16 @srli_2_sh1add(ptr %0, i64 %1) { 1484cd3c1658SCraig Topper; RV64I-LABEL: srli_2_sh1add: 1485cd3c1658SCraig Topper; RV64I: # %bb.0: 1486cd3c1658SCraig Topper; RV64I-NEXT: srli a1, a1, 1 1487cd3c1658SCraig Topper; RV64I-NEXT: andi a1, a1, -2 1488cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1489cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1490cd3c1658SCraig Topper; RV64I-NEXT: ret 1491cd3c1658SCraig Topper; 1492cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_2_sh1add: 1493cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1494cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 2 1495cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 1496cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1497cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1498cd3c1658SCraig Topper %3 = lshr i64 %1, 2 1499cd3c1658SCraig Topper %4 = getelementptr inbounds i16, ptr %0, i64 %3 1500cd3c1658SCraig Topper %5 = load i16, ptr %4, align 2 1501cd3c1658SCraig Topper ret i16 %5 1502cd3c1658SCraig Topper} 1503cd3c1658SCraig Topper 1504cd3c1658SCraig Topperdefine signext i32 @srli_3_sh2add(ptr %0, i64 %1) { 1505cd3c1658SCraig Topper; RV64I-LABEL: srli_3_sh2add: 1506cd3c1658SCraig Topper; RV64I: # %bb.0: 1507cd3c1658SCraig Topper; RV64I-NEXT: srli a1, a1, 1 1508cd3c1658SCraig Topper; RV64I-NEXT: andi a1, a1, -4 1509cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1510cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1511cd3c1658SCraig Topper; RV64I-NEXT: ret 1512cd3c1658SCraig Topper; 1513cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_3_sh2add: 1514cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1515cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 3 1516cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1517cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1518cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1519cd3c1658SCraig Topper %3 = lshr i64 %1, 3 1520cd3c1658SCraig Topper %4 = getelementptr inbounds i32, ptr %0, i64 %3 1521cd3c1658SCraig Topper %5 = load i32, ptr %4, align 4 1522cd3c1658SCraig Topper ret i32 %5 1523cd3c1658SCraig Topper} 1524cd3c1658SCraig Topper 1525cd3c1658SCraig Topperdefine i64 @srli_4_sh3add(ptr %0, i64 %1) { 1526cd3c1658SCraig Topper; RV64I-LABEL: srli_4_sh3add: 1527cd3c1658SCraig Topper; RV64I: # %bb.0: 1528cd3c1658SCraig Topper; RV64I-NEXT: srli a1, a1, 1 1529cd3c1658SCraig Topper; RV64I-NEXT: andi a1, a1, -8 1530cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1531cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1532cd3c1658SCraig Topper; RV64I-NEXT: ret 1533cd3c1658SCraig Topper; 1534cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_4_sh3add: 1535cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1536cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 4 1537cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1538cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1539cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1540cd3c1658SCraig Topper %3 = lshr i64 %1, 4 1541cd3c1658SCraig Topper %4 = getelementptr inbounds i64, ptr %0, i64 %3 1542cd3c1658SCraig Topper %5 = load i64, ptr %4, align 8 1543cd3c1658SCraig Topper ret i64 %5 1544cd3c1658SCraig Topper} 1545cd3c1658SCraig Topper 1546cd3c1658SCraig Topperdefine i8 @array_index_sh1_sh0(ptr %p, i64 %idx1, i64 %idx2) { 1547cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh0: 1548cd3c1658SCraig Topper; RV64I: # %bb.0: 1549cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 1 1550cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1551cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1552cd3c1658SCraig Topper; RV64I-NEXT: lbu a0, 0(a0) 1553cd3c1658SCraig Topper; RV64I-NEXT: ret 1554cd3c1658SCraig Topper; 1555cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh0: 1556cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1557cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 1 1558cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a2 1559cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lbu a0, 0(a0) 1560cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1561cd3c1658SCraig Topper %a = getelementptr inbounds [2 x i8], ptr %p, i64 %idx1, i64 %idx2 1562cd3c1658SCraig Topper %b = load i8, ptr %a, align 1 1563cd3c1658SCraig Topper ret i8 %b 1564cd3c1658SCraig Topper} 1565cd3c1658SCraig Topper 1566cd3c1658SCraig Topperdefine i16 @array_index_sh1_sh1(ptr %p, i64 %idx1, i64 %idx2) { 1567cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh1: 1568cd3c1658SCraig Topper; RV64I: # %bb.0: 1569cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 2 1570cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1571cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 1 1572cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1573cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1574cd3c1658SCraig Topper; RV64I-NEXT: ret 1575cd3c1658SCraig Topper; 1576cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh1: 1577cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1578cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1579cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 1 1580cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1581cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1582cd3c1658SCraig Topper %a = getelementptr inbounds [2 x i16], ptr %p, i64 %idx1, i64 %idx2 1583cd3c1658SCraig Topper %b = load i16, ptr %a, align 2 1584cd3c1658SCraig Topper ret i16 %b 1585cd3c1658SCraig Topper} 1586cd3c1658SCraig Topper 1587cd3c1658SCraig Topperdefine i32 @array_index_sh1_sh2(ptr %p, i64 %idx1, i64 %idx2) { 1588cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh2: 1589cd3c1658SCraig Topper; RV64I: # %bb.0: 1590cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1591cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1592cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 2 1593cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1594cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1595cd3c1658SCraig Topper; RV64I-NEXT: ret 1596cd3c1658SCraig Topper; 1597cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh2: 1598cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1599cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1600cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 2 1601cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1602cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1603cd3c1658SCraig Topper %a = getelementptr inbounds [2 x i32], ptr %p, i64 %idx1, i64 %idx2 1604cd3c1658SCraig Topper %b = load i32, ptr %a, align 4 1605cd3c1658SCraig Topper ret i32 %b 1606cd3c1658SCraig Topper} 1607cd3c1658SCraig Topper 1608cd3c1658SCraig Topperdefine i64 @array_index_sh1_sh3(ptr %p, i64 %idx1, i64 %idx2) { 1609cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh3: 1610cd3c1658SCraig Topper; RV64I: # %bb.0: 1611cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 4 1612cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1613cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1614cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1615cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1616cd3c1658SCraig Topper; RV64I-NEXT: ret 1617cd3c1658SCraig Topper; 1618cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh3: 1619cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1620cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 4 1621cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1622cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1623cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1624cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1625cd3c1658SCraig Topper %a = getelementptr inbounds [2 x i64], ptr %p, i64 %idx1, i64 %idx2 1626cd3c1658SCraig Topper %b = load i64, ptr %a, align 8 1627cd3c1658SCraig Topper ret i64 %b 1628cd3c1658SCraig Topper} 1629cd3c1658SCraig Topper 1630cd3c1658SCraig Topperdefine i8 @array_index_sh2_sh0(ptr %p, i64 %idx1, i64 %idx2) { 1631cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh0: 1632cd3c1658SCraig Topper; RV64I: # %bb.0: 1633cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 2 1634cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1635cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1636cd3c1658SCraig Topper; RV64I-NEXT: lbu a0, 0(a0) 1637cd3c1658SCraig Topper; RV64I-NEXT: ret 1638cd3c1658SCraig Topper; 1639cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh0: 1640cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1641cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2 1642cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a2 1643cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lbu a0, 0(a0) 1644cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1645cd3c1658SCraig Topper %a = getelementptr inbounds [4 x i8], ptr %p, i64 %idx1, i64 %idx2 1646cd3c1658SCraig Topper %b = load i8, ptr %a, align 1 1647cd3c1658SCraig Topper ret i8 %b 1648cd3c1658SCraig Topper} 1649cd3c1658SCraig Topper 1650cd3c1658SCraig Topperdefine i16 @array_index_sh2_sh1(ptr %p, i64 %idx1, i64 %idx2) { 1651cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh1: 1652cd3c1658SCraig Topper; RV64I: # %bb.0: 1653cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1654cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1655cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 1 1656cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1657cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1658cd3c1658SCraig Topper; RV64I-NEXT: ret 1659cd3c1658SCraig Topper; 1660cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh1: 1661cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1662cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1663cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 1 1664cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1665cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1666cd3c1658SCraig Topper %a = getelementptr inbounds [4 x i16], ptr %p, i64 %idx1, i64 %idx2 1667cd3c1658SCraig Topper %b = load i16, ptr %a, align 2 1668cd3c1658SCraig Topper ret i16 %b 1669cd3c1658SCraig Topper} 1670cd3c1658SCraig Topper 1671cd3c1658SCraig Topperdefine i32 @array_index_sh2_sh2(ptr %p, i64 %idx1, i64 %idx2) { 1672cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh2: 1673cd3c1658SCraig Topper; RV64I: # %bb.0: 1674cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 4 1675cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1676cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 2 1677cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1678cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1679cd3c1658SCraig Topper; RV64I-NEXT: ret 1680cd3c1658SCraig Topper; 1681cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh2: 1682cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1683cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 4 1684cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1685cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 2 1686cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1687cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1688cd3c1658SCraig Topper %a = getelementptr inbounds [4 x i32], ptr %p, i64 %idx1, i64 %idx2 1689cd3c1658SCraig Topper %b = load i32, ptr %a, align 4 1690cd3c1658SCraig Topper ret i32 %b 1691cd3c1658SCraig Topper} 1692cd3c1658SCraig Topper 1693cd3c1658SCraig Topperdefine i64 @array_index_sh2_sh3(ptr %p, i64 %idx1, i64 %idx2) { 1694cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh3: 1695cd3c1658SCraig Topper; RV64I: # %bb.0: 1696cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 5 1697cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1698cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1699cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1700cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1701cd3c1658SCraig Topper; RV64I-NEXT: ret 1702cd3c1658SCraig Topper; 1703cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh3: 1704cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1705cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 5 1706cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1707cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1708cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1709cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1710cd3c1658SCraig Topper %a = getelementptr inbounds [4 x i64], ptr %p, i64 %idx1, i64 %idx2 1711cd3c1658SCraig Topper %b = load i64, ptr %a, align 8 1712cd3c1658SCraig Topper ret i64 %b 1713cd3c1658SCraig Topper} 1714cd3c1658SCraig Topper 1715cd3c1658SCraig Topperdefine i8 @array_index_sh3_sh0(ptr %p, i64 %idx1, i64 %idx2) { 1716cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh0: 1717cd3c1658SCraig Topper; RV64I: # %bb.0: 1718cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 1719cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1720cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1721cd3c1658SCraig Topper; RV64I-NEXT: lbu a0, 0(a0) 1722cd3c1658SCraig Topper; RV64I-NEXT: ret 1723cd3c1658SCraig Topper; 1724cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh0: 1725cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1726cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 1727cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a2 1728cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lbu a0, 0(a0) 1729cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1730cd3c1658SCraig Topper %a = getelementptr inbounds [8 x i8], ptr %p, i64 %idx1, i64 %idx2 1731cd3c1658SCraig Topper %b = load i8, ptr %a, align 1 1732cd3c1658SCraig Topper ret i8 %b 1733cd3c1658SCraig Topper} 1734cd3c1658SCraig Topper 1735cd3c1658SCraig Topperdefine i16 @array_index_sh3_sh1(ptr %p, i64 %idx1, i64 %idx2) { 1736cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh1: 1737cd3c1658SCraig Topper; RV64I: # %bb.0: 1738cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 4 1739cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1740cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 1 1741cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1742cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1743cd3c1658SCraig Topper; RV64I-NEXT: ret 1744cd3c1658SCraig Topper; 1745cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh1: 1746cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1747cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 4 1748cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1749cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 1 1750cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1751cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1752cd3c1658SCraig Topper %a = getelementptr inbounds [8 x i16], ptr %p, i64 %idx1, i64 %idx2 1753cd3c1658SCraig Topper %b = load i16, ptr %a, align 2 1754cd3c1658SCraig Topper ret i16 %b 1755cd3c1658SCraig Topper} 1756cd3c1658SCraig Topper 1757cd3c1658SCraig Topperdefine i32 @array_index_sh3_sh2(ptr %p, i64 %idx1, i64 %idx2) { 1758cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh2: 1759cd3c1658SCraig Topper; RV64I: # %bb.0: 1760cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 5 1761cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1762cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 2 1763cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1764cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1765cd3c1658SCraig Topper; RV64I-NEXT: ret 1766cd3c1658SCraig Topper; 1767cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh2: 1768cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1769cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 5 1770cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1771cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 2 1772cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1773cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1774cd3c1658SCraig Topper %a = getelementptr inbounds [8 x i32], ptr %p, i64 %idx1, i64 %idx2 1775cd3c1658SCraig Topper %b = load i32, ptr %a, align 4 1776cd3c1658SCraig Topper ret i32 %b 1777cd3c1658SCraig Topper} 1778cd3c1658SCraig Topper 1779cd3c1658SCraig Topperdefine i64 @array_index_sh3_sh3(ptr %p, i64 %idx1, i64 %idx2) { 1780cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh3: 1781cd3c1658SCraig Topper; RV64I: # %bb.0: 1782cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1783cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1784cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1785cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1786cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1787cd3c1658SCraig Topper; RV64I-NEXT: ret 1788cd3c1658SCraig Topper; 1789cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh3: 1790cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1791cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1792cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1793cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1794cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1795cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1796cd3c1658SCraig Topper %a = getelementptr inbounds [8 x i64], ptr %p, i64 %idx1, i64 %idx2 1797cd3c1658SCraig Topper %b = load i64, ptr %a, align 8 1798cd3c1658SCraig Topper ret i64 %b 1799cd3c1658SCraig Topper} 1800cd3c1658SCraig Topper 1801cd3c1658SCraig Topper; Similar to above, but with a lshr on one of the indices. This requires 1802cd3c1658SCraig Topper; special handling during isel to form a shift pair. 1803cd3c1658SCraig Topperdefine i64 @array_index_lshr_sh3_sh3(ptr %p, i64 %idx1, i64 %idx2) { 1804cd3c1658SCraig Topper; RV64I-LABEL: array_index_lshr_sh3_sh3: 1805cd3c1658SCraig Topper; RV64I: # %bb.0: 1806cd3c1658SCraig Topper; RV64I-NEXT: srli a1, a1, 58 1807cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1808cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1809cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1810cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1811cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1812cd3c1658SCraig Topper; RV64I-NEXT: ret 1813cd3c1658SCraig Topper; 1814cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_lshr_sh3_sh3: 1815cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1816cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 58 1817cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1818cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1819cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1820cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1821cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1822cd3c1658SCraig Topper %shr = lshr i64 %idx1, 58 1823cd3c1658SCraig Topper %a = getelementptr inbounds [8 x i64], ptr %p, i64 %shr, i64 %idx2 1824cd3c1658SCraig Topper %b = load i64, ptr %a, align 8 1825cd3c1658SCraig Topper ret i64 %b 1826cd3c1658SCraig Topper} 1827cd3c1658SCraig Topper 1828cd3c1658SCraig Topperdefine i8 @array_index_sh4_sh0(ptr %p, i64 %idx1, i64 %idx2) { 1829cd3c1658SCraig Topper; CHECK-LABEL: array_index_sh4_sh0: 1830cd3c1658SCraig Topper; CHECK: # %bb.0: 1831cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 4 1832cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a2 1833cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 1834cd3c1658SCraig Topper; CHECK-NEXT: lbu a0, 0(a0) 1835cd3c1658SCraig Topper; CHECK-NEXT: ret 1836cd3c1658SCraig Topper %a = getelementptr inbounds [16 x i8], ptr %p, i64 %idx1, i64 %idx2 1837cd3c1658SCraig Topper %b = load i8, ptr %a, align 1 1838cd3c1658SCraig Topper ret i8 %b 1839cd3c1658SCraig Topper} 1840cd3c1658SCraig Topper 1841cd3c1658SCraig Topperdefine i16 @array_index_sh4_sh1(ptr %p, i64 %idx1, i64 %idx2) { 1842cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh1: 1843cd3c1658SCraig Topper; RV64I: # %bb.0: 1844cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 5 1845cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1846cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 1 1847cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1848cd3c1658SCraig Topper; RV64I-NEXT: lh a0, 0(a0) 1849cd3c1658SCraig Topper; RV64I-NEXT: ret 1850cd3c1658SCraig Topper; 1851cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh1: 1852cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1853cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 5 1854cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1855cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 1 1856cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lh a0, 0(a0) 1857cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1858cd3c1658SCraig Topper %a = getelementptr inbounds [16 x i16], ptr %p, i64 %idx1, i64 %idx2 1859cd3c1658SCraig Topper %b = load i16, ptr %a, align 2 1860cd3c1658SCraig Topper ret i16 %b 1861cd3c1658SCraig Topper} 1862cd3c1658SCraig Topper 1863cd3c1658SCraig Topperdefine i32 @array_index_sh4_sh2(ptr %p, i64 %idx1, i64 %idx2) { 1864cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh2: 1865cd3c1658SCraig Topper; RV64I: # %bb.0: 1866cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 6 1867cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1868cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 2 1869cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1870cd3c1658SCraig Topper; RV64I-NEXT: lw a0, 0(a0) 1871cd3c1658SCraig Topper; RV64I-NEXT: ret 1872cd3c1658SCraig Topper; 1873cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh2: 1874cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1875cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 6 1876cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1877cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 2 1878cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: lw a0, 0(a0) 1879cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1880cd3c1658SCraig Topper %a = getelementptr inbounds [16 x i32], ptr %p, i64 %idx1, i64 %idx2 1881cd3c1658SCraig Topper %b = load i32, ptr %a, align 4 1882cd3c1658SCraig Topper ret i32 %b 1883cd3c1658SCraig Topper} 1884cd3c1658SCraig Topper 1885cd3c1658SCraig Topperdefine i64 @array_index_sh4_sh3(ptr %p, i64 %idx1, i64 %idx2) { 1886cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh3: 1887cd3c1658SCraig Topper; RV64I: # %bb.0: 1888cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 7 1889cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 1890cd3c1658SCraig Topper; RV64I-NEXT: slli a2, a2, 3 1891cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a2 1892cd3c1658SCraig Topper; RV64I-NEXT: ld a0, 0(a0) 1893cd3c1658SCraig Topper; RV64I-NEXT: ret 1894cd3c1658SCraig Topper; 1895cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh3: 1896cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: 1897cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: slli a1, a1, 7 1898cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: add a0, a0, a1 1899cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a2, 3 1900cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ld a0, 0(a0) 1901cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: ret 1902cd3c1658SCraig Topper %a = getelementptr inbounds [16 x i64], ptr %p, i64 %idx1, i64 %idx2 1903cd3c1658SCraig Topper %b = load i64, ptr %a, align 8 1904cd3c1658SCraig Topper ret i64 %b 1905cd3c1658SCraig Topper} 1906cd3c1658SCraig Topper 1907cd3c1658SCraig Topperdefine i64 @mul_neg1(i64 %a) { 1908cd3c1658SCraig Topper; CHECK-LABEL: mul_neg1: 1909cd3c1658SCraig Topper; CHECK: # %bb.0: 1910cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 1911cd3c1658SCraig Topper; CHECK-NEXT: ret 1912cd3c1658SCraig Topper %c = mul i64 %a, -1 1913cd3c1658SCraig Topper ret i64 %c 1914cd3c1658SCraig Topper} 1915cd3c1658SCraig Topper 1916cd3c1658SCraig Topperdefine i64 @mul_neg2(i64 %a) { 1917cd3c1658SCraig Topper; CHECK-LABEL: mul_neg2: 1918cd3c1658SCraig Topper; CHECK: # %bb.0: 1919cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 1 1920cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 1921cd3c1658SCraig Topper; CHECK-NEXT: ret 1922cd3c1658SCraig Topper %c = mul i64 %a, -2 1923cd3c1658SCraig Topper ret i64 %c 1924cd3c1658SCraig Topper} 1925cd3c1658SCraig Topper 1926cd3c1658SCraig Topperdefine i64 @mul_neg3(i64 %a) { 1927cd3c1658SCraig Topper; RV64I-LABEL: mul_neg3: 1928cd3c1658SCraig Topper; RV64I: # %bb.0: 1929cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 1 1930cd3c1658SCraig Topper; RV64I-NEXT: neg a0, a0 19313e55ac94SPhilip Reames; RV64I-NEXT: sub a0, a0, a1 1932e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 1933e25b30d9SPhilipp Tomsich; 1934cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul_neg3: 1935e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 1936e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1 1937cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: neg a0, a0 1938e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 1939cd3c1658SCraig Topper %c = mul i64 %a, -3 1940e25b30d9SPhilipp Tomsich ret i64 %c 1941e25b30d9SPhilipp Tomsich} 1942e25b30d9SPhilipp Tomsich 1943cd3c1658SCraig Topperdefine i64 @mul_neg4(i64 %a) { 1944cd3c1658SCraig Topper; CHECK-LABEL: mul_neg4: 1945cd3c1658SCraig Topper; CHECK: # %bb.0: 1946cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 2 1947cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 1948cd3c1658SCraig Topper; CHECK-NEXT: ret 1949cd3c1658SCraig Topper %c = mul i64 %a, -4 1950885b8d9bSPhilip Reames ret i64 %c 1951885b8d9bSPhilip Reames} 1952885b8d9bSPhilip Reames 1953cd3c1658SCraig Topperdefine i64 @mul_neg5(i64 %a) { 1954cd3c1658SCraig Topper; RV64I-LABEL: mul_neg5: 1955e25b30d9SPhilipp Tomsich; RV64I: # %bb.0: 1956cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a0, 2 1957cd3c1658SCraig Topper; RV64I-NEXT: neg a0, a0 1958cd3c1658SCraig Topper; RV64I-NEXT: sub a0, a0, a1 1959e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 1960e25b30d9SPhilipp Tomsich; 1961cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul_neg5: 1962e25b30d9SPhilipp Tomsich; RV64XTHEADBA: # %bb.0: 1963e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2 1964cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: neg a0, a0 1965e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 1966cd3c1658SCraig Topper %c = mul i64 %a, -5 1967e25b30d9SPhilipp Tomsich ret i64 %c 1968e25b30d9SPhilipp Tomsich} 1969e25b30d9SPhilipp Tomsich 1970cd3c1658SCraig Topperdefine i64 @mul_neg6(i64 %a) { 1971cd3c1658SCraig Topper; CHECK-LABEL: mul_neg6: 1972cd3c1658SCraig Topper; CHECK: # %bb.0: 1973cd3c1658SCraig Topper; CHECK-NEXT: li a1, -6 1974cd3c1658SCraig Topper; CHECK-NEXT: mul a0, a0, a1 1975cd3c1658SCraig Topper; CHECK-NEXT: ret 1976cd3c1658SCraig Topper %c = mul i64 %a, -6 1977e25b30d9SPhilipp Tomsich ret i64 %c 1978e25b30d9SPhilipp Tomsich} 1979e25b30d9SPhilipp Tomsich 1980cd3c1658SCraig Topperdefine i64 @mul_neg7(i64 %a) { 1981cd3c1658SCraig Topper; CHECK-LABEL: mul_neg7: 1982cd3c1658SCraig Topper; CHECK: # %bb.0: 1983cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a0, 3 1984cd3c1658SCraig Topper; CHECK-NEXT: sub a0, a0, a1 1985cd3c1658SCraig Topper; CHECK-NEXT: ret 1986cd3c1658SCraig Topper %c = mul i64 %a, -7 1987cd3c1658SCraig Topper ret i64 %c 1988cd3c1658SCraig Topper} 1989cd3c1658SCraig Topper 1990cd3c1658SCraig Topperdefine i64 @mul_neg8(i64 %a) { 1991cd3c1658SCraig Topper; CHECK-LABEL: mul_neg8: 1992cd3c1658SCraig Topper; CHECK: # %bb.0: 1993cd3c1658SCraig Topper; CHECK-NEXT: slli a0, a0, 3 1994cd3c1658SCraig Topper; CHECK-NEXT: neg a0, a0 1995cd3c1658SCraig Topper; CHECK-NEXT: ret 1996cd3c1658SCraig Topper %c = mul i64 %a, -8 1997cd3c1658SCraig Topper ret i64 %c 1998cd3c1658SCraig Topper} 1999cd3c1658SCraig Topper 2000cd3c1658SCraig Topperdefine ptr @srai_srli_sh3add(ptr %0, i64 %1) nounwind { 2001cd3c1658SCraig Topper; RV64I-LABEL: srai_srli_sh3add: 2002cd3c1658SCraig Topper; RV64I: # %bb.0: # %entry 2003cd3c1658SCraig Topper; RV64I-NEXT: srai a1, a1, 32 2004cd3c1658SCraig Topper; RV64I-NEXT: srli a1, a1, 6 2005cd3c1658SCraig Topper; RV64I-NEXT: slli a1, a1, 3 2006cd3c1658SCraig Topper; RV64I-NEXT: add a0, a0, a1 2007e25b30d9SPhilipp Tomsich; RV64I-NEXT: ret 2008e25b30d9SPhilipp Tomsich; 2009cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srai_srli_sh3add: 2010cd3c1658SCraig Topper; RV64XTHEADBA: # %bb.0: # %entry 2011cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srai a1, a1, 32 2012cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: srli a1, a1, 6 2013cd3c1658SCraig Topper; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 3 2014e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT: ret 2015cd3c1658SCraig Topperentry: 2016cd3c1658SCraig Topper %2 = ashr i64 %1, 32 2017cd3c1658SCraig Topper %3 = lshr i64 %2, 6 2018cd3c1658SCraig Topper %4 = getelementptr i64, ptr %0, i64 %3 2019cd3c1658SCraig Topper ret ptr %4 2020cd3c1658SCraig Topper} 2021cd3c1658SCraig Topper 2022cd3c1658SCraig Topperdefine ptr @srai_srli_slli(ptr %0, i64 %1) nounwind { 2023cd3c1658SCraig Topper; CHECK-LABEL: srai_srli_slli: 2024cd3c1658SCraig Topper; CHECK: # %bb.0: # %entry 2025cd3c1658SCraig Topper; CHECK-NEXT: srai a1, a1, 32 2026cd3c1658SCraig Topper; CHECK-NEXT: srli a1, a1, 6 2027cd3c1658SCraig Topper; CHECK-NEXT: slli a1, a1, 4 2028cd3c1658SCraig Topper; CHECK-NEXT: add a0, a0, a1 2029cd3c1658SCraig Topper; CHECK-NEXT: ret 2030cd3c1658SCraig Topperentry: 2031cd3c1658SCraig Topper %2 = ashr i64 %1, 32 2032cd3c1658SCraig Topper %3 = lshr i64 %2, 6 2033cd3c1658SCraig Topper %4 = getelementptr i128, ptr %0, i64 %3 2034cd3c1658SCraig Topper ret ptr %4 2035cd3c1658SCraig Topper} 2036cd3c1658SCraig Topper 2037cd3c1658SCraig Topper; Negative to make sure the peephole added for srai_srli_slli and 2038cd3c1658SCraig Topper; srai_srli_sh3add doesn't break this. 2039cd3c1658SCraig Topperdefine i64 @srai_andi(i64 %x) nounwind { 2040cd3c1658SCraig Topper; CHECK-LABEL: srai_andi: 2041cd3c1658SCraig Topper; CHECK: # %bb.0: # %entry 2042cd3c1658SCraig Topper; CHECK-NEXT: srai a0, a0, 8 2043cd3c1658SCraig Topper; CHECK-NEXT: andi a0, a0, -8 2044cd3c1658SCraig Topper; CHECK-NEXT: ret 2045cd3c1658SCraig Topperentry: 2046cd3c1658SCraig Topper %y = ashr i64 %x, 8 2047cd3c1658SCraig Topper %z = and i64 %y, -8 2048cd3c1658SCraig Topper ret i64 %z 2049cd3c1658SCraig Topper} 2050cd3c1658SCraig Topper 2051cd3c1658SCraig Topper; Negative to make sure the peephole added for srai_srli_slli and 2052cd3c1658SCraig Topper; srai_srli_sh3add doesn't break this. 2053cd3c1658SCraig Topperdefine i64 @srai_lui_and(i64 %x) nounwind { 2054cd3c1658SCraig Topper; CHECK-LABEL: srai_lui_and: 2055cd3c1658SCraig Topper; CHECK: # %bb.0: # %entry 2056cd3c1658SCraig Topper; CHECK-NEXT: srai a0, a0, 8 2057cd3c1658SCraig Topper; CHECK-NEXT: lui a1, 1048574 2058cd3c1658SCraig Topper; CHECK-NEXT: and a0, a0, a1 2059cd3c1658SCraig Topper; CHECK-NEXT: ret 2060cd3c1658SCraig Topperentry: 2061cd3c1658SCraig Topper %y = ashr i64 %x, 8 2062cd3c1658SCraig Topper %z = and i64 %y, -8192 2063cd3c1658SCraig Topper ret i64 %z 2064e25b30d9SPhilipp Tomsich} 2065