feat(asm): add LoongArch encoder with ELF and GOOBJ emission
Assisted-by: DeepSeek V4 Pro
This commit is contained in:
Vendored
+54
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
// add returns a + b.
|
||||
TEXT ·add(SB), NOSPLIT, $0-24
|
||||
MOVV a+0(FP), R4
|
||||
MOVV b+8(FP), R5
|
||||
ADDV R5, R4, R4
|
||||
MOVV R4, ret+16(FP)
|
||||
RET
|
||||
|
||||
// arith exercises the 3R integer and FP set.
|
||||
TEXT ·arith(SB), NOSPLIT, $0-0
|
||||
ADDV R4, R5, R6
|
||||
SUBV R7, R8, R9
|
||||
MULV R10, R11, R12
|
||||
DIVV R13, R14, R15
|
||||
AND R16, R17, R18
|
||||
OR R18, R19, R20
|
||||
XOR R20, R21, R2
|
||||
SLLV R2, R23, R24
|
||||
SRLV R24, R25, R26
|
||||
SRAV R26, R27, R28
|
||||
RET
|
||||
|
||||
// imm exercises the immediate forms.
|
||||
TEXT ·imm(SB), NOSPLIT, $0-0
|
||||
ADDV $42, R4, R5
|
||||
ADDV $-8, R6
|
||||
AND $0xff, R7, R8
|
||||
OR $1, R9, R10
|
||||
XOR $0, R11, R12
|
||||
SGT $100, R13, R14
|
||||
SLLV $4, R15, R16
|
||||
MOVV $0x12345, R17
|
||||
RET
|
||||
|
||||
// branch exercises conditional and unconditional control flow.
|
||||
TEXT ·branch(SB), NOSPLIT, $0-0
|
||||
BEQ R4, R5, done
|
||||
BNE R6, R7, skip
|
||||
BLT R8, R9, done
|
||||
BGE R10, R11, done
|
||||
BLTU R12, R13, done
|
||||
BGEU R14, R15, done
|
||||
skip:
|
||||
JMP loop
|
||||
loop:
|
||||
JAL skip
|
||||
RET
|
||||
done:
|
||||
RET
|
||||
Vendored
+143
@@ -0,0 +1,143 @@
|
||||
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
// fp exercises the floating-point set: 3R arithmetic, 2R unary, compares
|
||||
// into FCC, fused multiply-add and the register moves.
|
||||
TEXT ·fp(SB), NOSPLIT, $0-0
|
||||
ADDD F4, F5, F6
|
||||
SUBD F7, F8, F9
|
||||
MULD F9, F10, F11
|
||||
DIVD F11, F12, F13
|
||||
MULF F13, F14, F15
|
||||
ADDF F15, F16, F17
|
||||
SQRTD F17, F18
|
||||
SQRTF F18, F19
|
||||
ABSD F19, F20
|
||||
NEGD F20, F21
|
||||
MOVD F21, F22
|
||||
CMPEQD F22, F23, FCC0
|
||||
CMPGTF F23, F24, FCC1
|
||||
CMPGED F24, F25, FCC2
|
||||
FMADDD F0, F1, F2, F3
|
||||
FMSUBF F3, F4, F5, F6
|
||||
FNMADDD F6, F7, F8, F9
|
||||
FNMSUBF F9, F10, F11, F12
|
||||
FMAXD F12, F13, F14
|
||||
FMINF F14, F15, F16
|
||||
FMAXAD F16, F17, F18
|
||||
FMINAF F18, F19, F20
|
||||
FSCALEBF F20, F21, F22
|
||||
FCOPYSGD F22, F23, F24
|
||||
MOVV F25, R25
|
||||
MOVV R26, F27
|
||||
MOVW R28, F29
|
||||
MOVW F30, R31
|
||||
RET
|
||||
|
||||
// mov forms: register moves, immediates (12/32/64-bit), memory with FP/SP
|
||||
// pseudo-registers and the register-indexed forms.
|
||||
TEXT ·mov(SB), NOSPLIT, $0-16
|
||||
MOVV R4, R5
|
||||
MOVW R6, R7
|
||||
MOVB R8, R9
|
||||
MOVBU R10, R11
|
||||
MOVHU R12, R13
|
||||
MOVWU R14, R15
|
||||
MOVV $42, R16
|
||||
MOVV $0x12345, R17
|
||||
MOVV $0x100000, R18
|
||||
MOVW $-100, R19
|
||||
MOVV $0x123456789, R20
|
||||
MOVV a+0(FP), R21
|
||||
MOVV R23, b+8(FP)
|
||||
MOVW c+16(FP), R24
|
||||
MOVV (R24)(R25), R26
|
||||
MOVV R27, (R28)(R29)
|
||||
RET
|
||||
|
||||
// frame exercises the prologue/epilogue of a function with a real frame.
|
||||
TEXT ·frame(SB), NOSPLIT, $32-8
|
||||
MOVV R4, R5
|
||||
MOVV arg+0(FP), R6
|
||||
MOVV R7, local-8(SP)
|
||||
MOVV local-8(SP), R8
|
||||
MOVV R9, ret+0(FP)
|
||||
RET
|
||||
|
||||
// branches21 exercises the single-register and zero-register branch forms
|
||||
// with 21-bit offsets.
|
||||
TEXT ·branches21(SB), NOSPLIT, $0-0
|
||||
BEQ R0, R4, l1
|
||||
BEQ R5, R0, l2
|
||||
BNE R0, R6, l3
|
||||
BNE R7, R0, l4
|
||||
BLTZ R8, l5
|
||||
BGEZ R9, l6
|
||||
BLEZ R10, l7
|
||||
BGTZ R11, l8
|
||||
JMP l9
|
||||
l1:
|
||||
JMP l10
|
||||
l2:
|
||||
JMP l11
|
||||
l3:
|
||||
JMP l12
|
||||
l4:
|
||||
JMP l13
|
||||
l5:
|
||||
JMP l14
|
||||
l6:
|
||||
JMP l15
|
||||
l7:
|
||||
JMP l16
|
||||
l8:
|
||||
JMP l16
|
||||
l9:
|
||||
MOVV R1, R2
|
||||
l10:
|
||||
LL (R12), R13
|
||||
LLV (R14), R15
|
||||
SC R16, (R17)
|
||||
SCV R18, (R19)
|
||||
RDTIMED R20, R21
|
||||
SYSCALL
|
||||
DBAR
|
||||
RET
|
||||
l11:
|
||||
JAL (R30)
|
||||
RET
|
||||
l12:
|
||||
BSTRINSV $7, R4, $0, R5
|
||||
BSTRPICKV $63, R6, $32, R7
|
||||
ALSLV $2, R8, R9, R10
|
||||
ADDV16 $65536, R11, R12
|
||||
RET
|
||||
l13:
|
||||
MOVV $0xffffffffffffffff, R13
|
||||
RET
|
||||
l14:
|
||||
CPUCFG R14, R14
|
||||
RET
|
||||
l15:
|
||||
NOR R15, R16, R17
|
||||
ORN R18, R19, R20
|
||||
ANDN R21, R24, R25
|
||||
RET
|
||||
l16:
|
||||
MOVB R26, (R27)
|
||||
MOVB (R28), R29
|
||||
RET
|
||||
|
||||
// sbdata loads and stores a static symbol with relocations (the relocation
|
||||
// fields are masked before comparison).
|
||||
GLOBL ·table(SB), RODATA, $16
|
||||
DATA ·table+0(SB)/8, $0x1122334455667788
|
||||
DATA ·table+8(SB)/8, $0x8877665544332211
|
||||
|
||||
TEXT ·sbdata(SB), NOSPLIT, $0-0
|
||||
MOVV $·table(SB), R4
|
||||
MOVV ·table(SB), R5
|
||||
MOVV R6, ·table+8(SB)
|
||||
RET
|
||||
Reference in New Issue
Block a user