41 lines
1.0 KiB
ArmAsm
41 lines
1.0 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// Differential kernel for the riscv64 wide MOV immediates: the 64-bit
|
|
// constants the toolchain materialises through shifted 32-bit parts or loads
|
|
// from its pooled $i64 data symbols, and the frame-address immediates
|
|
// ($name+off(FP)) lowered to ADDI against the hardware stack pointer.
|
|
|
|
#include "textflag.h"
|
|
|
|
TEXT ·poolload(SB), NOSPLIT, $0-16
|
|
MOV arg+0(FP), X10
|
|
MOV $0x0101010101010101, X16
|
|
MUL X10, X16, X17
|
|
MOV $0x123456789, X18
|
|
ADD X18, X17, X17
|
|
MOV X17, ret+8(FP)
|
|
RET
|
|
|
|
TEXT ·shiftload(SB), NOSPLIT, $0-16
|
|
MOV arg+0(FP), X10
|
|
MOV $0x8000000000000000, X20
|
|
MOV $0x100000000, X21
|
|
ADD X21, X20, X20
|
|
MOV $0x000fffffffffffda, X22
|
|
XOR X22, X20, X20
|
|
ADD X20, X10, X10
|
|
MOV X10, ret+8(FP)
|
|
RET
|
|
|
|
TEXT ·frameaddr(SB), NOSPLIT, $32-16
|
|
MOV $ret+8(FP), X12
|
|
MOV $scratch+0(FP), X13
|
|
ADD X12, X13, X13
|
|
MOV $slot+16(SP), X14
|
|
SUB X14, X13, X13
|
|
MOV X13, ret+8(FP)
|
|
RET
|
|
|
|
GLOBL scratch<>(SB), NOPTR, $8
|