feat(riscv): add MOV pseudo-instruction and RVC compressed encoding

Assisted-by: DeepSeek V4 Pro
This commit is contained in:
2026-08-02 18:22:00 +02:00
parent eee7a6d4a4
commit 243b087116
8 changed files with 946 additions and 78 deletions
+5 -5
View File
@@ -5,8 +5,8 @@
// func add(a, b int64) int64
TEXT ·add(SB), NOSPLIT, $0-24
LD a+0(FP), A0
LD b+8(FP), A1
ADD A0, A1, A0
SD A0, ret+16(FP)
RET
MOV a+0(FP), X10
MOV b+8(FP), X11
ADD X11, X10, X10
MOV X10, ret+16(FP)
RET
+10 -10
View File
@@ -5,16 +5,16 @@
// func atomicAdd(ptr *int64, val int64) int64
TEXT ·atomicAdd(SB), NOSPLIT, $0-24
LD a+0(FP), A0
LD b+8(FP), A1
AMOADDD A1, (A0), A2
SD A2, ret+16(FP)
RET
MOV a+0(FP), X10
MOV b+8(FP), X11
AMOADDD X11, (X10), X12
MOV X12, ret+16(FP)
RET
// func fpAdd(a, b float64) float64
TEXT ·fpAdd(SB), NOSPLIT, $0-24
FLD a+0(FP), FA0
FLD b+8(FP), FA1
FADDD FA0, FA1, FA2
FSD FA2, ret+16(FP)
RET
FLD a+0(FP), F10
FLD b+8(FP), F11
FADDD F10, F11, F12
FSD F12, ret+16(FP)
RET
+13 -14
View File
@@ -4,24 +4,23 @@
#include "textflag.h"
// func readCSR(csr int64) int64
// Reads a CSR into the return value.
TEXT ·readCSR(SB), NOSPLIT, $0-16
LD a+0(FP), A0
CSRRS $0x300, X0, A1
SD A1, ret+8(FP)
RET
MOV a+0(FP), X10
CSRRS $0x300, X0, X11
MOV X11, ret+8(FP)
RET
// func setCSRBit(csr, bit int64) int64
TEXT ·setCSRBit(SB), NOSPLIT, $0-24
LD a+0(FP), A0
LD b+8(FP), A1
CSRRS $0x304, A1, A2
SD A2, ret+16(FP)
RET
MOV a+0(FP), X10
MOV b+8(FP), X11
CSRRS $0x304, X11, X12
MOV X12, ret+16(FP)
RET
// func writeCSR(val int64) int64
TEXT ·writeCSR(SB), NOSPLIT, $0-16
LD a+0(FP), A0
CSRRW $0x305, A0, A1
SD A1, ret+8(FP)
RET
MOV a+0(FP), X10
CSRRW $0x305, X10, X11
MOV X11, ret+8(FP)
RET
+12 -14
View File
@@ -4,21 +4,19 @@
#include "textflag.h"
// func fma(a, b, c float64) float64
// Computes a*b + c using fused multiply-add.
TEXT ·fma(SB), NOSPLIT, $0-32
FLD a+0(FP), FA0
FLD b+8(FP), FA1
FLD c+16(FP), FA2
FMADDD FA0, FA1, FA2, FA3
FSD FA3, ret+24(FP)
RET
FLD a+0(FP), F10
FLD b+8(FP), F11
FLD c+16(FP), F12
FMADDD F10, F11, F12, F13
FSD F13, ret+24(FP)
RET
// func fms(a, b, c float64) float64
// Computes a*b - c using fused multiply-subtract.
TEXT ·fms(SB), NOSPLIT, $0-32
FLD a+0(FP), FA0
FLD b+8(FP), FA1
FLD c+16(FP), FA2
FMSUBD FA0, FA1, FA2, FA3
FSD FA3, ret+24(FP)
RET
FLD a+0(FP), F10
FLD b+8(FP), F11
FLD c+16(FP), F12
FMSUBD F10, F11, F12, F13
FSD F13, ret+24(FP)
RET
+21 -22
View File
@@ -4,34 +4,33 @@
#include "textflag.h"
// func casLoop(ptr *int64, old, new int64) bool
// Compare-and-swap using LR/SC.
TEXT ·casLoop(SB), NOSPLIT, $0-32
cas_retry:
LD a+0(FP), A0
LRD (A0), A1
LD b+8(FP), A2
BNE A1, A2, cas_fail
LD c+16(FP), A3
SCD A3, (A0), A4
BNE A4, X0, cas_retry
ADDI X0, $1, A5
SD A5, ret+24(FP)
RET
MOV a+0(FP), X10
LRD (X10), X11
MOV b+8(FP), X12
BNE X11, X12, cas_fail
MOV c+16(FP), X13
SCD X13, (X10), X14
BNE X14, X0, cas_retry
ADDI X0, $1, X15
MOV X15, ret+24(FP)
RET
cas_fail:
SD X0, ret+24(FP)
RET
MOV X0, ret+24(FP)
RET
// func intToFloat(x int64) float64
TEXT ·intToFloat(SB), NOSPLIT, $0-16
LD a+0(FP), A0
FCVTDL A0, FA0
FSD FA0, ret+8(FP)
RET
MOV a+0(FP), X10
FCVTDL X10, F10
FSD F10, ret+8(FP)
RET
// func compare(a, b float64) bool
TEXT ·compare(SB), NOSPLIT, $0-24
FLD a+0(FP), FA0
FLD b+8(FP), FA1
FLTD FA0, FA1, A0
SD A0, ret+16(FP)
RET
FLD a+0(FP), F10
FLD b+8(FP), F11
FLTD F10, F11, X10
MOV X10, ret+16(FP)
RET