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
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
|
/****************************************************************************
* pinsn32.h
* 32-bit P-code operation code definitions
*
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __PINSN32_H
#define __PINSN32_H
/****************************************************************************
* Included Files
****************************************************************************/
/****************************************************************************
* Definitions
****************************************************************************/
/* 32-bit op-code bit definitions
*
* Machine model:
*
* SPB 32-bit Pascal stack base address
* SP 32-bit Pascal stack pointer
* LSP 32-bit Level stack pointer
* CSB 32-bit Character stack base address
* CSP 32-bit Character stack pointer
* DS 32-bit Data size register (for multiple reg transfers)
* PC 32-bit Program Counter
* CC Condition code register
* --- Volatile general purpose registers
* --- Static general purpose registers
*
* Condition codes: Z(ero), N(egative)
*
* +=====+=====+
* | Z | N |
* +=====+=====+=====+
* | EQ | 1 | - |
* | NEQ | 0 | - |
* | LT | - | 1 |
* | GTE | - | 0 |
* | GT | 0 | 0 |
* | LTE | 1 | 1 |
* +=====+=====+=====+
*
* Opcode Encoding Summary:
*
* 0rxx xxxx 1rxxx xxxx
* xr00 0000 NOP LD uoffs4
* xr00 0001 NEG LDH uoffs3
* xr00 0010 ABS LDB uoffs
* xr00 0011 INC LDM uoffs4
* xr00 0100 DEC ST uoffs4
* xr00 0101 NOT STH uoffs2
* xr00 0110 ADD STB uoffs
* xr00 0111 SUB STM uoffs4
* xr00 1000 MUL LDX uoffs4
* xr00 1001 DIV LDXH uoffs2
* xr00 1010 MOD LDXB uoffs
* xr00 1011 SLL LDXM uoffs4
* xr00 1100 SRL STX uoffs4
* xr00 1101 SRA STXH uoffs2
* xr00 1110 OR STXB uoffs
* xr00 1111 AND STXM uoffs
*
* xr01 0000 EQUZ JEQUZ ilbl
* xr01 0001 NEQZ JNEQZ ilbl
* xr01 0010 LTZ JLTZ ilbl
* xr01 0011 GTEZ JGTEZ ilbl
* xr01 0100 GTZ JGTZ ilbl
* xr01 0101 LTEZ JLTEZ ilbl
* xr01 0110 --- JMP ilbl
* xr01 0111 --- PUSH nn
* xr01 1000 EQU JEQU ilbl
* xr01 1001 NEQ JNEQ ilbl
* xr01 1010 LT JLT ilbl
* xr01 1011 GTE JGTE ilbl
* xr01 1100 GT JGT ilbl
* xr01 1101 LTE JLTE ilbl
* xr01 1110 --- ---
* xr01 1111 BIT INDS nn
*
* xr10 0000 LDI LDS offs4
* xr10 0001 LDIH LDSH offs3
* xr10 0010 LDIB LDSB offs
* xr10 0011 LDIM LDSM offs4
* xr10 0100 STI STS offs4
* xr10 0101 STIH STSH offs2
* xr10 0110 STIB STSB offs
* xr10 0111 STIM STSM offs4
* xr10 1000 DUP LDSX offs4
* xr10 1001 --- LDSXH offs2
* xr10 1010 PUSHS LDSXB offs
* xr10 1011 POPS LDSXM offs4
* xr10 1100 --- STSX offs4
* xr10 1101 --- STSXH offs2
* xr10 1110 --- STSXB offs
* xr10 1111 RET STSXM offs
*
* xr11 0000 --- LA uoffs
* xr11 0001 --- LAS offs
* xr11 0010 --- LAC dlbl
* xr11 0011 --- ---
* xr11 0100 --- LAX uoffs
* xr11 0101 --- LASX offs
* xr11 0110 --- SLSP level
* xr11 0111 --- SDC uu
* xr11 1000 --- ---
* xr11 1001 --- PCAL ilbl
* xr11 1010 --- SYSIO fn,sop
* xr11 1011 --- LIB lop
* xr11 1100 --- FLOAT fop
* xr11 1101 --- *LABEL ilbl
* xr11 1110 --- *INCLUDE fn
* xr11 1111 END *LINE lineno
*
* KEY:
* r = Reserved bit (must be zero)
* fn = 8-bit file number
* lvl = 8-bit static nexting level
* sop = 17-bit sysio operation
* lineno = 17-bit line number
* nn = 32-bit constant value (signed)
* uu = 32-bit constant value (unsigned)
* fop = 32-bit floating point operation
* lop = 32-bit library call identifier
* ilbl = 32-bit Instruction space label number
* dlbl = 32-stack data label
* offs4 = 32-bit word offset with respect to LSP (signed)
* offs2 = 32-bit halfword offset with respect to LSP (signed)
* offs = 32-bit byte offset with respect to LSP (signed)
* uoffs4 = 32-bit word offset with respect to SPB (unsigned)
* uoffs2 = 32-bit halfword offset with respect to SPB (unsigned)
* uoffs = 32-bit byte offset with respect to SPB (unsigned)
* c = string follows pseudo-operation
* * = Indicates pseudo-operations (these are removed
* after final fixup of the object file).
*/
#define o32 (0x80)
#define GETOP(o) ((o)->op)
#define PUTOP(o,v) do { (o)->op = (v); } while (0)
#define GETARG(o) ((o)->arg)
#define PUTARG(o,a) do { (o)->arg = (a); } while (0)
#define ARGONES 0xffffffff
/* The opcode binary is stored in big endian order (so that the opcode
* always comes first). The following definitions simplify ordering
* of byte accesses.
*/
#ifdef CONFIG_ENDIAN_BIG
# define opB1 0
# define opB2 1
# define opB3 2
# define opB4 3
#else
# define opB1 3
# define opB2 2
# define opB3 1
# define opB4 0
#endif
/** 1-BYTE OPCODES WITH NO ARGUMENTS (other than stack arguments) ***********/
/* Program control (No stack arguments) */
#define oNOP (0x00)
/* Arithmetic & logical & and integer conversions (One 32-bit stack
* argument)
*/
#define oNEG (0x01)
#define oABS (0x02)
#define oINC (0x03)
#define oDEC (0x04)
#define oNOT (0x05)
#define oADD (0x06)
#define oSUB (0x07)
#define oMUL (0x08)
#define oDIV (0x09)
#define oMOD (0x0a)
#define oSLL (0x0b)
#define oSRL (0x0c)
#define oSRA (0x0d)
#define oOR (0x0e)
#define oAND (0x0f)
/* Comparisons (One 32-bit stack argument) */
#define oEQUZ (0x10)
#define oNEQZ (0x11)
#define oLTZ (0x12)
#define oGTEZ (0x13)
#define oGTZ (0x14)
#define oLTEZ (0x15)
/* Comparisons (Two 32-bit stack arguments) */
#define oEQU (0x18)
#define oNEQ (0x19)
#define oLT (0x1a)
#define oGTE (0x1b)
#define oGT (0x1c)
#define oLTE (0x1d)
#define oBIT (0x1f)
/* Load Immediate */
#define oLDI (0x20) /* (One 32-bit stack argument) */
#define oLDIH (0x21) /* (One 32-bit stack argument) */
#define oLDIB (0x22) /* (One 32-bit stack argument) */
#define oLDIM (0x23) /* (Two 32-bit stack argument) */
/* Store Immediate */
#define oSTI (0x24) /* (Two 32-bit stack argument) */
#define oSTIH (0x25) /* (Two 32-bit stack argument) */
#define oSTIB (0x26) /* (Two 32-bit stack argument) */
#define oSTIM (0x27) /* (Two+n 32-bit stack argument) */
/* Data stack */
#define oDUP (0x28) /* (One 32-bit stack argument) */
#define oDUPH (0x29) /* (One 32-bit stack argument) */
#define oPUSHS (0x2a) /* No stack arguments */
#define oPOPS (0x2b) /* (One 32-bit stack argument) */
/* Program control (No stack arguments)
* Behavior:
* Pop return address
* Pop saved base register (BR)
* Discard saved base address
* Set program counter (PC) to return address
*/
#define oRET (0x2f)
/* System Functions (No stack arguments) */
#define oEND (0x3f)
/** 4-BYTE OPCODES INCLUDING ONE 32-BIT ARGUMENT ****************************/
/* Load: arg = unsigned base offset */
#define oLD (o32|0x00) /* No stack arguments */
#define oLDH (o32|0x01) /* No stack arguments */
#define oLDB (o32|0x02) /* No stack arguments */
#define oLDM (o32|0x03) /* One 32-bit stack argument */
/* Store: arg = unsigned base offset */
#define oST (o32|0x04) /* One 32-bit stack argument */
#define oSTH (o32|0x05) /* One 32-bit stack argument */
#define oSTB (o32|0x06) /* One 32-bit stack argument */
#define oSTM (o32|0x07) /* One+n 32-bit stack argument */
/* Load Indexed: arg = unsigned base offset */
#define oLDX (o32|0x08) /* One 32-bit stack argument */
#define oLDXH (o32|0x09) /* One 32-bit stack argument */
#define oLDXB (o32|0x0a) /* One 32-bit stack argument */
#define oLDXM (o32|0x0b) /* Two 32-bit stack argument */
/* Store Indexed: arg = unsigned base offset */
#define oSTX (o32|0x0c) /* Two 32-bit stack argument */
#define oSTXH (o32|0x0d) /* Two 32-bit stack argument */
#define oSTXB (o32|0x0e) /* Two 32-bit stack argument */
#define oSTXM (o32|0x0f) /* Two+n 32-bit stack argument */
/* Program control: arg = unsigned label (One 32-bit stack argument) */
#define oJEQUZ (o32|0x10)
#define oJNEQZ (o32|0x11)
#define oJLTZ (o32|0x12)
#define oJGTEZ (o32|0x13)
#define oJGTZ (o32|0x14)
#define oJLTEZ (o32|0x15)
/* Program control: arg = unsigned label (no stack arguments) */
#define oJMP (o32|0x16)
/* Data stack: arg = 32 bit signed data (no stack arguments) */
#define oPUSH (o32|0x17)
/* Program control: arg = unsigned label (One 32-bit stack argument) */
#define oJEQU (o32|0x18)
#define oJNEQ (o32|0x19)
#define oJLT (o32|0x1a)
#define oJGTE (o32|0x1b)
#define oJGT (o32|0x1c)
#define oJLTE (o32|0x1d)
/* Data stack: arg = 32 bit signed data (no stack arguments) */
#define oINDS (o32|0x1f)
/* Load: Uses LSP; arg = signed frame offset */
#define oLDS (o32|0x20) /* No stack arguments */
#define oLDSH (o32|0x21) /* No stack arguments */
#define oLDSB (o32|0x22) /* No stack arguments */
#define oLDSM (o32|0x23) /* One 32-bit stack argument */
/* Store: Uses LSP; arg = signed frame offset */
#define oSTS (o32|0x24) /* One 32-bit stack argument */
#define oSTSH (o32|0x25) /* One 32-bit stack argument */
#define oSTSB (o32|0x26) /* One 32-bit stack argument */
#define oSTSM (o32|0x27) /* One+n 32-bit stack argument */
/* Load Indexed: Uses LSP; arg = signed frame offset */
#define oLDSX (o32|0x28) /* One 32-bit stack argument */
#define oLDSXH (o32|0x29) /* One 32-bit stack argument */
#define oLDSXB (o32|0x2a) /* One 32-bit stack argument */
#define oLDSXM (o32|0x2b) /* Two 32-bit stack argument */
/* Store Indexed: Uses LSP; arg = signed frame offset */
#define oSTSX (o32|0x2c) /* Two 32-bit stack argument */
#define oSTSXH (o32|0x2d) /* Two 32-bit stack argument */
#define oSTSXB (o32|0x2e) /* Two 32-bit stack argument */
#define oSTSXM (o32|0x2f) /* Two+n 32-bit stack argument */
/* Load address relative to stack base: arg = unsigned offset */
#define oLA (o32|0x30)
/* Load address: Uses SLP, arg = signed frame offset */
#define oLAS (o32|0x31) /* No stack arguments */
/* Load absolute stack address: arg = RODATA offset (No stack arguments) */
#define oLAC (o32|0x32)
/* Load address relative to stack base: arg = unsigned offset, TOS=index */
#define oLAX (o32|0x34)
/* Load address indexed: Uses SLP, arg = signed frame offset */
#define oLASX (o32|0x35) /* No stack arguments */
/* Set LSP: arg = new level that evaluates to LSP value */
#define oSLSP (o32|0x36)
/* Set DS: arg = new byte count in DS register */
#define oSDC (o32|0x37)
/* Program Control: Uses LSP; arg = unsigned label
* (No stack arguments)
* Behavior:
* Push base address of level
* Push base register (BR) value
* Set new base register value (BR) as top of stack
* Push return address
* Set program counter (PC) for address associated with label
*/
#define oPCAL (o32|0x39)
/* System calls: arg = file number | sub-function code */
#define oSYSIO (o32|0x3a)
/* System functions: arg = 32-bit library call identifier */
#define oLIB (o32|0x3b)
/* Floating point operations: arg = FP op-code */
#define oFLOAT (o32|0x3c)
/* Program control: arg = unsigned label (no stack arguments) */
#define oLABEL (o32|0x3d)
/* Pseudo-operations: arg = file number OR line number */
#define oINCLUDE (o32|0x3e)
#define oLINE (o32|0x3f)
#endif /* __PINSN32_H */
|