feat(asm): encode indirect JMP and CALL on all four architectures
Assisted-by: GLM 5.3 Flash
This commit is contained in:
@@ -572,3 +572,42 @@ func leWords(b []byte) []uint32 {
|
||||
}
|
||||
return w
|
||||
}
|
||||
|
||||
// TestArm64IndirectBranch pins the indirect branch forms in a leaf function:
|
||||
// JMP (Rn) lowers to BR Rn, matching the toolchain's spelling, and the raw
|
||||
// BR/BLR mnemonics encode directly (a gasm superset the toolchain's front
|
||||
// end does not accept). CALL (Rn) shares the BLR path and its non-leaf
|
||||
// prologue parity is covered by the ground-truth kernel.
|
||||
func TestArm64IndirectBranch(t *testing.T) {
|
||||
src := `#include "textflag.h"
|
||||
|
||||
TEXT ·f(SB), NOSPLIT, $0-0
|
||||
JMP (R0)
|
||||
BR R5
|
||||
BLR R6
|
||||
RET
|
||||
`
|
||||
f, errs := parser.Parse("test_arm64.s", src)
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("parse: %v", errs)
|
||||
}
|
||||
img, err := AssembleFileARM64(f)
|
||||
if err != nil {
|
||||
t.Fatalf("AssembleFileARM64: %v", err)
|
||||
}
|
||||
want := []uint32{
|
||||
0xd61f0000, // BR R0
|
||||
0xd61f00a0, // BR R5
|
||||
0xd63f00c0, // BLR R6
|
||||
0xd65f03c0, // RET (BR LR)
|
||||
}
|
||||
got := leWords(img.Code)
|
||||
if len(got) != len(want) {
|
||||
t.Fatalf("word count = %d, want %d", len(got), len(want))
|
||||
}
|
||||
for i := range want {
|
||||
if got[i] != want[i] {
|
||||
t.Errorf("word %d = %08x, want %08x", i, got[i], want[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user