64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package arm
|
|
|
|
import "git.urbach.dev/cli/q/src/cpu"
|
|
|
|
const (
|
|
X0 cpu.Register = iota // Function arguments and return values [0-7]
|
|
X1
|
|
X2
|
|
X3
|
|
X4
|
|
X5
|
|
X6
|
|
X7
|
|
X8 // Indirect result location register (used to pass a pointer to a structure return value)
|
|
X9 // Temporary registers (caller-saved, used for general computation) [9-15]
|
|
X10
|
|
X11
|
|
X12
|
|
X13
|
|
X14
|
|
X15
|
|
X16 // Intra-procedure call scratch registers [16-17]
|
|
X17
|
|
X18 // Platform register (reserved by the platform ABI for thread-local storage)
|
|
X19 // Callee-saved registers (must be preserved across function calls) [19-28]
|
|
X20
|
|
X21
|
|
X22
|
|
X23
|
|
X24
|
|
X25
|
|
X26
|
|
X27
|
|
X28
|
|
FP // Frame pointer
|
|
LR // Link register
|
|
SP // Stack pointer
|
|
)
|
|
|
|
const (
|
|
ZR = SP // Zero register uses the same numerical value as SP
|
|
TMP = X27 // Temporary register for the assembler
|
|
TMP2 = X28 // Temporary register for the assembler
|
|
)
|
|
|
|
var (
|
|
GeneralRegisters = []cpu.Register{X9, X10, X11, X12, X13, X14, X15, X16, X17, X19, X20, X21, X22, X23, X24, X25, X26}
|
|
InputRegisters = []cpu.Register{X0, X1, X2, X3, X4, X5}
|
|
OutputRegisters = InputRegisters
|
|
SyscallInputRegisters = []cpu.Register{X8, X0, X1, X2, X3, X4, X5}
|
|
SyscallOutputRegisters = []cpu.Register{X0, X1}
|
|
WindowsInputRegisters = []cpu.Register{X0, X1, X2, X3, X4, X5, X6, X7}
|
|
WindowsOutputRegisters = []cpu.Register{X0, X1}
|
|
|
|
CPU = cpu.CPU{
|
|
General: GeneralRegisters,
|
|
Input: InputRegisters,
|
|
Output: OutputRegisters,
|
|
SyscallInput: SyscallInputRegisters,
|
|
SyscallOutput: SyscallOutputRegisters,
|
|
NumRegisters: 32,
|
|
}
|
|
)
|