fix(riscv64): compressed store offsets, FENCE and branch range checks
Assisted-by: GLM 5.3
This commit is contained in:
@@ -65,6 +65,47 @@ TEXT ·framed(SB), NOSPLIT, $16-16
|
||||
}
|
||||
}
|
||||
|
||||
// TestRISCVFrameSpadjLargeFrame checks the stack-adjustment boundaries of a
|
||||
// frame past the imm12 range: the prologue materialises the LR-store address
|
||||
// and the SP adjustment through X31 (C.LUI + C.ADD + SD, then C.LUI + ADDIW +
|
||||
// C.ADD), so the SP boundary lands at PC 16, and the RET closes with
|
||||
// C.LDSP plus the same X31 adjustment, 10 bytes. Regression: both helpers
|
||||
// assumed the small-frame prologue and reported 8 and 6.
|
||||
func TestRISCVFrameSpadjLargeFrame(t *testing.T) {
|
||||
f, errs := parser.Parse("bigframe_riscv64.s", `#include "textflag.h"
|
||||
|
||||
TEXT ·big(SB), NOSPLIT, $9000-8
|
||||
MOV a+0(FP), X10
|
||||
RET
|
||||
`)
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("parse: %v", errs)
|
||||
}
|
||||
img, err := AssembleFileRISCV(f)
|
||||
if err != nil {
|
||||
t.Fatalf("AssembleFileRISCV: %v", err)
|
||||
}
|
||||
fn := img.Funcs[0]
|
||||
|
||||
// autosize = 9008. Prologue: C.LUI X31 + C.ADD X31,SP (4) + SD (4) +
|
||||
// C.LUI X31 + ADDIW X31 + C.ADD SP,X31 (8) = 16 bytes to the SP boundary;
|
||||
// C.SDSP X1 (2) follows, so the body starts at 18.
|
||||
wantSpadj := []SpadjStep{{PC: 16, Value: 9008}, {PC: 36, Value: 0}}
|
||||
if len(fn.Spadj) != len(wantSpadj) {
|
||||
t.Fatalf("spadj = %v, want %v", fn.Spadj, wantSpadj)
|
||||
}
|
||||
for i := range wantSpadj {
|
||||
if fn.Spadj[i] != wantSpadj[i] {
|
||||
t.Errorf("spadj[%d] = %v, want %v", i, fn.Spadj[i], wantSpadj[i])
|
||||
}
|
||||
}
|
||||
// The FP load materialises its 9016-byte offset through X31 as well
|
||||
// (8 bytes), then RET's epilogue (C.LDSP + X31 adjust = 10) plus JALR.
|
||||
if fn.Size != 18+8+14 {
|
||||
t.Errorf("size = %d, want %d", fn.Size, 18+8+14)
|
||||
}
|
||||
}
|
||||
|
||||
// TestRISCVRegAliases checks the Go ABI register aliases that the toolchain
|
||||
// defines: LR is the link register (X1) and TMP is the assembler scratch
|
||||
// register (X31/T6).
|
||||
|
||||
Reference in New Issue
Block a user