| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple riscv32-unknown-elf -mattr=+zve32x,+zvl128b -o - %s \ |
| ; RUN: 2>&1 | FileCheck %s -check-prefix CHECK-RV32 |
| |
| @a = external global <4 x i32> |
| @b = external global <4 x i32> |
| @c = external global <4 x i32> |
| |
| define void @foo_lmul1() nounwind #0 { |
| ; CHECK-RV32-LABEL: foo_lmul1: |
| ; CHECK-RV32: # %bb.0: |
| ; CHECK-RV32-NEXT: addi sp, sp, -32 |
| ; CHECK-RV32-NEXT: sw a0, 28(sp) # 4-byte Folded Spill |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 1 |
| ; CHECK-RV32-NEXT: sub sp, sp, a0 |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill |
| ; CHECK-RV32-NEXT: lui a0, %hi(a) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(a) |
| ; CHECK-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma |
| ; CHECK-RV32-NEXT: vle32.v v8, (a0) |
| ; CHECK-RV32-NEXT: lui a0, %hi(b) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(b) |
| ; CHECK-RV32-NEXT: vle32.v v9, (a0) |
| ; CHECK-RV32-NEXT: vadd.vv v8, v9, v8 |
| ; CHECK-RV32-NEXT: lui a0, %hi(c) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(c) |
| ; CHECK-RV32-NEXT: vse32.v v8, (a0) |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 1 |
| ; CHECK-RV32-NEXT: add sp, sp, a0 |
| ; CHECK-RV32-NEXT: lw a0, 28(sp) # 4-byte Folded Reload |
| ; CHECK-RV32-NEXT: addi sp, sp, 32 |
| ; CHECK-RV32-NEXT: mret |
| %1 = load <4 x i32>, ptr @a |
| %2 = load <4 x i32>, ptr @b |
| %add = add nsw <4 x i32> %2, %1 |
| store <4 x i32> %add, ptr @c |
| ret void |
| } |
| |
| @d = external global <8 x i32> |
| @e = external global <8 x i32> |
| @f = external global <8 x i32> |
| |
| define void @foo_lmul2() nounwind #0 { |
| ; CHECK-RV32-LABEL: foo_lmul2: |
| ; CHECK-RV32: # %bb.0: |
| ; CHECK-RV32-NEXT: addi sp, sp, -32 |
| ; CHECK-RV32-NEXT: sw a0, 28(sp) # 4-byte Folded Spill |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 2 |
| ; CHECK-RV32-NEXT: sub sp, sp, a0 |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vs4r.v v8, (a0) # vscale x 32-byte Folded Spill |
| ; CHECK-RV32-NEXT: lui a0, %hi(d) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(d) |
| ; CHECK-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma |
| ; CHECK-RV32-NEXT: vle32.v v8, (a0) |
| ; CHECK-RV32-NEXT: lui a0, %hi(e) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(e) |
| ; CHECK-RV32-NEXT: vle32.v v10, (a0) |
| ; CHECK-RV32-NEXT: vadd.vv v8, v10, v8 |
| ; CHECK-RV32-NEXT: lui a0, %hi(f) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(f) |
| ; CHECK-RV32-NEXT: vse32.v v8, (a0) |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vl4r.v v8, (a0) # vscale x 32-byte Folded Reload |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 2 |
| ; CHECK-RV32-NEXT: add sp, sp, a0 |
| ; CHECK-RV32-NEXT: lw a0, 28(sp) # 4-byte Folded Reload |
| ; CHECK-RV32-NEXT: addi sp, sp, 32 |
| ; CHECK-RV32-NEXT: mret |
| %1 = load <8 x i32>, ptr @d |
| %2 = load <8 x i32>, ptr @e |
| %add = add nsw <8 x i32> %2, %1 |
| store <8 x i32> %add, ptr @f |
| ret void |
| } |
| |
| @g = external global <16 x i32> |
| @h = external global <16 x i32> |
| @i = external global <16 x i32> |
| |
| define void @foo_lmul4() nounwind #0 { |
| ; CHECK-RV32-LABEL: foo_lmul4: |
| ; CHECK-RV32: # %bb.0: |
| ; CHECK-RV32-NEXT: addi sp, sp, -32 |
| ; CHECK-RV32-NEXT: sw a0, 28(sp) # 4-byte Folded Spill |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 3 |
| ; CHECK-RV32-NEXT: sub sp, sp, a0 |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vs8r.v v8, (a0) # vscale x 64-byte Folded Spill |
| ; CHECK-RV32-NEXT: lui a0, %hi(g) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(g) |
| ; CHECK-RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma |
| ; CHECK-RV32-NEXT: vle32.v v8, (a0) |
| ; CHECK-RV32-NEXT: lui a0, %hi(h) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(h) |
| ; CHECK-RV32-NEXT: vle32.v v12, (a0) |
| ; CHECK-RV32-NEXT: vadd.vv v8, v12, v8 |
| ; CHECK-RV32-NEXT: lui a0, %hi(i) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(i) |
| ; CHECK-RV32-NEXT: vse32.v v8, (a0) |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 3 |
| ; CHECK-RV32-NEXT: add sp, sp, a0 |
| ; CHECK-RV32-NEXT: lw a0, 28(sp) # 4-byte Folded Reload |
| ; CHECK-RV32-NEXT: addi sp, sp, 32 |
| ; CHECK-RV32-NEXT: mret |
| %1 = load <16 x i32>, ptr @g |
| %2 = load <16 x i32>, ptr @h |
| %add = add nsw <16 x i32> %2, %1 |
| store <16 x i32> %add, ptr @i |
| ret void |
| } |
| |
| @j = external global <32 x i32> |
| @k = external global <32 x i32> |
| @l = external global <32 x i32> |
| |
| define void @foo_lmul8() nounwind #0 { |
| ; CHECK-RV32-LABEL: foo_lmul8: |
| ; CHECK-RV32: # %bb.0: |
| ; CHECK-RV32-NEXT: addi sp, sp, -32 |
| ; CHECK-RV32-NEXT: sw a0, 28(sp) # 4-byte Folded Spill |
| ; CHECK-RV32-NEXT: sw a1, 24(sp) # 4-byte Folded Spill |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 4 |
| ; CHECK-RV32-NEXT: sub sp, sp, a0 |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 3 |
| ; CHECK-RV32-NEXT: add a0, sp, a0 |
| ; CHECK-RV32-NEXT: addi a0, a0, 16 |
| ; CHECK-RV32-NEXT: vs8r.v v8, (a0) # vscale x 64-byte Folded Spill |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill |
| ; CHECK-RV32-NEXT: lui a0, %hi(j) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(j) |
| ; CHECK-RV32-NEXT: li a1, 32 |
| ; CHECK-RV32-NEXT: vsetvli zero, a1, e32, m8, ta, ma |
| ; CHECK-RV32-NEXT: vle32.v v8, (a0) |
| ; CHECK-RV32-NEXT: lui a0, %hi(k) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(k) |
| ; CHECK-RV32-NEXT: vle32.v v16, (a0) |
| ; CHECK-RV32-NEXT: vadd.vv v8, v16, v8 |
| ; CHECK-RV32-NEXT: lui a0, %hi(l) |
| ; CHECK-RV32-NEXT: addi a0, a0, %lo(l) |
| ; CHECK-RV32-NEXT: vse32.v v8, (a0) |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 3 |
| ; CHECK-RV32-NEXT: add a0, sp, a0 |
| ; CHECK-RV32-NEXT: addi a0, a0, 16 |
| ; CHECK-RV32-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload |
| ; CHECK-RV32-NEXT: addi a0, sp, 16 |
| ; CHECK-RV32-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload |
| ; CHECK-RV32-NEXT: csrr a0, vlenb |
| ; CHECK-RV32-NEXT: slli a0, a0, 4 |
| ; CHECK-RV32-NEXT: add sp, sp, a0 |
| ; CHECK-RV32-NEXT: lw a0, 28(sp) # 4-byte Folded Reload |
| ; CHECK-RV32-NEXT: lw a1, 24(sp) # 4-byte Folded Reload |
| ; CHECK-RV32-NEXT: addi sp, sp, 32 |
| ; CHECK-RV32-NEXT: mret |
| %1 = load <32 x i32>, ptr @j |
| %2 = load <32 x i32>, ptr @k |
| %add = add nsw <32 x i32> %2, %1 |
| store <32 x i32> %add, ptr @l |
| ret void |
| } |
| |
| attributes #0 = { "interrupt"="machine" } |