705 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+b | FileCheck %s --check-prefixes=CHECK,V3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+b,+zvfh | FileCheck %s --check-prefixes=CHECK,ZVFH4 5declare void @g()6 7define void @f(ptr %m, ptr %n, ptr %p, ptr %q, ptr %r, ptr %s, double %t) {8; CHECK-LABEL: f:9; CHECK: # %bb.0:10; CHECK-NEXT: addi sp, sp, -4811; CHECK-NEXT: .cfi_def_cfa_offset 4812; CHECK-NEXT: sd ra, 40(sp) # 8-byte Folded Spill13; CHECK-NEXT: sd s0, 32(sp) # 8-byte Folded Spill14; CHECK-NEXT: sd s1, 24(sp) # 8-byte Folded Spill15; CHECK-NEXT: sd s2, 16(sp) # 8-byte Folded Spill16; CHECK-NEXT: sd s3, 8(sp) # 8-byte Folded Spill17; CHECK-NEXT: sd s4, 0(sp) # 8-byte Folded Spill18; CHECK-NEXT: .cfi_offset ra, -819; CHECK-NEXT: .cfi_offset s0, -1620; CHECK-NEXT: .cfi_offset s1, -2421; CHECK-NEXT: .cfi_offset s2, -3222; CHECK-NEXT: .cfi_offset s3, -4023; CHECK-NEXT: .cfi_offset s4, -4824; CHECK-NEXT: mv s0, a525; CHECK-NEXT: mv s1, a426; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma27; CHECK-NEXT: vle64.v v8, (a0)28; CHECK-NEXT: vse64.v v8, (a1)29; CHECK-NEXT: ld s3, 0(a2)30; CHECK-NEXT: ld s4, 8(a2)31; CHECK-NEXT: mv s2, a332; CHECK-NEXT: call g33; CHECK-NEXT: sd s3, 0(s2)34; CHECK-NEXT: sd s4, 8(s2)35; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma36; CHECK-NEXT: vle64.v v8, (s1)37; CHECK-NEXT: vse64.v v8, (s0)38; CHECK-NEXT: ld ra, 40(sp) # 8-byte Folded Reload39; CHECK-NEXT: ld s0, 32(sp) # 8-byte Folded Reload40; CHECK-NEXT: ld s1, 24(sp) # 8-byte Folded Reload41; CHECK-NEXT: ld s2, 16(sp) # 8-byte Folded Reload42; CHECK-NEXT: ld s3, 8(sp) # 8-byte Folded Reload43; CHECK-NEXT: ld s4, 0(sp) # 8-byte Folded Reload44; CHECK-NEXT: .cfi_restore ra45; CHECK-NEXT: .cfi_restore s046; CHECK-NEXT: .cfi_restore s147; CHECK-NEXT: .cfi_restore s248; CHECK-NEXT: .cfi_restore s349; CHECK-NEXT: .cfi_restore s450; CHECK-NEXT: addi sp, sp, 4851; CHECK-NEXT: .cfi_def_cfa_offset 052; CHECK-NEXT: ret53 %z0 = load i64, ptr %m54 %m.1 = getelementptr i64, ptr %m, i64 155 %z1 = load i64, ptr %m.156 store i64 %z0, ptr %n57 %n.1 = getelementptr i64, ptr %n, i64 158 store i64 %z1, ptr %n.159 60 %x0 = load i64, ptr %p61 %p.1 = getelementptr i64, ptr %p, i64 162 %x1 = load i64, ptr %p.163 call void @g()64 store i64 %x0, ptr %q65 %q.1 = getelementptr i64, ptr %q, i64 166 store i64 %x1, ptr %q.167 68 %y0 = load i64, ptr %r69 %r.1 = getelementptr i64, ptr %r, i64 170 %y1 = load i64, ptr %r.171 store i64 %y0, ptr %s72 %s.1 = getelementptr i64, ptr %s, i64 173 store i64 %y1, ptr %s.174 75 ret void76}77 78define void @f1(ptr %p, ptr %q, double %t) {79; CHECK-LABEL: f1:80; CHECK: # %bb.0:81; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma82; CHECK-NEXT: vle64.v v8, (a0)83; CHECK-NEXT: fcvt.wu.d a0, fa0, rtz84; CHECK-NEXT: vse64.v v8, (a1)85; CHECK-NEXT: ret86 %x0 = load i64, ptr %p87 %p.1 = getelementptr i64, ptr %p, i64 188 %x1 = load i64, ptr %p.189 %t1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %t, metadata !"fpexcept.strict")90 store i64 %x0, ptr %q91 %q.1 = getelementptr i64, ptr %q, i64 192 store i64 %x1, ptr %q.193 ret void94}95 96; Merging scalars is profitable, it reduces pressure within a single97; register class.98define void @i8_i16(ptr %p, ptr %q) {99; CHECK-LABEL: i8_i16:100; CHECK: # %bb.0:101; CHECK-NEXT: addi sp, sp, -32102; CHECK-NEXT: .cfi_def_cfa_offset 32103; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill104; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill105; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill106; CHECK-NEXT: .cfi_offset ra, -8107; CHECK-NEXT: .cfi_offset s0, -16108; CHECK-NEXT: .cfi_offset s1, -24109; CHECK-NEXT: lh s1, 0(a0)110; CHECK-NEXT: mv s0, a1111; CHECK-NEXT: call g112; CHECK-NEXT: sh s1, 0(s0)113; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload114; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload115; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload116; CHECK-NEXT: .cfi_restore ra117; CHECK-NEXT: .cfi_restore s0118; CHECK-NEXT: .cfi_restore s1119; CHECK-NEXT: addi sp, sp, 32120; CHECK-NEXT: .cfi_def_cfa_offset 0121; CHECK-NEXT: ret122 %p0 = getelementptr i8, ptr %p, i64 0123 %p1 = getelementptr i8, ptr %p, i64 1124 %x0 = load i8, ptr %p0, align 2125 %x1 = load i8, ptr %p1126 call void @g()127 %q0 = getelementptr i8, ptr %q, i64 0128 %q1 = getelementptr i8, ptr %q, i64 1129 store i8 %x0, ptr %q0, align 2130 store i8 %x1, ptr %q1131 ret void132}133 134define void @i8_i16_rotate(ptr %p, ptr %q) {135; CHECK-LABEL: i8_i16_rotate:136; CHECK: # %bb.0:137; CHECK-NEXT: addi sp, sp, -32138; CHECK-NEXT: .cfi_def_cfa_offset 32139; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill140; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill141; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill142; CHECK-NEXT: sd s2, 0(sp) # 8-byte Folded Spill143; CHECK-NEXT: .cfi_offset ra, -8144; CHECK-NEXT: .cfi_offset s0, -16145; CHECK-NEXT: .cfi_offset s1, -24146; CHECK-NEXT: .cfi_offset s2, -32147; CHECK-NEXT: lbu s1, 0(a0)148; CHECK-NEXT: lbu s2, 1(a0)149; CHECK-NEXT: mv s0, a1150; CHECK-NEXT: call g151; CHECK-NEXT: sb s2, 0(s0)152; CHECK-NEXT: sb s1, 1(s0)153; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload154; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload155; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload156; CHECK-NEXT: ld s2, 0(sp) # 8-byte Folded Reload157; CHECK-NEXT: .cfi_restore ra158; CHECK-NEXT: .cfi_restore s0159; CHECK-NEXT: .cfi_restore s1160; CHECK-NEXT: .cfi_restore s2161; CHECK-NEXT: addi sp, sp, 32162; CHECK-NEXT: .cfi_def_cfa_offset 0163; CHECK-NEXT: ret164 %p0 = getelementptr i8, ptr %p, i64 0165 %p1 = getelementptr i8, ptr %p, i64 1166 %x0 = load i8, ptr %p0, align 2167 %x1 = load i8, ptr %p1168 call void @g()169 %q0 = getelementptr i8, ptr %q, i64 0170 %q1 = getelementptr i8, ptr %q, i64 1171 store i8 %x1, ptr %q0, align 2172 store i8 %x0, ptr %q1173 ret void174}175 176; We could reorder the first call and the load here to enable177; merging, but don't currently do so.178define void @i8_i16_resched_readnone_ld(ptr %p, ptr %q) {179; CHECK-LABEL: i8_i16_resched_readnone_ld:180; CHECK: # %bb.0:181; CHECK-NEXT: addi sp, sp, -32182; CHECK-NEXT: .cfi_def_cfa_offset 32183; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill184; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill185; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill186; CHECK-NEXT: sd s2, 0(sp) # 8-byte Folded Spill187; CHECK-NEXT: .cfi_offset ra, -8188; CHECK-NEXT: .cfi_offset s0, -16189; CHECK-NEXT: .cfi_offset s1, -24190; CHECK-NEXT: .cfi_offset s2, -32191; CHECK-NEXT: mv s0, a0192; CHECK-NEXT: lbu s2, 0(a0)193; CHECK-NEXT: mv s1, a1194; CHECK-NEXT: call g195; CHECK-NEXT: lbu s0, 1(s0)196; CHECK-NEXT: call g197; CHECK-NEXT: sb s2, 0(s1)198; CHECK-NEXT: sb s0, 1(s1)199; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload200; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload201; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload202; CHECK-NEXT: ld s2, 0(sp) # 8-byte Folded Reload203; CHECK-NEXT: .cfi_restore ra204; CHECK-NEXT: .cfi_restore s0205; CHECK-NEXT: .cfi_restore s1206; CHECK-NEXT: .cfi_restore s2207; CHECK-NEXT: addi sp, sp, 32208; CHECK-NEXT: .cfi_def_cfa_offset 0209; CHECK-NEXT: ret210 %p0 = getelementptr i8, ptr %p, i64 0211 %p1 = getelementptr i8, ptr %p, i64 1212 %x0 = load i8, ptr %p0, align 2213 call void @g() readnone214 %x1 = load i8, ptr %p1215 call void @g()216 %q0 = getelementptr i8, ptr %q, i64 0217 %q1 = getelementptr i8, ptr %q, i64 1218 store i8 %x0, ptr %q0, align 2219 store i8 %x1, ptr %q1220 ret void221}222 223; We could reorder the second call and the store here to224; enable merging, but don't currently do so.225define void @i8_i16_resched_readnone_st(ptr %p, ptr %q) {226; CHECK-LABEL: i8_i16_resched_readnone_st:227; CHECK: # %bb.0:228; CHECK-NEXT: addi sp, sp, -32229; CHECK-NEXT: .cfi_def_cfa_offset 32230; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill231; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill232; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill233; CHECK-NEXT: sd s2, 0(sp) # 8-byte Folded Spill234; CHECK-NEXT: .cfi_offset ra, -8235; CHECK-NEXT: .cfi_offset s0, -16236; CHECK-NEXT: .cfi_offset s1, -24237; CHECK-NEXT: .cfi_offset s2, -32238; CHECK-NEXT: lbu s1, 0(a0)239; CHECK-NEXT: lbu s2, 1(a0)240; CHECK-NEXT: mv s0, a1241; CHECK-NEXT: call g242; CHECK-NEXT: sb s1, 0(s0)243; CHECK-NEXT: call g244; CHECK-NEXT: sb s2, 1(s0)245; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload246; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload247; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload248; CHECK-NEXT: ld s2, 0(sp) # 8-byte Folded Reload249; CHECK-NEXT: .cfi_restore ra250; CHECK-NEXT: .cfi_restore s0251; CHECK-NEXT: .cfi_restore s1252; CHECK-NEXT: .cfi_restore s2253; CHECK-NEXT: addi sp, sp, 32254; CHECK-NEXT: .cfi_def_cfa_offset 0255; CHECK-NEXT: ret256 %p0 = getelementptr i8, ptr %p, i64 0257 %p1 = getelementptr i8, ptr %p, i64 1258 %x0 = load i8, ptr %p0, align 2259 %x1 = load i8, ptr %p1260 call void @g()261 %q0 = getelementptr i8, ptr %q, i64 0262 store i8 %x0, ptr %q0, align 2263 call void @g() readnone264 %q1 = getelementptr i8, ptr %q, i64 1265 store i8 %x1, ptr %q1266 ret void267}268 269define void @i32_i64(ptr %p, ptr %q) {270; CHECK-LABEL: i32_i64:271; CHECK: # %bb.0:272; CHECK-NEXT: addi sp, sp, -32273; CHECK-NEXT: .cfi_def_cfa_offset 32274; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill275; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill276; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill277; CHECK-NEXT: .cfi_offset ra, -8278; CHECK-NEXT: .cfi_offset s0, -16279; CHECK-NEXT: .cfi_offset s1, -24280; CHECK-NEXT: ld s1, 0(a0)281; CHECK-NEXT: mv s0, a1282; CHECK-NEXT: call g283; CHECK-NEXT: sd s1, 0(s0)284; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload285; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload286; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload287; CHECK-NEXT: .cfi_restore ra288; CHECK-NEXT: .cfi_restore s0289; CHECK-NEXT: .cfi_restore s1290; CHECK-NEXT: addi sp, sp, 32291; CHECK-NEXT: .cfi_def_cfa_offset 0292; CHECK-NEXT: ret293 %p0 = getelementptr i8, ptr %p, i64 0294 %p1 = getelementptr i8, ptr %p, i64 4295 %x0 = load i32, ptr %p0, align 8296 %x1 = load i32, ptr %p1297 call void @g()298 %q0 = getelementptr i8, ptr %q, i64 0299 %q1 = getelementptr i8, ptr %q, i64 4300 store i32 %x0, ptr %q0, align 8301 store i32 %x1, ptr %q1302 ret void303}304 305define void @i32_i64_rotate(ptr %p, ptr %q) {306; CHECK-LABEL: i32_i64_rotate:307; CHECK: # %bb.0:308; CHECK-NEXT: addi sp, sp, -32309; CHECK-NEXT: .cfi_def_cfa_offset 32310; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill311; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill312; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill313; CHECK-NEXT: .cfi_offset ra, -8314; CHECK-NEXT: .cfi_offset s0, -16315; CHECK-NEXT: .cfi_offset s1, -24316; CHECK-NEXT: mv s0, a1317; CHECK-NEXT: ld a0, 0(a0)318; CHECK-NEXT: rori s1, a0, 32319; CHECK-NEXT: call g320; CHECK-NEXT: sd s1, 0(s0)321; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload322; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload323; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload324; CHECK-NEXT: .cfi_restore ra325; CHECK-NEXT: .cfi_restore s0326; CHECK-NEXT: .cfi_restore s1327; CHECK-NEXT: addi sp, sp, 32328; CHECK-NEXT: .cfi_def_cfa_offset 0329; CHECK-NEXT: ret330 %p0 = getelementptr i8, ptr %p, i64 0331 %p1 = getelementptr i8, ptr %p, i64 4332 %x0 = load i32, ptr %p0, align 8333 %x1 = load i32, ptr %p1334 call void @g()335 %q0 = getelementptr i8, ptr %q, i64 0336 %q1 = getelementptr i8, ptr %q, i64 4337 store i32 %x1, ptr %q0, align 8338 store i32 %x0, ptr %q1339 ret void340}341 342; Merging vectors is profitable, it reduces pressure within a single343; register class.344define void @v2i8_v4i8(ptr %p, ptr %q) {345; CHECK-LABEL: v2i8_v4i8:346; CHECK: # %bb.0:347; CHECK-NEXT: addi sp, sp, -32348; CHECK-NEXT: .cfi_def_cfa_offset 32349; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill350; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill351; CHECK-NEXT: .cfi_offset ra, -8352; CHECK-NEXT: .cfi_offset s0, -16353; CHECK-NEXT: csrr a2, vlenb354; CHECK-NEXT: sub sp, sp, a2355; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x01, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 1 * vlenb356; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma357; CHECK-NEXT: vle8.v v8, (a0)358; CHECK-NEXT: addi a0, sp, 16359; CHECK-NEXT: vs1r.v v8, (a0) # vscale x 8-byte Folded Spill360; CHECK-NEXT: mv s0, a1361; CHECK-NEXT: call g362; CHECK-NEXT: addi a0, sp, 16363; CHECK-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload364; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma365; CHECK-NEXT: vse8.v v8, (s0)366; CHECK-NEXT: csrr a0, vlenb367; CHECK-NEXT: add sp, sp, a0368; CHECK-NEXT: .cfi_def_cfa sp, 32369; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload370; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload371; CHECK-NEXT: .cfi_restore ra372; CHECK-NEXT: .cfi_restore s0373; CHECK-NEXT: addi sp, sp, 32374; CHECK-NEXT: .cfi_def_cfa_offset 0375; CHECK-NEXT: ret376 %p0 = getelementptr i8, ptr %p, i64 0377 %p1 = getelementptr i8, ptr %p, i64 2378 %x0 = load <2 x i8>, ptr %p0, align 2379 %x1 = load <2 x i8>, ptr %p1380 call void @g()381 %q0 = getelementptr i8, ptr %q, i64 0382 %q1 = getelementptr i8, ptr %q, i64 2383 store <2 x i8> %x0, ptr %q0, align 2384 store <2 x i8> %x1, ptr %q1385 ret void386}387 388; Merging two 16 x i8 into one 32 x i8 (on zvl128b) will require the same389; numbers of registers to be spilled, but it can be done with fewer390; instructions391define void @v16i8_v32i8(ptr %p, ptr %q) {392; CHECK-LABEL: v16i8_v32i8:393; CHECK: # %bb.0:394; CHECK-NEXT: addi sp, sp, -64395; CHECK-NEXT: .cfi_def_cfa_offset 64396; CHECK-NEXT: sd ra, 56(sp) # 8-byte Folded Spill397; CHECK-NEXT: sd s0, 48(sp) # 8-byte Folded Spill398; CHECK-NEXT: sd s1, 40(sp) # 8-byte Folded Spill399; CHECK-NEXT: .cfi_offset ra, -8400; CHECK-NEXT: .cfi_offset s0, -16401; CHECK-NEXT: .cfi_offset s1, -24402; CHECK-NEXT: csrr a2, vlenb403; CHECK-NEXT: slli a2, a2, 1404; CHECK-NEXT: sub sp, sp, a2405; CHECK-NEXT: .cfi_escape 0x0f, 0x0e, 0x72, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 64 + 2 * vlenb406; CHECK-NEXT: li s1, 32407; CHECK-NEXT: vsetvli zero, s1, e8, m2, ta, ma408; CHECK-NEXT: vle8.v v8, (a0)409; CHECK-NEXT: addi a0, sp, 32410; CHECK-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill411; CHECK-NEXT: mv s0, a1412; CHECK-NEXT: call g413; CHECK-NEXT: addi a0, sp, 32414; CHECK-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload415; CHECK-NEXT: vsetvli zero, s1, e8, m2, ta, ma416; CHECK-NEXT: vse8.v v8, (s0)417; CHECK-NEXT: csrr a0, vlenb418; CHECK-NEXT: sh1add sp, a0, sp419; CHECK-NEXT: .cfi_def_cfa sp, 64420; CHECK-NEXT: ld ra, 56(sp) # 8-byte Folded Reload421; CHECK-NEXT: ld s0, 48(sp) # 8-byte Folded Reload422; CHECK-NEXT: ld s1, 40(sp) # 8-byte Folded Reload423; CHECK-NEXT: .cfi_restore ra424; CHECK-NEXT: .cfi_restore s0425; CHECK-NEXT: .cfi_restore s1426; CHECK-NEXT: addi sp, sp, 64427; CHECK-NEXT: .cfi_def_cfa_offset 0428; CHECK-NEXT: ret429 %p0 = getelementptr i8, ptr %p, i64 0430 %p1 = getelementptr i8, ptr %p, i64 16431 %x0 = load <16 x i8>, ptr %p0, align 2432 %x1 = load <16 x i8>, ptr %p1433 call void @g()434 %q0 = getelementptr i8, ptr %q, i64 0435 %q1 = getelementptr i8, ptr %q, i64 16436 store <16 x i8> %x0, ptr %q0, align 2437 store <16 x i8> %x1, ptr %q1438 ret void439}440 441define void @two_half(ptr %p, ptr %q) {442; CHECK-LABEL: two_half:443; CHECK: # %bb.0:444; CHECK-NEXT: addi sp, sp, -32445; CHECK-NEXT: .cfi_def_cfa_offset 32446; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill447; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill448; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill449; CHECK-NEXT: .cfi_offset ra, -8450; CHECK-NEXT: .cfi_offset s0, -16451; CHECK-NEXT: .cfi_offset s1, -24452; CHECK-NEXT: lw s1, 0(a0)453; CHECK-NEXT: mv s0, a1454; CHECK-NEXT: call g455; CHECK-NEXT: sw s1, 0(s0)456; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload457; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload458; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload459; CHECK-NEXT: .cfi_restore ra460; CHECK-NEXT: .cfi_restore s0461; CHECK-NEXT: .cfi_restore s1462; CHECK-NEXT: addi sp, sp, 32463; CHECK-NEXT: .cfi_def_cfa_offset 0464; CHECK-NEXT: ret465 %p0 = getelementptr i8, ptr %p, i64 0466 %p1 = getelementptr i8, ptr %p, i64 2467 %x0 = load half, ptr %p0, align 4468 %x1 = load half, ptr %p1469 call void @g()470 %q0 = getelementptr i8, ptr %q, i64 0471 %q1 = getelementptr i8, ptr %q, i64 2472 store half %x0, ptr %q0, align 4473 store half %x1, ptr %q1474 ret void475}476 477define void @two_half_unaligned(ptr %p, ptr %q) {478; V-LABEL: two_half_unaligned:479; V: # %bb.0:480; V-NEXT: addi sp, sp, -32481; V-NEXT: .cfi_def_cfa_offset 32482; V-NEXT: sd ra, 24(sp) # 8-byte Folded Spill483; V-NEXT: sd s0, 16(sp) # 8-byte Folded Spill484; V-NEXT: sd s1, 8(sp) # 8-byte Folded Spill485; V-NEXT: sd s2, 0(sp) # 8-byte Folded Spill486; V-NEXT: .cfi_offset ra, -8487; V-NEXT: .cfi_offset s0, -16488; V-NEXT: .cfi_offset s1, -24489; V-NEXT: .cfi_offset s2, -32490; V-NEXT: lh s1, 0(a0)491; V-NEXT: lh s2, 2(a0)492; V-NEXT: mv s0, a1493; V-NEXT: call g494; V-NEXT: sh s1, 0(s0)495; V-NEXT: sh s2, 2(s0)496; V-NEXT: ld ra, 24(sp) # 8-byte Folded Reload497; V-NEXT: ld s0, 16(sp) # 8-byte Folded Reload498; V-NEXT: ld s1, 8(sp) # 8-byte Folded Reload499; V-NEXT: ld s2, 0(sp) # 8-byte Folded Reload500; V-NEXT: .cfi_restore ra501; V-NEXT: .cfi_restore s0502; V-NEXT: .cfi_restore s1503; V-NEXT: .cfi_restore s2504; V-NEXT: addi sp, sp, 32505; V-NEXT: .cfi_def_cfa_offset 0506; V-NEXT: ret507;508; ZVFH-LABEL: two_half_unaligned:509; ZVFH: # %bb.0:510; ZVFH-NEXT: addi sp, sp, -32511; ZVFH-NEXT: .cfi_def_cfa_offset 32512; ZVFH-NEXT: sd ra, 24(sp) # 8-byte Folded Spill513; ZVFH-NEXT: sd s0, 16(sp) # 8-byte Folded Spill514; ZVFH-NEXT: fsd fs0, 8(sp) # 8-byte Folded Spill515; ZVFH-NEXT: fsd fs1, 0(sp) # 8-byte Folded Spill516; ZVFH-NEXT: .cfi_offset ra, -8517; ZVFH-NEXT: .cfi_offset s0, -16518; ZVFH-NEXT: .cfi_offset fs0, -24519; ZVFH-NEXT: .cfi_offset fs1, -32520; ZVFH-NEXT: flh fs0, 0(a0)521; ZVFH-NEXT: flh fs1, 2(a0)522; ZVFH-NEXT: mv s0, a1523; ZVFH-NEXT: call g524; ZVFH-NEXT: fsh fs0, 0(s0)525; ZVFH-NEXT: fsh fs1, 2(s0)526; ZVFH-NEXT: ld ra, 24(sp) # 8-byte Folded Reload527; ZVFH-NEXT: ld s0, 16(sp) # 8-byte Folded Reload528; ZVFH-NEXT: fld fs0, 8(sp) # 8-byte Folded Reload529; ZVFH-NEXT: fld fs1, 0(sp) # 8-byte Folded Reload530; ZVFH-NEXT: .cfi_restore ra531; ZVFH-NEXT: .cfi_restore s0532; ZVFH-NEXT: .cfi_restore fs0533; ZVFH-NEXT: .cfi_restore fs1534; ZVFH-NEXT: addi sp, sp, 32535; ZVFH-NEXT: .cfi_def_cfa_offset 0536; ZVFH-NEXT: ret537 %p0 = getelementptr i8, ptr %p, i64 0538 %p1 = getelementptr i8, ptr %p, i64 2539 %x0 = load half, ptr %p0540 %x1 = load half, ptr %p1541 call void @g()542 %q0 = getelementptr i8, ptr %q, i64 0543 %q1 = getelementptr i8, ptr %q, i64 2544 store half %x0, ptr %q0545 store half %x1, ptr %q1546 ret void547}548 549define void @two_float(ptr %p, ptr %q) {550; CHECK-LABEL: two_float:551; CHECK: # %bb.0:552; CHECK-NEXT: addi sp, sp, -32553; CHECK-NEXT: .cfi_def_cfa_offset 32554; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill555; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill556; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill557; CHECK-NEXT: .cfi_offset ra, -8558; CHECK-NEXT: .cfi_offset s0, -16559; CHECK-NEXT: .cfi_offset s1, -24560; CHECK-NEXT: ld s1, 0(a0)561; CHECK-NEXT: mv s0, a1562; CHECK-NEXT: call g563; CHECK-NEXT: sd s1, 0(s0)564; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload565; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload566; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload567; CHECK-NEXT: .cfi_restore ra568; CHECK-NEXT: .cfi_restore s0569; CHECK-NEXT: .cfi_restore s1570; CHECK-NEXT: addi sp, sp, 32571; CHECK-NEXT: .cfi_def_cfa_offset 0572; CHECK-NEXT: ret573 %p0 = getelementptr i8, ptr %p, i64 0574 %p1 = getelementptr i8, ptr %p, i64 4575 %x0 = load float, ptr %p0, align 8576 %x1 = load float, ptr %p1577 call void @g()578 %q0 = getelementptr i8, ptr %q, i64 0579 %q1 = getelementptr i8, ptr %q, i64 4580 store float %x0, ptr %q0, align 8581 store float %x1, ptr %q1582 ret void583}584 585define void @two_float_unaligned(ptr %p, ptr %q) {586; CHECK-LABEL: two_float_unaligned:587; CHECK: # %bb.0:588; CHECK-NEXT: addi sp, sp, -32589; CHECK-NEXT: .cfi_def_cfa_offset 32590; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill591; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill592; CHECK-NEXT: fsd fs0, 8(sp) # 8-byte Folded Spill593; CHECK-NEXT: fsd fs1, 0(sp) # 8-byte Folded Spill594; CHECK-NEXT: .cfi_offset ra, -8595; CHECK-NEXT: .cfi_offset s0, -16596; CHECK-NEXT: .cfi_offset fs0, -24597; CHECK-NEXT: .cfi_offset fs1, -32598; CHECK-NEXT: flw fs0, 0(a0)599; CHECK-NEXT: flw fs1, 4(a0)600; CHECK-NEXT: mv s0, a1601; CHECK-NEXT: call g602; CHECK-NEXT: fsw fs0, 0(s0)603; CHECK-NEXT: fsw fs1, 4(s0)604; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload605; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload606; CHECK-NEXT: fld fs0, 8(sp) # 8-byte Folded Reload607; CHECK-NEXT: fld fs1, 0(sp) # 8-byte Folded Reload608; CHECK-NEXT: .cfi_restore ra609; CHECK-NEXT: .cfi_restore s0610; CHECK-NEXT: .cfi_restore fs0611; CHECK-NEXT: .cfi_restore fs1612; CHECK-NEXT: addi sp, sp, 32613; CHECK-NEXT: .cfi_def_cfa_offset 0614; CHECK-NEXT: ret615 %p0 = getelementptr i8, ptr %p, i64 0616 %p1 = getelementptr i8, ptr %p, i64 4617 %x0 = load float, ptr %p0618 %x1 = load float, ptr %p1619 call void @g()620 %q0 = getelementptr i8, ptr %q, i64 0621 %q1 = getelementptr i8, ptr %q, i64 4622 store float %x0, ptr %q0623 store float %x1, ptr %q1624 ret void625}626 627define void @two_float_rotate(ptr %p, ptr %q) {628; CHECK-LABEL: two_float_rotate:629; CHECK: # %bb.0:630; CHECK-NEXT: addi sp, sp, -32631; CHECK-NEXT: .cfi_def_cfa_offset 32632; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill633; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill634; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill635; CHECK-NEXT: .cfi_offset ra, -8636; CHECK-NEXT: .cfi_offset s0, -16637; CHECK-NEXT: .cfi_offset s1, -24638; CHECK-NEXT: mv s0, a1639; CHECK-NEXT: ld a0, 0(a0)640; CHECK-NEXT: rori s1, a0, 32641; CHECK-NEXT: call g642; CHECK-NEXT: sd s1, 0(s0)643; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload644; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload645; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload646; CHECK-NEXT: .cfi_restore ra647; CHECK-NEXT: .cfi_restore s0648; CHECK-NEXT: .cfi_restore s1649; CHECK-NEXT: addi sp, sp, 32650; CHECK-NEXT: .cfi_def_cfa_offset 0651; CHECK-NEXT: ret652 %p0 = getelementptr i8, ptr %p, i64 0653 %p1 = getelementptr i8, ptr %p, i64 4654 %x0 = load float, ptr %p0, align 8655 %x1 = load float, ptr %p1656 call void @g()657 %q0 = getelementptr i8, ptr %q, i64 0658 %q1 = getelementptr i8, ptr %q, i64 4659 store float %x1, ptr %q0, align 8660 store float %x0, ptr %q1661 ret void662}663 664define void @two_double(ptr %p, ptr %q) {665; CHECK-LABEL: two_double:666; CHECK: # %bb.0:667; CHECK-NEXT: addi sp, sp, -32668; CHECK-NEXT: .cfi_def_cfa_offset 32669; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill670; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill671; CHECK-NEXT: fsd fs0, 8(sp) # 8-byte Folded Spill672; CHECK-NEXT: fsd fs1, 0(sp) # 8-byte Folded Spill673; CHECK-NEXT: .cfi_offset ra, -8674; CHECK-NEXT: .cfi_offset s0, -16675; CHECK-NEXT: .cfi_offset fs0, -24676; CHECK-NEXT: .cfi_offset fs1, -32677; CHECK-NEXT: fld fs0, 0(a0)678; CHECK-NEXT: fld fs1, 8(a0)679; CHECK-NEXT: mv s0, a1680; CHECK-NEXT: call g681; CHECK-NEXT: fsd fs0, 0(s0)682; CHECK-NEXT: fsd fs1, 8(s0)683; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload684; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload685; CHECK-NEXT: fld fs0, 8(sp) # 8-byte Folded Reload686; CHECK-NEXT: fld fs1, 0(sp) # 8-byte Folded Reload687; CHECK-NEXT: .cfi_restore ra688; CHECK-NEXT: .cfi_restore s0689; CHECK-NEXT: .cfi_restore fs0690; CHECK-NEXT: .cfi_restore fs1691; CHECK-NEXT: addi sp, sp, 32692; CHECK-NEXT: .cfi_def_cfa_offset 0693; CHECK-NEXT: ret694 %p0 = getelementptr i8, ptr %p, i64 0695 %p1 = getelementptr i8, ptr %p, i64 8696 %x0 = load double, ptr %p0697 %x1 = load double, ptr %p1698 call void @g()699 %q0 = getelementptr i8, ptr %q, i64 0700 %q1 = getelementptr i8, ptr %q, i64 8701 store double %x0, ptr %q0702 store double %x1, ptr %q1703 ret void704}705