1450f0bd1SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2450f0bd1SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3450f0bd1SCraig Topper; RUN: | FileCheck %s -check-prefix=RV32I 4450f0bd1SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 5450f0bd1SCraig Topper; RUN: | FileCheck %s -check-prefix=RV64I 6450f0bd1SCraig Topper 71456b686SNikita Popovdefine void @sext_shl_trunc_same_size(i16 %x, i32 %y, ptr %res) { 8450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_same_size: 9450f0bd1SCraig Topper; RV32I: # %bb.0: 10450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 11450f0bd1SCraig Topper; RV32I-NEXT: sh a0, 0(a2) 12450f0bd1SCraig Topper; RV32I-NEXT: ret 13450f0bd1SCraig Topper; 14450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_same_size: 15450f0bd1SCraig Topper; RV64I: # %bb.0: 16450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 17450f0bd1SCraig Topper; RV64I-NEXT: sh a0, 0(a2) 18450f0bd1SCraig Topper; RV64I-NEXT: ret 19450f0bd1SCraig Topper %conv = sext i16 %x to i32 20450f0bd1SCraig Topper %shl = shl i32 %conv, %y 21450f0bd1SCraig Topper %t = trunc i32 %shl to i16 221456b686SNikita Popov store i16 %t, ptr %res 23450f0bd1SCraig Topper ret void 24450f0bd1SCraig Topper} 25450f0bd1SCraig Topper 261456b686SNikita Popovdefine void @zext_shl_trunc_same_size(i16 %x, i32 %y, ptr %res) { 27450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_same_size: 28450f0bd1SCraig Topper; RV32I: # %bb.0: 29450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 30450f0bd1SCraig Topper; RV32I-NEXT: sh a0, 0(a2) 31450f0bd1SCraig Topper; RV32I-NEXT: ret 32450f0bd1SCraig Topper; 33450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_same_size: 34450f0bd1SCraig Topper; RV64I: # %bb.0: 35450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 36450f0bd1SCraig Topper; RV64I-NEXT: sh a0, 0(a2) 37450f0bd1SCraig Topper; RV64I-NEXT: ret 38450f0bd1SCraig Topper %conv = zext i16 %x to i32 39450f0bd1SCraig Topper %shl = shl i32 %conv, %y 40450f0bd1SCraig Topper %t = trunc i32 %shl to i16 411456b686SNikita Popov store i16 %t, ptr %res 42450f0bd1SCraig Topper ret void 43450f0bd1SCraig Topper} 44450f0bd1SCraig Topper 451456b686SNikita Popovdefine void @sext_shl_trunc_smaller(i16 %x, i32 %y, ptr %res) { 46450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_smaller: 47450f0bd1SCraig Topper; RV32I: # %bb.0: 48450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 49450f0bd1SCraig Topper; RV32I-NEXT: sb a0, 0(a2) 50450f0bd1SCraig Topper; RV32I-NEXT: ret 51450f0bd1SCraig Topper; 52450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_smaller: 53450f0bd1SCraig Topper; RV64I: # %bb.0: 54450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 55450f0bd1SCraig Topper; RV64I-NEXT: sb a0, 0(a2) 56450f0bd1SCraig Topper; RV64I-NEXT: ret 57450f0bd1SCraig Topper %conv = sext i16 %x to i32 58450f0bd1SCraig Topper %shl = shl i32 %conv, %y 59450f0bd1SCraig Topper %t = trunc i32 %shl to i8 601456b686SNikita Popov store i8 %t, ptr %res 61450f0bd1SCraig Topper ret void 62450f0bd1SCraig Topper} 63450f0bd1SCraig Topper 641456b686SNikita Popovdefine void @zext_shl_trunc_smaller(i16 %x, i32 %y, ptr %res) { 65450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_smaller: 66450f0bd1SCraig Topper; RV32I: # %bb.0: 67450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 68450f0bd1SCraig Topper; RV32I-NEXT: sb a0, 0(a2) 69450f0bd1SCraig Topper; RV32I-NEXT: ret 70450f0bd1SCraig Topper; 71450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_smaller: 72450f0bd1SCraig Topper; RV64I: # %bb.0: 73450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 74450f0bd1SCraig Topper; RV64I-NEXT: sb a0, 0(a2) 75450f0bd1SCraig Topper; RV64I-NEXT: ret 76450f0bd1SCraig Topper %conv = zext i16 %x to i32 77450f0bd1SCraig Topper %shl = shl i32 %conv, %y 78450f0bd1SCraig Topper %t = trunc i32 %shl to i8 791456b686SNikita Popov store i8 %t, ptr %res 80450f0bd1SCraig Topper ret void 81450f0bd1SCraig Topper} 82450f0bd1SCraig Topper 83450f0bd1SCraig Topper; negative test - demanding 1 high-bit too many to change the extend 84450f0bd1SCraig Topper 85450f0bd1SCraig Topperdefine signext i17 @sext_shl_trunc_larger(i16 %x, i32 %y) { 86450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_larger: 87450f0bd1SCraig Topper; RV32I: # %bb.0: 88450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 16 89450f0bd1SCraig Topper; RV32I-NEXT: srai a0, a0, 16 90450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 91450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 15 92450f0bd1SCraig Topper; RV32I-NEXT: srai a0, a0, 15 93450f0bd1SCraig Topper; RV32I-NEXT: ret 94450f0bd1SCraig Topper; 95450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_larger: 96450f0bd1SCraig Topper; RV64I: # %bb.0: 97450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 48 98450f0bd1SCraig Topper; RV64I-NEXT: srai a0, a0, 48 99450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 100450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 47 101450f0bd1SCraig Topper; RV64I-NEXT: srai a0, a0, 47 102450f0bd1SCraig Topper; RV64I-NEXT: ret 103450f0bd1SCraig Topper %conv = sext i16 %x to i32 104450f0bd1SCraig Topper %shl = shl i32 %conv, %y 105450f0bd1SCraig Topper %t = trunc i32 %shl to i17 106450f0bd1SCraig Topper ret i17 %t 107450f0bd1SCraig Topper} 108450f0bd1SCraig Topper 109450f0bd1SCraig Topper; negative test - demanding 1 high-bit too many to change the extend 110450f0bd1SCraig Topper 111450f0bd1SCraig Topperdefine zeroext i17 @zext_shl_trunc_larger(i16 %x, i32 %y) { 112450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_larger: 113450f0bd1SCraig Topper; RV32I: # %bb.0: 114450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 16 115450f0bd1SCraig Topper; RV32I-NEXT: srli a0, a0, 16 116450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 117450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 15 118450f0bd1SCraig Topper; RV32I-NEXT: srli a0, a0, 15 119450f0bd1SCraig Topper; RV32I-NEXT: ret 120450f0bd1SCraig Topper; 121450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_larger: 122450f0bd1SCraig Topper; RV64I: # %bb.0: 123450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 48 124450f0bd1SCraig Topper; RV64I-NEXT: srli a0, a0, 48 125450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 126450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 47 127450f0bd1SCraig Topper; RV64I-NEXT: srli a0, a0, 47 128450f0bd1SCraig Topper; RV64I-NEXT: ret 129450f0bd1SCraig Topper %conv = zext i16 %x to i32 130450f0bd1SCraig Topper %shl = shl i32 %conv, %y 131450f0bd1SCraig Topper %t = trunc i32 %shl to i17 132450f0bd1SCraig Topper ret i17 %t 133450f0bd1SCraig Topper} 134450f0bd1SCraig Topper 135450f0bd1SCraig Topperdefine i32 @sext_shl_mask(i16 %x, i32 %y) { 136450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_mask: 137450f0bd1SCraig Topper; RV32I: # %bb.0: 138450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 139450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 16 140450f0bd1SCraig Topper; RV32I-NEXT: srli a0, a0, 16 141450f0bd1SCraig Topper; RV32I-NEXT: ret 142450f0bd1SCraig Topper; 143450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_mask: 144450f0bd1SCraig Topper; RV64I: # %bb.0: 145450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 146450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 48 147450f0bd1SCraig Topper; RV64I-NEXT: srli a0, a0, 48 148450f0bd1SCraig Topper; RV64I-NEXT: ret 149450f0bd1SCraig Topper %conv = sext i16 %x to i32 150450f0bd1SCraig Topper %shl = shl i32 %conv, %y 151450f0bd1SCraig Topper %t = and i32 %shl, 65535 152450f0bd1SCraig Topper ret i32 %t 153450f0bd1SCraig Topper} 154450f0bd1SCraig Topper 155450f0bd1SCraig Topperdefine i32 @zext_shl_mask(i16 %x, i32 %y) { 156450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_mask: 157450f0bd1SCraig Topper; RV32I: # %bb.0: 158450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 159dcfc1fd2SCraig Topper; RV32I-NEXT: slli a0, a0, 16 160dcfc1fd2SCraig Topper; RV32I-NEXT: srli a0, a0, 16 161450f0bd1SCraig Topper; RV32I-NEXT: ret 162450f0bd1SCraig Topper; 163450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_mask: 164450f0bd1SCraig Topper; RV64I: # %bb.0: 165450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 166dcfc1fd2SCraig Topper; RV64I-NEXT: slli a0, a0, 48 167dcfc1fd2SCraig Topper; RV64I-NEXT: srli a0, a0, 48 168450f0bd1SCraig Topper; RV64I-NEXT: ret 169450f0bd1SCraig Topper %conv = zext i16 %x to i32 170450f0bd1SCraig Topper %shl = shl i32 %conv, %y 171450f0bd1SCraig Topper %t = and i32 %shl, 65535 172450f0bd1SCraig Topper ret i32 %t 173450f0bd1SCraig Topper} 174450f0bd1SCraig Topper 175450f0bd1SCraig Topper; negative test - demanding a bit that could change with sext 176450f0bd1SCraig Topper 177450f0bd1SCraig Topperdefine i32 @sext_shl_mask_higher(i16 %x, i32 %y) { 178450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_mask_higher: 179450f0bd1SCraig Topper; RV32I: # %bb.0: 180450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 16 181450f0bd1SCraig Topper; RV32I-NEXT: srai a0, a0, 16 182450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 183450f0bd1SCraig Topper; RV32I-NEXT: lui a1, 16 184450f0bd1SCraig Topper; RV32I-NEXT: and a0, a0, a1 185450f0bd1SCraig Topper; RV32I-NEXT: ret 186450f0bd1SCraig Topper; 187450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_mask_higher: 188450f0bd1SCraig Topper; RV64I: # %bb.0: 189450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 48 190450f0bd1SCraig Topper; RV64I-NEXT: srai a0, a0, 48 191450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 192450f0bd1SCraig Topper; RV64I-NEXT: lui a1, 16 193450f0bd1SCraig Topper; RV64I-NEXT: and a0, a0, a1 194450f0bd1SCraig Topper; RV64I-NEXT: ret 195450f0bd1SCraig Topper %conv = sext i16 %x to i32 196450f0bd1SCraig Topper %shl = shl i32 %conv, %y 197450f0bd1SCraig Topper %t = and i32 %shl, 65536 198450f0bd1SCraig Topper ret i32 %t 199450f0bd1SCraig Topper} 200450f0bd1SCraig Topper 201450f0bd1SCraig Topper; negative test - demanding a bit that could change with zext 202450f0bd1SCraig Topper 203450f0bd1SCraig Topperdefine i32 @zext_shl_mask_higher(i16 %x, i32 %y) { 204450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_mask_higher: 205450f0bd1SCraig Topper; RV32I: # %bb.0: 206450f0bd1SCraig Topper; RV32I-NEXT: slli a0, a0, 16 207450f0bd1SCraig Topper; RV32I-NEXT: srli a0, a0, 16 208450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 209450f0bd1SCraig Topper; RV32I-NEXT: lui a1, 16 210450f0bd1SCraig Topper; RV32I-NEXT: and a0, a0, a1 211450f0bd1SCraig Topper; RV32I-NEXT: ret 212450f0bd1SCraig Topper; 213450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_mask_higher: 214450f0bd1SCraig Topper; RV64I: # %bb.0: 215450f0bd1SCraig Topper; RV64I-NEXT: slli a0, a0, 48 216450f0bd1SCraig Topper; RV64I-NEXT: srli a0, a0, 48 217450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 218450f0bd1SCraig Topper; RV64I-NEXT: lui a1, 16 219450f0bd1SCraig Topper; RV64I-NEXT: and a0, a0, a1 220450f0bd1SCraig Topper; RV64I-NEXT: ret 221450f0bd1SCraig Topper %conv = zext i16 %x to i32 222450f0bd1SCraig Topper %shl = shl i32 %conv, %y 223450f0bd1SCraig Topper %t = and i32 %shl, 65536 224450f0bd1SCraig Topper ret i32 %t 225450f0bd1SCraig Topper} 226450f0bd1SCraig Topper 227450f0bd1SCraig Topper; May need some, but not all of the bits set by the 'or'. 228450f0bd1SCraig Topper 229450f0bd1SCraig Topperdefine i32 @set_shl_mask(i32 %x, i32 %y) { 230450f0bd1SCraig Topper; RV32I-LABEL: set_shl_mask: 231450f0bd1SCraig Topper; RV32I: # %bb.0: 232dcfc1fd2SCraig Topper; RV32I-NEXT: lui a2, 16 233dcfc1fd2SCraig Topper; RV32I-NEXT: addi a3, a2, 1 234dcfc1fd2SCraig Topper; RV32I-NEXT: or a0, a0, a3 235450f0bd1SCraig Topper; RV32I-NEXT: sll a0, a0, a1 236dcfc1fd2SCraig Topper; RV32I-NEXT: and a0, a0, a2 237450f0bd1SCraig Topper; RV32I-NEXT: ret 238450f0bd1SCraig Topper; 239450f0bd1SCraig Topper; RV64I-LABEL: set_shl_mask: 240450f0bd1SCraig Topper; RV64I: # %bb.0: 241dcfc1fd2SCraig Topper; RV64I-NEXT: lui a2, 16 242*86240751SPhilip Reames; RV64I-NEXT: addi a3, a2, 1 243dcfc1fd2SCraig Topper; RV64I-NEXT: or a0, a0, a3 244450f0bd1SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 245dcfc1fd2SCraig Topper; RV64I-NEXT: and a0, a0, a2 246450f0bd1SCraig Topper; RV64I-NEXT: ret 247450f0bd1SCraig Topper %z = or i32 %x, 196609 248450f0bd1SCraig Topper %s = shl i32 %z, %y 249450f0bd1SCraig Topper %r = and i32 %s, 65536 250450f0bd1SCraig Topper ret i32 %r 251450f0bd1SCraig Topper} 252