r500/regs/assembler/vs/keywords.py

105 lines
3.0 KiB
Python

from dataclasses import dataclass
from typing import Optional
from enum import Enum, auto
from assembler.vs import opcodes
operations = [
opcodes.VECTOR_NO_OP,
opcodes.VE_DOT_PRODUCT,
opcodes.VE_MULTIPLY,
opcodes.VE_ADD,
opcodes.VE_MULTIPLY_ADD,
opcodes.VE_DISTANCE_VECTOR,
opcodes.VE_FRACTION,
opcodes.VE_MAXIMUM,
opcodes.VE_MINIMUM,
opcodes.VE_SET_GREATER_THAN_EQUAL,
opcodes.VE_SET_LESS_THAN,
opcodes.VE_MULTIPLYX2_ADD,
opcodes.VE_MULTIPLY_CLAMP,
opcodes.VE_FLT2FIX_DX,
opcodes.VE_FLT2FIX_DX_RND,
opcodes.VE_PRED_SET_EQ_PUSH,
opcodes.VE_PRED_SET_GT_PUSH,
opcodes.VE_PRED_SET_GTE_PUSH,
opcodes.VE_PRED_SET_NEQ_PUSH,
opcodes.VE_COND_WRITE_EQ,
opcodes.VE_COND_WRITE_GT,
opcodes.VE_COND_WRITE_GTE,
opcodes.VE_COND_WRITE_NEQ,
opcodes.VE_COND_MUX_EQ,
opcodes.VE_COND_MUX_GT,
opcodes.VE_COND_MUX_GTE,
opcodes.VE_SET_GREATER_THAN,
opcodes.VE_SET_EQUAL,
opcodes.VE_SET_NOT_EQUAL,
opcodes.MATH_NO_OP,
opcodes.ME_EXP_BASE2_DX,
opcodes.ME_LOG_BASE2_DX,
opcodes.ME_EXP_BASEE_FF,
opcodes.ME_LIGHT_COEFF_DX,
opcodes.ME_POWER_FUNC_FF,
opcodes.ME_RECIP_DX,
opcodes.ME_RECIP_FF,
opcodes.ME_RECIP_SQRT_DX,
opcodes.ME_RECIP_SQRT_FF,
opcodes.ME_MULTIPLY,
opcodes.ME_EXP_BASE2_FULL_DX,
opcodes.ME_LOG_BASE2_FULL_DX,
opcodes.ME_POWER_FUNC_FF_CLAMP_B,
opcodes.ME_POWER_FUNC_FF_CLAMP_B1,
opcodes.ME_POWER_FUNC_FF_CLAMP_01,
opcodes.ME_SIN,
opcodes.ME_COS,
opcodes.ME_LOG_BASE2_IEEE,
opcodes.ME_RECIP_IEEE,
opcodes.ME_RECIP_SQRT_IEEE,
opcodes.ME_PRED_SET_EQ,
opcodes.ME_PRED_SET_GT,
opcodes.ME_PRED_SET_GTE,
opcodes.ME_PRED_SET_NEQ,
opcodes.ME_PRED_SET_CLR,
opcodes.ME_PRED_SET_INV,
opcodes.ME_PRED_SET_POP,
opcodes.ME_PRED_SET_RESTORE,
]
class KW(Enum):
temporary = auto()
a0 = auto()
out = auto()
out_repl_x = auto()
alt_temporary = auto()
input = auto()
absolute = auto()
relative_a0 = auto()
relative_i0 = auto()
constant = auto()
saturation = auto()
keywords = [
(KW.temporary , b"temporary" , b"temp"),
(KW.a0 , b"a0" , None),
(KW.out , b"out" , None),
(KW.out_repl_x , b"out_repl_x" , None),
(KW.alt_temporary , b"alt_temporary" , b"alt_temp"),
(KW.input , b"input" , None),
(KW.absolute , b"absolute" , None),
(KW.relative_a0 , b"relative_a0" , None),
(KW.relative_i0 , b"relative_i0" , None),
(KW.constant , b"constant" , b"const"),
(KW.saturation , b"saturation" , b"sat"),
]
def find_keyword(b: memoryview):
b = bytes(b)
for op in operations:
if op.name == b.upper() or (op.synonym is not None and op.synonym == b.upper()):
return op
for keyword, name, synonym in keywords:
if name == b.lower() or (synonym is not None and synonym == b.lower()):
return keyword
return None