aboutsummaryrefslogtreecommitdiffstats
path: root/src/ext_std.py
blob: 11da8aa0373b36d02c93b02e71bd1003c9d8e20d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from asm_ops import *

def expand_add(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_plus", left, right, target]]

def expand_sub(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_minus", left, right, target]]

def expand_addi(left: str, imm: str, target: str) -> ExpandResult:
  return [["ali", "al_plus", left, imm, target]]

def expand_subi(left: str, imm: str, target: str) -> ExpandResult:
  return [["ali", "al_minus", left, imm, target]]

def expand_and(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_and", left, right, target]]

def expand_or(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_or", left, right, target]]

def expand_xor(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_xor", left, right, target]]

def expand_sll(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_sll", left, right, target]]

def expand_slr(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_slr", left, right, target]]

def expand_sar(left: str, right: str, target: str) -> ExpandResult:
  return [["alr", "al_sar", left, right, target]]

def expand_slli(left: str, imm: str, target: str) -> ExpandResult:
  return [["ali", "al_sll", left, imm, target]]

def expand_slri(left: str, imm: str, target: str) -> ExpandResult:
  return [["ali", "al_slr", left, imm, target]]

def expand_sari(left: str, imm: str, target: str) -> ExpandResult:
  return [["ali", "al_sar", left, imm, target]]

def expand_inc(reg: str) -> ExpandResult:
  return [["ali", "al_plus", reg, "1", reg]]

def expand_dec(reg: str) -> ExpandResult:
  return [["ali", "al_minus", reg, "1", reg]]

def expand_mov(from_reg: str, to_reg: str) -> ExpandResult:
  return [["ali", "al_plus", from_reg, "0", to_reg]]

def expand_spu(reg: str) -> ExpandResult:
  return [["str", reg, "__STACK_POINTER"]] + expand_inc("__STACK_POINTER")

def expand_spo(reg: str):
  return expand_dec("__STACK_POINTER") + [["ldr", "__STACK_POINTER", reg]]

def expand_csr(addr_reg: str):
  return [
    ["lpc", "__CSR_SCRATCH"],
    *expand_addi("__CSR_SCRATCH", "4", "__CSR_SCRATCH"),
    *expand_spu("__CSR_SCRATCH"),
    ["jpr", addr_reg]
  ]

def expand_csi(addr_imm: str):
  return [
    ["lpc", "__CSR_SCRATCH"],
    *expand_addi("__CSR_SCRATCH", "4", "__CSR_SCRATCH"),
    *expand_spu("__CSR_SCRATCH"),
    ["jpi", addr_imm]
  ]
def expand_rsr():
  return expand_spo("__CSR_SCRATCH") + [["jpr", "__CSR_SCRATCH"]]

expansions: OpExpansionDict = {
  "add": expand_add,
  "sub": expand_sub,
  "addi": expand_addi,
  "subi": expand_subi,
  "and": expand_and,
  "or": expand_or,
  "xor": expand_xor,
  "sll": expand_sll,
  "slr": expand_slr,
  "sar": expand_sar,
  "slli": expand_slli,
  "slri": expand_slri,
  "sari": expand_sari,
  "inc": expand_inc,
  "dec": expand_dec,
  "mov": expand_mov,
  "spu": expand_spu,
  "spo": expand_spo,
  "csr": expand_csr,
  "csi": expand_csi,
  "rsr": expand_rsr,
}