1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvmem -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefixes=CHECK 4 5define <2 x i32> @lb_ri_inc(i8* %a) { 6; CHECK-LABEL: lb_ri_inc: 7; CHECK: # %bb.0: 8; CHECK-NEXT: cv.lb a1, (a0), 42 9; CHECK-NEXT: ret 10 %1 = load i8, i8* %a 11 %2 = sext i8 %1 to i32 12 %3 = getelementptr i8, i8* %a, i32 42 13 %4 = ptrtoint i8* %3 to i32 14 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 15 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 16 ret <2 x i32> %6 17} 18 19define <2 x i32> @lb_rr_inc(i8* %a, i32 %b) { 20; CHECK-LABEL: lb_rr_inc: 21; CHECK: # %bb.0: 22; CHECK-NEXT: cv.lb a1, (a0), a1 23; CHECK-NEXT: ret 24 %1 = load i8, i8* %a 25 %2 = sext i8 %1 to i32 26 %3 = getelementptr i8, i8* %a, i32 %b 27 %4 = ptrtoint i8* %3 to i32 28 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 29 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 30 ret <2 x i32> %6 31} 32 33define i32 @lb_rr(i8* %a, i32 %b) { 34; CHECK-LABEL: lb_rr: 35; CHECK: # %bb.0: 36; CHECK-NEXT: cv.lb a0, a1(a0) 37; CHECK-NEXT: ret 38 %1 = getelementptr i8, i8* %a, i32 %b 39 %2 = load i8, i8* %1 40 %3 = sext i8 %2 to i32 41 ret i32 %3 42} 43 44define <2 x i32> @lbu_ri_inc(i8* %a) { 45; CHECK-LABEL: lbu_ri_inc: 46; CHECK: # %bb.0: 47; CHECK-NEXT: cv.lbu a1, (a0), 42 48; CHECK-NEXT: ret 49 %1 = load i8, i8* %a 50 %2 = zext i8 %1 to i32 51 %3 = getelementptr i8, i8* %a, i32 42 52 %4 = ptrtoint i8* %3 to i32 53 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 54 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 55 ret <2 x i32> %6 56} 57 58define <2 x i32> @lbu_rr_inc(i8* %a, i32 %b) { 59; CHECK-LABEL: lbu_rr_inc: 60; CHECK: # %bb.0: 61; CHECK-NEXT: cv.lbu a1, (a0), a1 62; CHECK-NEXT: ret 63 %1 = load i8, i8* %a 64 %2 = zext i8 %1 to i32 65 %3 = getelementptr i8, i8* %a, i32 %b 66 %4 = ptrtoint i8* %3 to i32 67 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 68 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 69 ret <2 x i32> %6 70} 71 72define i32 @lbu_rr(i8* %a, i32 %b) { 73; CHECK-LABEL: lbu_rr: 74; CHECK: # %bb.0: 75; CHECK-NEXT: cv.lbu a0, a1(a0) 76; CHECK-NEXT: ret 77 %1 = getelementptr i8, i8* %a, i32 %b 78 %2 = load i8, i8* %1 79 %3 = zext i8 %2 to i32 80 ret i32 %3 81} 82 83define <2 x i32> @lh_ri_inc(i16* %a) { 84; CHECK-LABEL: lh_ri_inc: 85; CHECK: # %bb.0: 86; CHECK-NEXT: cv.lh a1, (a0), 84 87; CHECK-NEXT: ret 88 %1 = load i16, i16* %a 89 %2 = sext i16 %1 to i32 90 %3 = getelementptr i16, i16* %a, i32 42 91 %4 = ptrtoint i16* %3 to i32 92 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 93 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 94 ret <2 x i32> %6 95} 96 97define <2 x i32> @lh_rr_inc(i16* %a, i32 %b) { 98; CHECK-LABEL: lh_rr_inc: 99; CHECK: # %bb.0: 100; CHECK-NEXT: slli a1, a1, 1 101; CHECK-NEXT: cv.lh a1, (a0), a1 102; CHECK-NEXT: ret 103 %1 = load i16, i16* %a 104 %2 = sext i16 %1 to i32 105 %3 = getelementptr i16, i16* %a, i32 %b 106 %4 = ptrtoint i16* %3 to i32 107 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 108 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 109 ret <2 x i32> %6 110} 111 112define i32 @lh_rr(i16* %a, i32 %b) { 113; CHECK-LABEL: lh_rr: 114; CHECK: # %bb.0: 115; CHECK-NEXT: slli a1, a1, 1 116; CHECK-NEXT: cv.lh a0, a1(a0) 117; CHECK-NEXT: ret 118 %1 = getelementptr i16, i16* %a, i32 %b 119 %2 = load i16, i16* %1 120 %3 = sext i16 %2 to i32 121 ret i32 %3 122} 123 124define <2 x i32> @lhu_ri_inc(i16* %a) { 125; CHECK-LABEL: lhu_ri_inc: 126; CHECK: # %bb.0: 127; CHECK-NEXT: cv.lhu a1, (a0), 84 128; CHECK-NEXT: ret 129 %1 = load i16, i16* %a 130 %2 = zext i16 %1 to i32 131 %3 = getelementptr i16, i16* %a, i32 42 132 %4 = ptrtoint i16* %3 to i32 133 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 134 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 135 ret <2 x i32> %6 136} 137 138define <2 x i32> @lhu_rr_inc(i16* %a, i32 %b) { 139; CHECK-LABEL: lhu_rr_inc: 140; CHECK: # %bb.0: 141; CHECK-NEXT: slli a1, a1, 1 142; CHECK-NEXT: cv.lhu a1, (a0), a1 143; CHECK-NEXT: ret 144 %1 = load i16, i16* %a 145 %2 = zext i16 %1 to i32 146 %3 = getelementptr i16, i16* %a, i32 %b 147 %4 = ptrtoint i16* %3 to i32 148 %5 = insertelement <2 x i32> undef, i32 %4, i32 0 149 %6 = insertelement <2 x i32> %5, i32 %2, i32 1 150 ret <2 x i32> %6 151} 152 153define i32 @lhu_rr(i16* %a, i32 %b) { 154; CHECK-LABEL: lhu_rr: 155; CHECK: # %bb.0: 156; CHECK-NEXT: slli a1, a1, 1 157; CHECK-NEXT: cv.lhu a0, a1(a0) 158; CHECK-NEXT: ret 159 %1 = getelementptr i16, i16* %a, i32 %b 160 %2 = load i16, i16* %1 161 %3 = zext i16 %2 to i32 162 ret i32 %3 163} 164 165define <2 x i32> @lw_ri_inc(i32* %a) { 166; CHECK-LABEL: lw_ri_inc: 167; CHECK: # %bb.0: 168; CHECK-NEXT: cv.lw a1, (a0), 168 169; CHECK-NEXT: ret 170 %1 = load i32, i32* %a 171 %2 = getelementptr i32, i32* %a, i32 42 172 %3 = ptrtoint i32* %2 to i32 173 %4 = insertelement <2 x i32> undef, i32 %3, i32 0 174 %5 = insertelement <2 x i32> %4, i32 %1, i32 1 175 ret <2 x i32> %5 176} 177 178define <2 x i32> @lw_rr_inc(i32* %a, i32 %b) { 179; CHECK-LABEL: lw_rr_inc: 180; CHECK: # %bb.0: 181; CHECK-NEXT: slli a1, a1, 2 182; CHECK-NEXT: cv.lw a1, (a0), a1 183; CHECK-NEXT: ret 184 %1 = load i32, i32* %a 185 %2 = getelementptr i32, i32* %a, i32 %b 186 %3 = ptrtoint i32* %2 to i32 187 %4 = insertelement <2 x i32> undef, i32 %3, i32 0 188 %5 = insertelement <2 x i32> %4, i32 %1, i32 1 189 ret <2 x i32> %5 190} 191 192define i32 @lw_rr(i32* %a, i32 %b) { 193; CHECK-LABEL: lw_rr: 194; CHECK: # %bb.0: 195; CHECK-NEXT: slli a1, a1, 2 196; CHECK-NEXT: cv.lw a0, a1(a0) 197; CHECK-NEXT: ret 198 %1 = getelementptr i32, i32* %a, i32 %b 199 %2 = load i32, i32* %1 200 ret i32 %2 201} 202 203define i8* @sb_ri_inc(i8* %a, i8 %b) { 204; CHECK-LABEL: sb_ri_inc: 205; CHECK: # %bb.0: 206; CHECK-NEXT: cv.sb a1, (a0), 42 207; CHECK-NEXT: ret 208 store i8 %b, i8* %a 209 %1 = getelementptr i8, i8* %a, i32 42 210 ret i8* %1 211} 212 213define i8* @sb_rr_inc(i8* %a, i8 %b, i32 %c) { 214; CHECK-LABEL: sb_rr_inc: 215; CHECK: # %bb.0: 216; CHECK-NEXT: cv.sb a1, (a0), a2 217; CHECK-NEXT: ret 218 store i8 %b, i8* %a 219 %1 = getelementptr i8, i8* %a, i32 %c 220 ret i8* %1 221} 222 223define void @sb_rr(i8* %a, i8 %b, i32 %c) { 224; CHECK-LABEL: sb_rr: 225; CHECK: # %bb.0: 226; CHECK-NEXT: cv.sb a1, a2(a0) 227; CHECK-NEXT: ret 228 %1 = getelementptr i8, i8* %a, i32 %c 229 store i8 %b, i8* %1 230 ret void 231} 232 233define i16* @sh_ri_inc(i16* %a, i16 %b) { 234; CHECK-LABEL: sh_ri_inc: 235; CHECK: # %bb.0: 236; CHECK-NEXT: cv.sh a1, (a0), 84 237; CHECK-NEXT: ret 238 store i16 %b, i16* %a 239 %1 = getelementptr i16, i16* %a, i32 42 240 ret i16* %1 241} 242 243define i16* @sh_rr_inc(i16* %a, i16 %b, i32 %c) { 244; CHECK-LABEL: sh_rr_inc: 245; CHECK: # %bb.0: 246; CHECK-NEXT: slli a2, a2, 1 247; CHECK-NEXT: cv.sh a1, (a0), a2 248; CHECK-NEXT: ret 249 store i16 %b, i16* %a 250 %1 = getelementptr i16, i16* %a, i32 %c 251 ret i16* %1 252} 253 254define void @sh_rr(i16* %a, i16 %b, i32 %c) { 255; CHECK-LABEL: sh_rr: 256; CHECK: # %bb.0: 257; CHECK-NEXT: slli a2, a2, 1 258; CHECK-NEXT: cv.sh a1, a2(a0) 259; CHECK-NEXT: ret 260 %1 = getelementptr i16, i16* %a, i32 %c 261 store i16 %b, i16* %1 262 ret void 263} 264 265define i32* @sw_ri_inc(i32* %a, i32 %b) { 266; CHECK-LABEL: sw_ri_inc: 267; CHECK: # %bb.0: 268; CHECK-NEXT: cv.sw a1, (a0), 168 269; CHECK-NEXT: ret 270 store i32 %b, i32* %a 271 %1 = getelementptr i32, i32* %a, i32 42 272 ret i32* %1 273} 274 275define i32* @sw_rr_inc(i32* %a, i32 %b, i32 %c) { 276; CHECK-LABEL: sw_rr_inc: 277; CHECK: # %bb.0: 278; CHECK-NEXT: slli a2, a2, 2 279; CHECK-NEXT: cv.sw a1, (a0), a2 280; CHECK-NEXT: ret 281 store i32 %b, i32* %a 282 %1 = getelementptr i32, i32* %a, i32 %c 283 ret i32* %1 284} 285 286define void @sw_rr(i32* %a, i32 %b, i32 %c) { 287; CHECK-LABEL: sw_rr: 288; CHECK: # %bb.0: 289; CHECK-NEXT: slli a2, a2, 2 290; CHECK-NEXT: cv.sw a1, a2(a0) 291; CHECK-NEXT: ret 292 %1 = getelementptr i32, i32* %a, i32 %c 293 store i32 %b, i32* %1 294 ret void 295} 296