cmd/internal/obj: add new assembly format for BFPT and BFPF on loong64

On loong64, BFPT and BFPF are mapped to the platform assembly as follows:

   Go asm syntax:
        BFPT   FCCx, offs21
        BFPF   FCCx, offs21
   Equivalent platform assembler syntax:
        bcnez  cj, offs21
        bceqz  cj, offs21

If the condition register is not specified, it defaults to FCC0.

Change-Id: I2cc3df62a9c55d4b5eb124789358983c6737319c
Reviewed-on: https://go-review.googlesource.com/c/go/+/667456
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
This commit is contained in:
Guoqi Chen 2025-04-23 10:30:39 +08:00 committed by abner chenc
parent 06f96a598e
commit fb2c88147d
2 changed files with 13 additions and 6 deletions

View File

@ -7,11 +7,15 @@
TEXT asmtest(SB),DUPOK|NOSPLIT,$0 TEXT asmtest(SB),DUPOK|NOSPLIT,$0
lable1: lable1:
BFPT 1(PC) // 00050048 BFPT 1(PC) // 00050048
BFPT lable1 // BFPT 2 //1ffdff4b BFPT lable1 // BFPT 2 // 1ffdff4b
BFPT FCC0, lable1 // BFPT FCC0, 2 // 1ff9ff4b
BFPT FCC7, lable1 // BFPT FCC7, 2 // fff5ff4b
lable2: lable2:
BFPF 1(PC) // 00040048 BFPF 1(PC) // 00040048
BFPF lable2 // BFPF 4 // 1ffcff4b BFPF lable2 // BFPF 6 // 1ffcff4b
BFPF FCC0, lable2 // BFPF FCC0, 6 // 1ff8ff4b
BFPF FCC7, lable2 // BFPF FCC7, 6 // fff4ff4b
// relocation in play so the assembled offset should be 0 // relocation in play so the assembled offset should be 0
JMP foo(SB) // 00000050 JMP foo(SB) // 00000050

View File

@ -308,7 +308,8 @@ var optab = []Optab{
{ABEQ, C_REG, C_REG, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0}, {ABEQ, C_REG, C_REG, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0},
{ABEQ, C_REG, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0}, {ABEQ, C_REG, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0},
{ABLEZ, C_REG, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0}, {ABLEZ, C_REG, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0},
{ABFPT, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, NOTUSETMP}, {ABFPT, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0},
{ABFPT, C_FCCREG, C_NONE, C_NONE, C_BRAN, C_NONE, 6, 4, 0, 0},
{AJMP, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 11, 4, 0, 0}, // b {AJMP, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 11, 4, 0, 0}, // b
{AJAL, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 11, 4, 0, 0}, // bl {AJAL, C_NONE, C_NONE, C_NONE, C_BRAN, C_NONE, 11, 4, 0, 0}, // bl
@ -1985,7 +1986,9 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
width = 21 width = 21
// FCC0 is the implicit source operand, now that we // FCC0 is the implicit source operand, now that we
// don't register-allocate from the FCC bank. // don't register-allocate from the FCC bank.
if rj == 0 {
rj = REG_FCC0 rj = REG_FCC0
}
case ABEQ, ABNE: case ABEQ, ABNE:
if rd == 0 || rd == REGZERO || rj == REGZERO { if rd == 0 || rd == REGZERO || rj == REGZERO {
// BEQZ/BNEZ can be encoded with 21-bit offsets. // BEQZ/BNEZ can be encoded with 21-bit offsets.