fix(asm): correct RISC-V frame layout and RVC encodings
Assisted-by: GLM 5.2
This commit is contained in:
+129
-128
@@ -29,7 +29,7 @@ func firstTextRISCV(t *testing.T, src string) *ast.Text {
|
||||
// assembleRISCVHelper assembles one TEXT function and returns its code bytes.
|
||||
func assembleRISCVHelper(t *testing.T, fn *ast.Text) []byte {
|
||||
t.Helper()
|
||||
code, _, _, err := assembleRISCV(fn)
|
||||
code, _, _, _, _, err := assembleRISCV(fn)
|
||||
if err != nil {
|
||||
t.Fatalf("assemble: %v", err)
|
||||
}
|
||||
@@ -65,9 +65,9 @@ TEXT ·arith(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 5 R-type instructions + RET compressed = 5*4 + 2 = 22
|
||||
if len(code) != 22 {
|
||||
t.Errorf("expected 22 bytes, got %d", len(code))
|
||||
// 5 R-type instructions + RET = 5*4 + 4 = 24
|
||||
if len(code) != 24 {
|
||||
t.Errorf("expected 24 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +81,9 @@ TEXT ·mem(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 4 loads/stores (4B each) + C.JR RET (2B) = 18
|
||||
if len(code) != 18 {
|
||||
t.Errorf("expected 18 bytes, got %d", len(code))
|
||||
// 4 loads/stores (4B each) + JALR RET (4B) = 20
|
||||
if len(code) != 20 {
|
||||
t.Errorf("expected 20 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,9 +97,9 @@ TEXT ·imm(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 4 I-type + C.JR = 4*4 + 2 = 18
|
||||
if len(code) != 18 {
|
||||
t.Errorf("expected 18 bytes, got %d", len(code))
|
||||
// 4 I-type + JALR = 4*4 + 4 = 20
|
||||
if len(code) != 20 {
|
||||
t.Errorf("expected 20 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,9 +129,9 @@ TEXT ·small(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// ADDI (4B) + C.JR (2B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d", len(code))
|
||||
// ADDI (4B) + JALR (4B) = 8
|
||||
if len(code) != 8 {
|
||||
t.Errorf("expected 8 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,9 +143,9 @@ TEXT ·large(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// LUI (4B) + ADDIW (4B) + C.JR (2B) = 10
|
||||
if len(code) != 10 {
|
||||
t.Errorf("expected 10 bytes, got %d", len(code))
|
||||
// LUI (4B) + ADDIW (4B) + JALR (4B) = 12
|
||||
if len(code) != 12 {
|
||||
t.Errorf("expected 12 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,9 +157,9 @@ TEXT ·reg(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.MV (2B) + C.JR (2B) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes, got %d (% x)", len(code), code)
|
||||
// C.MV (2B) + JALR (4B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d (% x)", len(code), code)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,9 +172,9 @@ TEXT ·frame(SB), NOSPLIT, $0-8
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.LDSP (2B) + C.SDSP (2B) + C.JR (2B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d", len(code))
|
||||
// C.LDSP (2B) + C.SDSP (2B) + JALR (4B) = 8
|
||||
if len(code) != 8 {
|
||||
t.Errorf("expected 8 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,9 +187,9 @@ TEXT ·rvcstore(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.LDSP (2B) + C.SDSP (2B) + C.JR (2B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d (% x)", len(code), code)
|
||||
// C.LDSP (2B) + C.SDSP (2B) + JALR (4B) = 8
|
||||
if len(code) != 8 {
|
||||
t.Errorf("expected 8 bytes, got %d (% x)", len(code), code)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,9 +202,9 @@ TEXT ·amo(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 3 AMO instructions (4B each) + C.JR (2B) = 14
|
||||
if len(code) != 14 {
|
||||
t.Errorf("expected 14 bytes, got %d", len(code))
|
||||
// 3 AMO instructions (4B each) + JALR (4B) = 16
|
||||
if len(code) != 16 {
|
||||
t.Errorf("expected 16 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,9 +219,9 @@ TEXT ·fpadd(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 5 FP instructions (4B each) + C.JR (2B) = 22
|
||||
if len(code) != 22 {
|
||||
t.Errorf("expected 22 bytes, got %d (%d)", len(code), len(code))
|
||||
// 5 FP instructions (4B each) + JALR (4B) = 24
|
||||
if len(code) != 24 {
|
||||
t.Errorf("expected 24 bytes, got %d (%d)", len(code), len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,9 +234,9 @@ TEXT ·csrtest(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 3 CSR instructions (4B each) + C.JR (2B) = 14
|
||||
if len(code) != 14 {
|
||||
t.Errorf("expected 14 bytes, got %d", len(code))
|
||||
// 3 CSR instructions (4B each) + JALR (4B) = 16
|
||||
if len(code) != 16 {
|
||||
t.Errorf("expected 16 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,9 +250,9 @@ TEXT ·fmatest(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 4 FMA instructions (4B each) + C.JR (2B) = 18
|
||||
if len(code) != 18 {
|
||||
t.Errorf("expected 18 bytes, got %d", len(code))
|
||||
// 4 FMA instructions (4B each) + JALR (4B) = 20
|
||||
if len(code) != 20 {
|
||||
t.Errorf("expected 20 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,9 +266,9 @@ TEXT ·cvt(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 4 conversion instructions (4B each) + C.JR (2B) = 18
|
||||
if len(code) != 18 {
|
||||
t.Errorf("expected 18 bytes, got %d", len(code))
|
||||
// 4 conversion instructions (4B each) + JALR (4B) = 20
|
||||
if len(code) != 20 {
|
||||
t.Errorf("expected 20 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -281,9 +281,9 @@ TEXT ·cmp(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 3 FP compare (4B each) + C.JR (2B) = 14
|
||||
if len(code) != 14 {
|
||||
t.Errorf("expected 14 bytes, got %d", len(code))
|
||||
// 3 FP compare (4B each) + JALR (4B) = 16
|
||||
if len(code) != 16 {
|
||||
t.Errorf("expected 16 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -312,9 +312,9 @@ TEXT ·caddi(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.ADDI (2B) + C.JR (2B) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes, got %d", len(code))
|
||||
// C.ADDI (2B) + JALR (4B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,9 +326,9 @@ TEXT ·cli(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.LI (2B) + C.JR (2B) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes, got %d", len(code))
|
||||
// C.LI (2B) + JALR (4B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,9 +340,9 @@ TEXT ·clui(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.LUI (2B) + C.JR (2B) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes, got %d", len(code))
|
||||
// C.LUI (2B) + JALR (4B) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,13 +368,13 @@ TEXT ·sub(SB), NOSPLIT, $0
|
||||
if len(img.Funcs) != 2 {
|
||||
t.Fatalf("expected 2 functions, got %d", len(img.Funcs))
|
||||
}
|
||||
// func add: C.LDSP(2) + C.JR(2) = 4
|
||||
if img.Funcs[0].Size != 4 {
|
||||
t.Errorf("add: expected 4 bytes, got %d", img.Funcs[0].Size)
|
||||
// func add: C.LDSP(2) + JALR(4) = 6
|
||||
if img.Funcs[0].Size != 6 {
|
||||
t.Errorf("add: expected 6 bytes, got %d", img.Funcs[0].Size)
|
||||
}
|
||||
// func sub: SUB(4) + C.JR(2) = 6
|
||||
if img.Funcs[1].Size != 6 {
|
||||
t.Errorf("sub: expected 6 bytes, got %d", img.Funcs[1].Size)
|
||||
// func sub: SUB(4) + JALR(4) = 8
|
||||
if img.Funcs[1].Size != 8 {
|
||||
t.Errorf("sub: expected 8 bytes, got %d", img.Funcs[1].Size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,34 +384,34 @@ func TestRISCV_encodings(t *testing.T) {
|
||||
name, src string
|
||||
wantBytes int
|
||||
}{
|
||||
{"ADD", "ADD X10, X11, X12\nRET\n", 6},
|
||||
{"SUBW", "SUBW X10, X11, X12\nRET\n", 6},
|
||||
{"MUL", "MUL X10, X11, X12\nRET\n", 6},
|
||||
{"DIVW", "DIVW X10, X11, X12\nRET\n", 6},
|
||||
{"REMUW", "REMUW X10, X11, X12\nRET\n", 6},
|
||||
{"ADDIW", "ADDIW X10, $5, X11\nRET\n", 6},
|
||||
{"SLLI", "SLLI X10, $3, X11\nRET\n", 6}, // ADDI+SLLI? No, SLLI uses I-type
|
||||
{"SRLI", "SRLI X10, $2, X11\nRET\n", 6},
|
||||
{"SRAI", "SRAI X10, $1, X11\nRET\n", 6},
|
||||
{"LB", "LB (X10), X11\nRET\n", 6},
|
||||
{"LBU", "LBU (X10), X11\nRET\n", 6},
|
||||
{"LH", "LH (X10), X11\nRET\n", 6},
|
||||
{"LHU", "LHU (X10), X11\nRET\n", 6},
|
||||
{"LWU", "LWU (X10), X11\nRET\n", 6},
|
||||
{"SB", "SB X10, (X11)\nRET\n", 6},
|
||||
{"SH", "SH X10, (X11)\nRET\n", 6},
|
||||
{"SW", "SW X10, (X11)\nRET\n", 6},
|
||||
{"LUI", "LUI X10, $0x12345\nRET\n", 6},
|
||||
{"AUIPC", "AUIPC X10, $0\nRET\n", 6},
|
||||
{"FLW", "FLW (X10), F10\nRET\n", 6},
|
||||
{"FSW", "FSW F10, (X11)\nRET\n", 6},
|
||||
{"FADDS", "FADDS F10, F11, F12\nRET\n", 6},
|
||||
{"FMINS", "FMINS F10, F11, F12\nRET\n", 6},
|
||||
{"FMAXD", "FMAXD F10, F11, F12\nRET\n", 6},
|
||||
{"FCVTSD", "FCVTSD F10, F11\nRET\n", 6},
|
||||
{"FCVTDS", "FCVTDS F10, F11\nRET\n", 6},
|
||||
{"FMVXW", "FMVXW F10, X10\nRET\n", 6},
|
||||
{"FMADD_S", "FMADDS F10, F11, F12, F13\nRET\n", 6},
|
||||
{"ADD", "ADD X10, X11, X12\nRET\n", 8},
|
||||
{"SUBW", "SUBW X10, X11, X12\nRET\n", 8},
|
||||
{"MUL", "MUL X10, X11, X12\nRET\n", 8},
|
||||
{"DIVW", "DIVW X10, X11, X12\nRET\n", 8},
|
||||
{"REMUW", "REMUW X10, X11, X12\nRET\n", 8},
|
||||
{"ADDIW", "ADDIW X10, $5, X11\nRET\n", 8},
|
||||
{"SLLI", "SLLI X10, $3, X11\nRET\n", 8}, // ADDI+SLLI? No, SLLI uses I-type
|
||||
{"SRLI", "SRLI X10, $2, X11\nRET\n", 8},
|
||||
{"SRAI", "SRAI X10, $1, X11\nRET\n", 8},
|
||||
{"LB", "LB (X10), X11\nRET\n", 8},
|
||||
{"LBU", "LBU (X10), X11\nRET\n", 8},
|
||||
{"LH", "LH (X10), X11\nRET\n", 8},
|
||||
{"LHU", "LHU (X10), X11\nRET\n", 8},
|
||||
{"LWU", "LWU (X10), X11\nRET\n", 8},
|
||||
{"SB", "SB X10, (X11)\nRET\n", 8},
|
||||
{"SH", "SH X10, (X11)\nRET\n", 8},
|
||||
{"SW", "SW X10, (X11)\nRET\n", 8},
|
||||
{"LUI", "LUI X10, $0x12345\nRET\n", 8},
|
||||
{"AUIPC", "AUIPC X10, $0\nRET\n", 8},
|
||||
{"FLW", "FLW (X10), F10\nRET\n", 8},
|
||||
{"FSW", "FSW F10, (X11)\nRET\n", 8},
|
||||
{"FADDS", "FADDS F10, F11, F12\nRET\n", 8},
|
||||
{"FMINS", "FMINS F10, F11, F12\nRET\n", 8},
|
||||
{"FMAXD", "FMAXD F10, F11, F12\nRET\n", 8},
|
||||
{"FCVTSD", "FCVTSD F10, F11\nRET\n", 8},
|
||||
{"FCVTDS", "FCVTDS F10, F11\nRET\n", 8},
|
||||
{"FMVXW", "FMVXW F10, X10\nRET\n", 8},
|
||||
{"FMADD_S", "FMADDS F10, F11, F12, F13\nRET\n", 8},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -438,9 +438,9 @@ done:
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.ADDI(2) + C.BEQZ(2) + C.ADDI(2) + C.JR(2) = 8 (all compress)
|
||||
if len(code) != 8 {
|
||||
t.Errorf("expected 8 bytes with C.BEQZ, got %d", len(code))
|
||||
// C.ADDI(2) + C.BEQZ(2) + C.ADDI(2) + JALR(4) = 10 (all compress)
|
||||
if len(code) != 10 {
|
||||
t.Errorf("expected 10 bytes with C.BEQZ, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,9 +453,9 @@ func TestRISCV_RVC_CJ(t *testing.T) {
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.J(2) + C.JR(2) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.J, got %d", len(code))
|
||||
// C.J(2) + JALR(4) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.J, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -467,9 +467,9 @@ func TestRISCV_RVC_CADD(t *testing.T) {
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.ADD(2) + C.JR(2) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.ADD, got %d", len(code))
|
||||
// C.ADD(2) + JALR(4) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.ADD, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -481,9 +481,9 @@ func TestRISCV_RVC_CADD_commute(t *testing.T) {
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.ADD(2) + C.JR(2) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.ADD (commuted), got %d", len(code))
|
||||
// C.ADD(2) + JALR(4) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.ADD (commuted), got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,8 +508,8 @@ TEXT ·csub2(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code2 := assembleRISCVHelper(t, fn2)
|
||||
if len(code2) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.SUB, got %d (% x)", len(code2), code2)
|
||||
if len(code2) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.SUB, got %d (% x)", len(code2), code2)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,8 +520,8 @@ TEXT ·cxor(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.XOR, got %d", len(code))
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.XOR, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -532,8 +532,8 @@ TEXT ·cor(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.OR, got %d", len(code))
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.OR, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -544,8 +544,8 @@ TEXT ·cand(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.AND, got %d", len(code))
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.AND, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,9 +556,9 @@ TEXT ·cfldsp(SB), NOSPLIT, $0-8
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.FLDSP(2) + C.JR(2) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.FLDSP, got %d", len(code))
|
||||
// C.FLDSP(2) + JALR(4) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.FLDSP, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -569,9 +569,9 @@ TEXT ·cfsdsp(SB), NOSPLIT, $0-8
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// C.FSDSP(2) + C.JR(2) = 4
|
||||
if len(code) != 4 {
|
||||
t.Errorf("expected 4 bytes with C.FSDSP, got %d", len(code))
|
||||
// C.FSDSP(2) + JALR(4) = 6
|
||||
if len(code) != 6 {
|
||||
t.Errorf("expected 6 bytes with C.FSDSP, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,9 +592,9 @@ DATA answer<>+0(SB)/8, $42
|
||||
if err != nil {
|
||||
t.Fatalf("AssembleFileRISCV: %v", err)
|
||||
}
|
||||
// AUIPC(4) + ADDI(4) + C.JR(2) = 10
|
||||
if img.Funcs[0].Size != 10 {
|
||||
t.Errorf("expected 10 bytes, got %d", img.Funcs[0].Size)
|
||||
// AUIPC(4) + ADDI(4) + JALR(4) = 12
|
||||
if img.Funcs[0].Size != 12 {
|
||||
t.Errorf("expected 12 bytes, got %d", img.Funcs[0].Size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -614,9 +614,9 @@ GLOBL result<>(SB), NOPTR, $8
|
||||
if err != nil {
|
||||
t.Fatalf("AssembleFileRISCV: %v", err)
|
||||
}
|
||||
// AUIPC X31(4) + SD X10,0(X31)(4) + C.JR(2) = 10
|
||||
if img.Funcs[0].Size != 10 {
|
||||
t.Errorf("expected 10 bytes, got %d", img.Funcs[0].Size)
|
||||
// AUIPC X31(4) + SD X10,0(X31)(4) + JALR(4) = 12
|
||||
if img.Funcs[0].Size != 12 {
|
||||
t.Errorf("expected 12 bytes, got %d", img.Funcs[0].Size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -696,9 +696,9 @@ DATA answer<>+0(SB)/8, $42
|
||||
if err != nil {
|
||||
t.Fatalf("AssembleFileRISCV: %v", err)
|
||||
}
|
||||
// AUIPC(4) + LD(4) + C.JR(2) = 10
|
||||
if img.Funcs[0].Size != 10 {
|
||||
t.Errorf("expected 10 bytes, got %d", img.Funcs[0].Size)
|
||||
// AUIPC(4) + LD(4) + JALR(4) = 12
|
||||
if img.Funcs[0].Size != 12 {
|
||||
t.Errorf("expected 12 bytes, got %d", img.Funcs[0].Size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -712,9 +712,9 @@ TEXT ·sys(SB), NOSPLIT, $0
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// 3 system instructions × 4 bytes + C.JR(2) = 14
|
||||
if len(code) != 14 {
|
||||
t.Errorf("expected 14 bytes, got %d (% x)", len(code), code)
|
||||
// 3 system instructions × 4 bytes + JALR(4) = 16
|
||||
if len(code) != 16 {
|
||||
t.Errorf("expected 16 bytes, got %d (% x)", len(code), code)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -725,7 +725,7 @@ TEXT ·badfp(SB), NOSPLIT, $0
|
||||
MOV $arg(FP), X10
|
||||
RET
|
||||
`)
|
||||
_, _, _, err := assembleRISCV(fn)
|
||||
_, _, _, _, _, err := assembleRISCV(fn)
|
||||
if err == nil {
|
||||
t.Error("expected error for MOV $arg(FP), got nil")
|
||||
}
|
||||
@@ -742,8 +742,9 @@ sub:
|
||||
RET
|
||||
`)
|
||||
code := assembleRISCVHelper(t, fn)
|
||||
// CALL(8) + C.JR(2) + C.JR(2) = 12
|
||||
if len(code) != 12 {
|
||||
t.Errorf("expected 12 bytes with CALL, got %d", len(code))
|
||||
// A zero-frame non-leaf function saves LR: prologue (8) + CALL (8) +
|
||||
// two framed RETs (8 each) = 32.
|
||||
if len(code) != 32 {
|
||||
t.Errorf("expected 32 bytes with CALL, got %d", len(code))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user