riscv: refine vector context layout on stack (#1329)
Vector general register layout:
Before:
+--------------+ <-- High Address
| v7 |
+--------------+
| v6 |
+--------------+
| ... |
+--------------+
| v0 |
+--------------+ <-- v0 - v7
| v15 |
+--------------+
| v14 |
+--------------+
| ... |
+--------------+
| v8 |
+--------------+ <-- v8 - v15
| ... |
+--------------+
| v24 |
+--------------+ <-- Low address
After:
+--------------+ <-- High Address
| v31 |
+--------------+
| v30 |
+--------------+
| ... |
+--------------+
| v1 |
+--------------+
| v0 |
+--------------+ <-- Low Address
Signed-off-by: wangfei_chen <wangfei_chen@realsil.com.cn>
Co-authored-by: wangfei_chen <wangfei_chen@realsil.com.cn>
Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
diff --git a/portable/GCC/RISC-V/portContext.h b/portable/GCC/RISC-V/portContext.h
index 012965c..0869a82 100644
--- a/portable/GCC/RISC-V/portContext.h
+++ b/portable/GCC/RISC-V/portContext.h
@@ -214,13 +214,13 @@
/* Store the vector registers in group of 8. */
add sp, sp, t0
-vs8r.v v0, (sp) /* Store v0-v7. */
-add sp, sp, t0
-vs8r.v v8, (sp) /* Store v8-v15. */
+vs8r.v v24, (sp) /* Store v24-v31. */
add sp, sp, t0
vs8r.v v16, (sp) /* Store v16-v23. */
add sp, sp, t0
-vs8r.v v24, (sp) /* Store v24-v31. */
+vs8r.v v8, (sp) /* Store v8-v15. */
+add sp, sp, t0
+vs8r.v v0, (sp) /* Store v0-v7. */
/* Store the VPU CSRs. */
addi sp, sp, -( 4 * portWORD_SIZE )
@@ -256,13 +256,13 @@
slli t0, t0, 3 /* t0 = vlenb * 8. t0 now contains the space required to store 8 vector registers. */
/* Restore the vector registers. */
-vl8r.v v24, (sp)
+vl8r.v v0, (sp) /* Restore v0-v7. */
add sp, sp, t0
-vl8r.v v16, (sp)
+vl8r.v v8, (sp) /* Restore v8-v15. */
add sp, sp, t0
-vl8r.v v8, (sp)
+vl8r.v v16, (sp) /* Restore v16-v23. */
add sp, sp, t0
-vl8r.v v0, (sp)
+vl8r.v v24, (sp) /* Restore v23-v31. */
add sp, sp, t0
/* Re-reserve the space for mstatus and epc. */