summaryrefslogtreecommitdiff
path: root/mips/hgen/herdtools_ast_to_shallow_ast.hgen
blob: 7b1a58d91f580846238bc7ca6059467c7934d64f (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
| `MIPSThreadStart ->
    SYSCALL_THREAD_START

| `MIPSStopFetching ->
    ImplementationDefinedStopFetching0

(* Note different argument order, which reflects difference
   between instruction encoding and asm format  *)
| `MIPSRType (op, rd, rs, rt) ->
    (translate_rtype_op op)
      (
      translate_reg "rs" rs,
      translate_reg "rt" rt,
      translate_reg "rd" rd
       )
      

(* Note different argument order similar to above *)
| `MIPSIType (op, rt, rs, imm) ->
    (translate_itype_op op)
      (
      translate_reg "rs" rs,
      translate_reg "rt" rt,
      translate_imm16 "imm" imm
       )
      

| `MIPSShiftI (op, rd, rt, sa) ->
    (translate_shifti_op op)
      (
      translate_reg "rt" rt,
      translate_reg "rd" rd,
      translate_imm5 "sa" sa
       )
      

| `MIPSShiftV (op, rd, rt, rs) ->
    (translate_shiftv_op op)
      (
      translate_reg "rs" rs,
      translate_reg "rt" rt,
      translate_reg "rd" rd
      )
      

| `MIPSMulDiv (op, rs, rt) ->
    (translate_muldiv_op op)
      (
      translate_reg "rs" rs,
      translate_reg "rt" rt
      )
      

| `MIPSMFHiLo (op, rs) ->
    (translate_mfhilo_op op)
      (
      translate_reg "rs" rs
      )
      
| `MIPSLUI (rt, imm) ->
  LUI
      (
      translate_reg "rt" rt,
      translate_imm16 "imm" imm
      )
      
| `MIPSLoad (width, signed, linked, base, rt, offset) ->
  Load
      (
      translate_wordsize "width" width,
      translate_bool "signed" signed,
      translate_bool "linked" linked,
      translate_reg "base" base,
      translate_reg "rt" rt,
      translate_imm16 "offset" offset
      )
      
| `MIPSStore (width, conditional, base, rt, offset) ->
  Store
      (
      translate_wordsize "width" width,
      translate_bool "conditional" conditional,
      translate_reg "base" base,
      translate_reg "rt" rt,
      translate_imm16 "offset" offset
      )
      
| `MIPSLSLR (store, double, left, base, rt, offset) ->
  (translate_lslr_op store double left)
      (
      translate_reg "base" base,
      translate_reg "rt" rt,
      translate_imm16 "offset" offset
      )
      
| `MIPSSYNC -> SYNC
| `MIPSBEQ (rs, rt, offset, ne, likely) ->
  BEQ
  (translate_reg "rs" rs,
   translate_reg "rt" rt,
   translate_imm16 "offset" offset,
   translate_bool "ne" ne,
   translate_bool "likely" likely
   ) 

| `MIPSBCMPZ (rs, offset, cmp, link, likely) ->
  BCMPZ
  (translate_reg "rs" rs,
   translate_imm16 "offset" offset,
   translate_cmp "cmp" cmp,
   translate_bool "link" link,
   translate_bool "likely" likely
   ) 
| `MIPSJ (offset) ->
  J (translate_imm26 "offset" offset) 
| `MIPSJAL (offset) ->
  JAL (translate_imm26 "offset" offset) 
| `MIPSJR(rd) ->
  JR (translate_reg "rd" rd) 
| `MIPSJALR(rd, rs) ->
  JALR (translate_reg "rd" rd, translate_reg "rs" rs)