The arm32 ISA technically has separate floating point and integer flags, but the only useful thing you can do with the floating point flags is to copy them ti the integer flags, so there is not need to model them. The arm64 ISA fixes this and the fcmp instruction writes the integer nzcv flags directly. RISC-V does not have CPU flags.
46 lines
1.1 KiB
Python
46 lines
1.1 KiB
Python
"""
|
|
ARM32 register banks.
|
|
"""
|
|
from __future__ import absolute_import
|
|
from cdsl.registers import RegBank, RegClass
|
|
from .defs import ISA
|
|
|
|
|
|
# Define the larger float bank first to avoid the alignment gap.
|
|
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')
|
|
|
|
# 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')
|
|
|
|
FlagRegs = RegBank(
|
|
'FlagRegs', ISA,
|
|
'Flag registers',
|
|
units=1,
|
|
pressure_tracking=False,
|
|
names=['nzcv'])
|
|
|
|
GPR = RegClass(IntRegs)
|
|
S = RegClass(FloatRegs, count=32)
|
|
D = RegClass(FloatRegs, width=2)
|
|
Q = RegClass(FloatRegs, width=4)
|
|
FLAG = RegClass(FlagRegs)
|
|
|
|
RegClass.extract_names(globals())
|