Define register banks.
Add a RegBank class for describing CPU register banks. Define register banks for all the ISA stubs. The ARM32 floating point bank in particular requires attention.
This commit is contained in:
29
lib/cretonne/meta/isa/arm32/registers.py
Normal file
29
lib/cretonne/meta/isa/arm32/registers.py
Normal file
@@ -0,0 +1,29 @@
|
||||
"""
|
||||
ARM32 register banks.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from cdsl.registers import RegBank
|
||||
from .defs import ISA
|
||||
|
||||
|
||||
# Special register units:
|
||||
# - r15 is the program counter.
|
||||
# - r14 is the link register.
|
||||
# - r13 is usually the stack pointer.
|
||||
IntRegs = RegBank(
|
||||
'IntRegs', ISA,
|
||||
'General purpose registers',
|
||||
units=16, prefix='r')
|
||||
|
||||
FloatRegs = RegBank(
|
||||
'FloatRegs', ISA, r"""
|
||||
Floating point registers.
|
||||
|
||||
The floating point register units correspond to the S-registers, but
|
||||
extended as if there were 64 registers.
|
||||
|
||||
- S registers are one unit each.
|
||||
- D registers are two units each, even D16 and above.
|
||||
- Q registers are 4 units each.
|
||||
""",
|
||||
units=64, prefix='s')
|
||||
19
lib/cretonne/meta/isa/arm64/registers.py
Normal file
19
lib/cretonne/meta/isa/arm64/registers.py
Normal file
@@ -0,0 +1,19 @@
|
||||
"""
|
||||
Aarch64 register banks.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from cdsl.registers import RegBank
|
||||
from .defs import ISA
|
||||
|
||||
|
||||
# The `x31` regunit serves as the stack pointer / zero register depending on
|
||||
# context. We reserve it and don't model the difference.
|
||||
IntRegs = RegBank(
|
||||
'IntRegs', ISA,
|
||||
'General purpose registers',
|
||||
units=32, prefix='x')
|
||||
|
||||
FloatRegs = RegBank(
|
||||
'FloatRegs', ISA,
|
||||
'Floating point registers',
|
||||
units=32, prefix='v')
|
||||
39
lib/cretonne/meta/isa/intel/registers.py
Normal file
39
lib/cretonne/meta/isa/intel/registers.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
Intel register banks.
|
||||
|
||||
While the floating-point registers are straight-forward, the general purpose
|
||||
register bank has a few quirks on Intel architectures. We have these encodings
|
||||
of the 8-bit registers:
|
||||
|
||||
I32 I64 | 16b 32b 64b
|
||||
000 AL AL | AX EAX RAX
|
||||
001 CL CL | CX ECX RCX
|
||||
010 DL DL | DX EDX RDX
|
||||
011 BL BL | BX EBX RBX
|
||||
100 AH SPL | SP ESP RSP
|
||||
101 CH BPL | BP EBP RBP
|
||||
110 DH SIL | SI ESI RSI
|
||||
111 BH DIL | DI EDI RDI
|
||||
|
||||
Here, the I64 column refers to the registers you get with a REX prefix. Without
|
||||
the REX prefix, you get the I32 registers.
|
||||
|
||||
The 8-bit registers are not that useful since WebAssembly only has i32 and i64
|
||||
data types, and the H-registers even less so. Rather than trying to model the
|
||||
H-registers accurately, we'll avoid using them in both I32 and I64 modes.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from cdsl.registers import RegBank
|
||||
from .defs import ISA
|
||||
|
||||
|
||||
IntRegs = RegBank(
|
||||
'IntRegs', ISA,
|
||||
'General purpose registers',
|
||||
units=16, prefix='r',
|
||||
names='rax rcx rdx rbx rsp rbp rsi rdi'.split())
|
||||
|
||||
FloatRegs = RegBank(
|
||||
'FloatRegs', ISA,
|
||||
'SSE floating point registers',
|
||||
units=16, prefix='xmm')
|
||||
18
lib/cretonne/meta/isa/riscv/registers.py
Normal file
18
lib/cretonne/meta/isa/riscv/registers.py
Normal file
@@ -0,0 +1,18 @@
|
||||
"""
|
||||
RISC-V register banks.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from cdsl.registers import RegBank
|
||||
from .defs import ISA
|
||||
|
||||
|
||||
# We include `x0`, a.k.a `zero` in the register bank. It will be reserved.
|
||||
IntRegs = RegBank(
|
||||
'IntRegs', ISA,
|
||||
'General purpose registers',
|
||||
units=32, prefix='x')
|
||||
|
||||
FloatRegs = RegBank(
|
||||
'FloatRegs', ISA,
|
||||
'Floating point registers',
|
||||
units=32, prefix='f')
|
||||
Reference in New Issue
Block a user