File: PPCParser.mly

package info (click to toggle)
herdtools7 7.58-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 19,732 kB
  • sloc: ml: 128,583; ansic: 3,827; makefile: 670; python: 407; sh: 212; awk: 14
file content (294 lines) | stat: -rw-r--r-- 8,596 bytes parent folder | download
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
%{
(****************************************************************************)
(*                           the diy toolsuite                              *)
(*                                                                          *)
(* Jade Alglave, University College London, UK.                             *)
(* Luc Maranget, INRIA Paris-Rocquencourt, France.                          *)
(*                                                                          *)
(* Copyright 2010-present Institut National de Recherche en Informatique et *)
(* en Automatique and the authors. All rights reserved.                     *)
(*                                                                          *)
(* This software is governed by the CeCILL-B license under French law and   *)
(* abiding by the rules of distribution of free software. You can use,      *)
(* modify and/ or redistribute the software under the terms of the CeCILL-B *)
(* license as circulated by CEA, CNRS and INRIA at the following URL        *)
(* "http://www.cecill.info". We also give a copy in LICENSE.txt.            *)
(****************************************************************************)

module PPC = PPCBase
open PPC
open MachSize
%}

%token EOF
%token <PPCBase.reg> ARCH_REG
%token <string> SYMB_REG
%token <string> CODEVAR
%token <int> NUM
%token <string> NAME
%token <string> CSTVAR
%token <int> PROC

%token SEMI COMMA PIPE COLON LPAR RPAR

%token <int> CRK

/* Instruction tokens */
%token LI LIS
%token ADD ADDDOT SUB SUBF SUBFDOT SUBDOT XOR XORDOT OR ORDOT  AND ANDDOT
%token MULL MULLDOT DIV DIVDOT
%token ADDI ADDIS SUBI ORI XORI ANDIDOT MULLI
%token LBZ LBZX LHZ LHZX LWZ LWZU LWZX
%token MR STB STBX STH STHX STW STWU STWX LWARX LWA STWCX CMPWI CMPW CMPLWI
%token LD STD LDX STDX LWAX
%token SYNC EIEIO ISYNC LWSYNC HWSYNC DCBF B BEQ BNE BLT BGT BLE BGE BNL BNG
%token NOR NORDOT NEG NEGDOT SLW SRAWI SRAW BL BLR MTLR MFLR MFCR
%token LMW STMW
%token RLWINM RLWIMI CLRLDI EXTSW
%token COMMENT
%token <string> STRING
%token NOP

%type <MiscParser.proc list * (PPCBase.parsedPseudo) list list> main
%start main

%type <PPCBase.parsedPseudo list> instr_option_seq
%start instr_option_seq

%%

main:
| semi_opt proc_list iol_list EOF { $2,$3 }
| semi_opt proc_list EOF { $2,[] }

proc_list:
| ps=separated_nonempty_list(PIPE,PROC) SEMI
  { List.map (fun p -> p,None,MiscParser.Main) ps }

semi_opt:
| { () }
| SEMI { () }

iol_list :
|  instr_option_list SEMI
    {[$1]}
|  instr_option_list SEMI iol_list {$1::$3}

instr_option_list :
  | instr_option
      {[$1]}
  | instr_option PIPE instr_option_list
      {$1::$3}

instr_option_seq : xs=separated_nonempty_list(SEMI,instr_option) EOF { xs }

instr_option :
|            { Nop }
| NAME COLON instr_option { Label ($1,$3) }
| CODEVAR    { Symbolic $1 }
| NAME LPAR reg_list RPAR
             { Macro ($1,$3) }
| instr      { Instruction $1}

reg_list :
| { [] }
| reg { [$1] }
| reg COMMA reg_list { $1 :: $3 }

instr:
  | NOP
    { Pnop }
  | ADD reg COMMA reg COMMA reg
    { Padd (DontSetCR0,$2,$4,$6) }
  | ADDDOT reg COMMA reg COMMA reg
    { Padd (SetCR0,$2,$4,$6) }
  | SUB reg COMMA reg COMMA reg
    { Psub (DontSetCR0,$2,$4,$6) }
  | SUBDOT reg COMMA reg COMMA reg
    { Psub (SetCR0,$2,$4,$6) }
  | SUBF reg COMMA reg COMMA reg
    { Psubf (DontSetCR0,$2,$4,$6) }
  | SUBFDOT reg COMMA reg COMMA reg
    { Psubf (SetCR0,$2,$4,$6) }
  | ADDIS reg COMMA reg COMMA k
    { Paddis ($2,$4,$6) }
  | ADDI reg COMMA reg COMMA k
    { Paddi ($2,$4,$6) }
  | SUBI reg COMMA reg COMMA k
      { Paddi ($2,$4, match $6 with MetaConst.Meta _ as k -> k
                     | MetaConst.Int i -> MetaConst.Int(-i)) }
  | RLWINM reg COMMA reg COMMA k COMMA k COMMA k
    { Prlwinm ($2,$4,$6,$8,$10) }
  | RLWIMI reg COMMA reg COMMA k COMMA k COMMA k
    { Prlwimi ($2,$4,$6,$8,$10) }
  | CLRLDI reg COMMA reg COMMA k
    { Pclrldi ($2,$4,$6) }
  | EXTSW reg COMMA reg
    { Pextsw ($2,$4) }
  | CMPWI reg COMMA k
    { Pcmpwi (0,$2,$4) }
  | CMPLWI reg COMMA k
    { Pcmplwi (0,$2,$4) }
  | CMPWI crindex COMMA reg COMMA k
    { Pcmpwi ($2,$4,$6) }
  | CMPW crindex COMMA reg COMMA reg
    { Pcmpw ($2,$4,$6)}
  | CMPW reg COMMA reg
    { Pcmpw (0,$2,$4)}
  | LI reg COMMA k
    { Pli ($2,$4) }
  | LIS reg COMMA k
    { Plis ($2,$4) }
  | XOR reg COMMA reg COMMA reg
    { Pxor (DontSetCR0,$2,$4,$6) }
  | XORDOT reg COMMA reg COMMA reg
    { Pxor (SetCR0,$2,$4,$6) }
  | XORI reg COMMA reg COMMA k
    { Pxori ($2,$4,$6) }
  | AND reg COMMA reg COMMA reg
    { Pand (DontSetCR0,$2,$4,$6) }
  | ANDDOT reg COMMA reg COMMA reg
    { Pand (SetCR0,$2,$4,$6) }
  | ANDIDOT reg COMMA reg COMMA k
    { Pandi ($2,$4,$6) }
  | OR reg COMMA reg COMMA reg
    { Por (DontSetCR0,$2,$4,$6) }
  | ORDOT reg COMMA reg COMMA reg
    { Por (SetCR0,$2,$4,$6) }
  | ORI reg COMMA reg COMMA k
    { Pori ($2,$4,$6) }
  | MULL  reg COMMA reg COMMA reg
    { Pmull (DontSetCR0,$2,$4,$6) }
  | MULLDOT  reg COMMA reg COMMA reg
    { Pmull (SetCR0,$2,$4,$6) }
  | MULLI reg COMMA reg COMMA k
    { Pmulli ($2,$4,$6) }
  | DIV  reg COMMA reg COMMA reg
    { Pdiv (DontSetCR0,$2,$4,$6) }
  | DIVDOT  reg COMMA reg COMMA reg
    { Pdiv (SetCR0,$2,$4,$6) }
  | LBZ reg COMMA idx COMMA reg
    { Pload (Byte,$2,$4,$6)}
  | LBZ reg COMMA idx LPAR reg RPAR
    { Pload (Byte,$2,$4,$6)}
  | LHZ reg COMMA idx COMMA reg
    { Pload (Short,$2,$4,$6)}
  | LHZ reg COMMA idx LPAR reg RPAR
    { Pload (Short,$2,$4,$6)}
  | LWZ reg COMMA idx COMMA reg
    { Pload (Word,$2,$4,$6)}
  | LWA  reg COMMA idx LPAR reg RPAR
    { Plwa ($2,$4,$6) }
  | LWAX reg COMMA reg COMMA reg
    { Plwax (Word,$2,$4,$6)}
  | LWZ reg COMMA idx LPAR reg RPAR
    { Pload (Word,$2,$4,$6)}
  | LWZU reg COMMA idx COMMA reg
    { Plwzu ($2,$4,$6)}
  | LWZU reg COMMA idx LPAR reg RPAR
    { Plwzu ($2,$4,$6)}
  | LD reg COMMA idx COMMA reg
    { Pload (Quad,$2,$4,$6)}
  | LD reg COMMA idx LPAR reg RPAR
    { Pload (Quad,$2,$4,$6)}
  | LBZX reg COMMA reg COMMA reg
    { Ploadx (Byte,$2,$4,$6)}
  | LHZX reg COMMA reg COMMA reg
    { Ploadx (Short,$2,$4,$6)}
  | LWZX reg COMMA reg COMMA reg
    { Ploadx (Word,$2,$4,$6)}
  | LDX reg COMMA reg COMMA reg
    { Ploadx (Quad,$2,$4,$6)}
  | MR reg COMMA reg
    { Pmr ($2,$4) }
  | STB reg COMMA idx COMMA reg
    { Pstore (Byte,$2,$4,$6) }
  | STB reg COMMA idx LPAR reg RPAR
    { Pstore (Byte,$2,$4,$6) }
  | STH reg COMMA idx COMMA reg
    { Pstore (Short,$2,$4,$6) }
  | STH reg COMMA idx LPAR reg RPAR
    { Pstore (Short,$2,$4,$6) }
  | STW reg COMMA idx COMMA reg
    { Pstore (Word,$2,$4,$6) }
  | STW reg COMMA idx LPAR reg RPAR
    { Pstore (Word,$2,$4,$6) }
  | STWU reg COMMA idx COMMA reg
    { Pstwu ($2,$4,$6) }
  | STWU reg COMMA idx LPAR reg RPAR
    { Pstwu ($2,$4,$6) }
  | STD reg COMMA idx COMMA reg
    { Pstore (Quad,$2,$4,$6) }
  | STD reg COMMA idx LPAR reg RPAR
    { Pstore (Quad,$2,$4,$6) }
  | STBX reg COMMA reg COMMA reg
    { Pstorex (Byte,$2,$4,$6) }
  | STHX reg COMMA reg COMMA reg
    { Pstorex (Short,$2,$4,$6) }
  | STWX reg COMMA reg COMMA reg
    { Pstorex (Word,$2,$4,$6) }
  | STDX reg COMMA reg COMMA reg
    { Pstorex (Quad,$2,$4,$6) }
  | LWARX  reg COMMA reg COMMA reg
    { Plwarx ($2,$4,$6)}
  | STWCX reg COMMA reg COMMA reg
    { Pstwcx ($2,$4,$6) }
  | SYNC
    { Psync }
  | EIEIO
    { Peieio }
  | LWSYNC
    { Plwsync }
  | HWSYNC
    { Psync }
  | ISYNC
    { Pisync }
  | DCBF reg COMMA reg
    { Pdcbf ($2,$4) }
  | B NAME { Pb $2 }
  | BEQ NAME { Pbcc (Eq,$2) }
  | BNE NAME { Pbcc (Ne,$2) }
  | BLT NAME { Pbcc (Lt,$2) }
  | BGE NAME { Pbcc (Ge,$2) }
  | BNL NAME { Pbcc (Ge,$2) }
  | BGT NAME { Pbcc (Gt,$2) }
  | BLE NAME { Pbcc (Le,$2) }
  | BNG NAME { Pbcc (Le,$2) }
  | NOR reg COMMA reg COMMA reg
    { Pnor (DontSetCR0,$2,$4,$6)}
  | NORDOT reg COMMA reg COMMA reg
    { Pnor (SetCR0,$2,$4,$6)}
  | NEG reg COMMA reg
    { Pneg (DontSetCR0,$2,$4)}
  | NEGDOT reg COMMA reg
    { Pneg (SetCR0,$2,$4)}
  | SLW reg COMMA reg COMMA reg
    { Pslw (DontSetCR0,$2,$4,$6)}
  | SRAWI reg COMMA reg COMMA k
    { Psrawi (DontSetCR0,$2,$4,$6)}
  | SRAW reg COMMA reg COMMA reg
    { Psraw (DontSetCR0,$2,$4,$6)}
  | BL NAME { Pbl $2 }
  | BLR { Pblr }
  | MTLR reg { Pmtlr $2}
  | MFLR reg { Pmflr $2}
  | MFCR reg { Pmfcr $2}
  | LMW reg  COMMA idx LPAR reg RPAR { Plmw ($2,$4,$6) }
  | STMW reg  COMMA idx LPAR reg RPAR { Pstmw ($2,$4,$6) }
  | COMMENT STRING { Pcomment $2 }

k:
| NUM  { MetaConst.Int $1 }
| CSTVAR { MetaConst.Meta $1 }

idx:
| NUM  { MetaConst.Int $1 }
| CSTVAR { MetaConst.Meta $1 }


crindex:
| CRK  { $1 }

reg:
| SYMB_REG { Symbolic_reg $1 }
| ARCH_REG { $1 }