1 #include <stdio.h>
2 #include <iostream>
3 #include <vector>
4 #include <string.h>
5
6 enum { ModReg, ModIReg, ModDisp16, ModDisp32, ModImm, ModAbs16, ModAbs32, ModPCRel16, ModPCRel32,
7 ModPop, ModPush, ModRegChain, ModPCChain, ModAbsChain, ModeCnt };
8 #define MModReg (1 << ModReg)
9 #define MModIReg (1 << ModIReg)
10 #define MModDisp16 (1 << ModDisp16)
11 #define MModDisp32 (1 << ModDisp32)
12 #define MModImm (1 << ModImm)
13 #define MModAbs16 (1 << ModAbs16)
14 #define MModAbs32 (1 << ModAbs32)
15 #define MModPCRel16 (1 << ModPCRel16)
16 #define MModPCRel32 (1 << ModPCRel32)
17 #define MModPop (1 << ModPop)
18 #define MModPush (1 << ModPush)
19 #define MModRegChain (1 << ModRegChain)
20 #define MModPCChain (1 << ModPCChain)
21 #define MModAbsChain (1 << ModAbsChain)
22
23 #define Mask_RegOnly (MModReg)
24 #define Mask_AllShort (MModReg+MModIReg+MModDisp16+MModImm+MModAbs16+MModAbs32+MModPCRel16+MModPCRel32+MModPop+MModPush+MModPCChain+MModAbsChain)
25 #define Mask_AllGen (Mask_AllShort+MModDisp32+MModRegChain)
26 #define Mask_NoImmShort (Mask_AllShort-MModImm)
27 #define Mask_NoImmGen (Mask_AllGen-MModImm)
28 #define Mask_MemShort (Mask_NoImmShort-MModReg)
29 #define Mask_MemGen (Mask_NoImmGen-MModReg)
30
31 #define Mask_Source (Mask_AllGen-MModPush)
32 #define Mask_Dest (Mask_NoImmGen-MModPop)
33 #define Mask_PureDest (Mask_NoImmGen-MModPush-MModPop)
34 #define Mask_PureMem (Mask_MemGen-MModPush-MModPop)
35
36 enum { Size8, Size16, Size32, SizeCnt };
37 #define Mask_Size8 (1 << Size8)
38 #define Mask_Size16 (1 << Size16)
39 #define Mask_Size32 (1 << Size32)
40 #define Mask_AllSize (Mask_Size8 | Mask_Size16 | Mask_Size32)
41
42 using namespace std;
43
44 /* ------------------------------------ */
45
46 class cSizeMask
47 {
48 public:
49 cSizeMask(unsigned SizeMask);
50 ~cSizeMask(void);
51
52 cSizeMask operator++(int);
53 friend ostream& operator<< (ostream &stream, const cSizeMask &Mask);
54
GetCurrSize(void) const55 unsigned GetCurrSize(void) const { return m_Size; }
End(void) const56 bool End(void) const { return m_End; }
57
58 protected:
59 unsigned m_SizeMask;
60 unsigned m_Size;
61 bool m_End;
62 };
63
cSizeMask(unsigned SizeMask)64 cSizeMask::cSizeMask(unsigned SizeMask)
65 : m_SizeMask(SizeMask), m_End(false)
66 {
67 m_Size = Size8;
68 while ((!(1 << m_Size & m_SizeMask)) && (m_Size < SizeCnt))
69 m_Size++;
70 if (m_Size >= SizeCnt)
71 m_End = true;
72 }
73
~cSizeMask(void)74 cSizeMask::~cSizeMask(void)
75 {
76 }
77
operator ++(int)78 cSizeMask cSizeMask::operator++(int)
79 {
80 if (m_End)
81 return *this;
82
83 do
84 {
85 m_Size++;
86 }
87 while ((m_Size < SizeCnt) && (!((1 << m_Size) & m_SizeMask)));
88 if (m_Size >= SizeCnt)
89 m_End = true;
90
91 return *this;
92 }
93
operator <<(ostream & stream,const cSizeMask & Mask)94 ostream& operator<< (ostream &stream, const cSizeMask &Mask)
95 {
96 switch (Mask.m_Size)
97 {
98 case Size8: stream << ".b"; break;
99 case Size16: stream << ".h"; break;
100 case Size32: stream << ".w"; break;
101 default: stream << ".?";
102 }
103 return stream;
104 }
105
106 /* ------------------------------------- */
107
108 class cGenMask : public cSizeMask
109 {
110 public:
111 cGenMask(unsigned ModeMask, unsigned SizeMask);
112 cGenMask(unsigned ModeMask);
113 ~cGenMask(void);
114
115 cGenMask operator++(int);
116 friend ostream& operator<< (ostream &stream, const cGenMask &Mask);
GetCurrMode(void) const117 unsigned GetCurrMode(void) const { return m_Mode; }
118
119 private:
120 bool m_NoSizeMask;
121 unsigned m_ModeMask;
122 unsigned m_Mode, m_FirstMode;
123 };
124
cGenMask(unsigned ModeMask,unsigned SizeMask)125 cGenMask::cGenMask(unsigned ModeMask, unsigned SizeMask)
126 : m_NoSizeMask(false), cSizeMask(SizeMask), m_ModeMask(ModeMask)
127 {
128 if (!m_End)
129 {
130 m_Mode = 0;
131 while ((!(1 << m_Mode & m_ModeMask)) && (m_Mode < ModeCnt))
132 m_Mode++;
133 if (m_Mode >= ModeCnt)
134 m_End = true;
135 else
136 m_FirstMode = m_Mode;
137 }
138 }
139
cGenMask(unsigned ModeMask)140 cGenMask::cGenMask(unsigned ModeMask)
141 : cGenMask(ModeMask, 1)
142 {
143 m_NoSizeMask = true;
144 }
145
~cGenMask(void)146 cGenMask::~cGenMask(void)
147 {
148 }
149
operator ++(int)150 cGenMask cGenMask::operator++(int)
151 {
152 if (m_End)
153 return *this;
154
155 do
156 {
157 m_Mode++;
158 }
159 while ((m_Mode < ModeCnt) && (!((1 << m_Mode) & m_ModeMask)));
160 if (m_Mode >= ModeCnt)
161 {
162 m_Mode = m_FirstMode;
163 (*(reinterpret_cast<cSizeMask*>(this)))++;
164 }
165 return *this;
166 }
167
operator <<(ostream & stream,const cGenMask & Mask)168 ostream& operator<< (ostream &stream, const cGenMask &Mask)
169 {
170 switch (Mask.m_Mode)
171 {
172 case ModReg: stream << "R1"; break;
173 case ModIReg: stream << "@R2"; break;
174 case ModDisp16: stream << "@(1234,R3)"; break;
175 case ModDisp32: stream << "@(12345678,R4)"; break;
176 case ModImm: stream << "#42"; break;
177 case ModAbs16: stream << "@1234"; break;
178 case ModAbs32: stream << "@12345678"; break;
179 case ModPCRel16: stream << "@($+4,PC)"; break;
180 case ModPCRel32: stream << "@($+100000,PC)"; break;
181 case ModPop: stream << "@SP+"; break;
182 case ModPush: stream << "@-SP"; break;
183 case ModRegChain: stream << "@@(R6,10)"; break;
184 case ModPCChain: stream << "@@(PC,$)"; break;
185 case ModAbsChain: stream << "@@(1234)"; break;
186 default: stream << "<" << Mask.m_Mode << ">";
187 }
188 if (!Mask.m_NoSizeMask)
189 stream << *(reinterpret_cast<const cSizeMask*>(&Mask));
190
191 return stream;
192 }
193
194 /* ------------------------------------- */
195
196 class cDispMask : public cSizeMask
197 {
198 public:
199 cDispMask(unsigned SizeMask);
200 ~cDispMask(void);
201
202 friend ostream& operator<< (ostream&, const cDispMask &Mask);
203 };
204
cDispMask(unsigned SizeMask)205 cDispMask::cDispMask(unsigned SizeMask)
206 : cSizeMask(SizeMask)
207 {
208 }
209
~cDispMask(void)210 cDispMask::~cDispMask(void)
211 {
212 }
213
operator <<(ostream & stream,const cDispMask & Mask)214 ostream& operator<< (ostream &stream, const cDispMask &Mask)
215 {
216 switch (Mask.m_Size)
217 {
218 case Size8: stream << "$+10"; break;
219 case Size16: stream << "$+300"; break;
220 case Size32: stream << "$+3000000"; break;
221 }
222 stream << *(reinterpret_cast<const cSizeMask*>(&Mask));
223 return stream;
224 }
225
226 /* ------------------------------------- */
227
228 class cInstrList
229 {
230 public:
231 cInstrList(vector<const char*> &InstList);
232 ~cInstrList(void);
233
operator ++(int)234 cInstrList operator++(int) { ++m_it; return *this; }
End(void) const235 bool End(void) const { return m_it == m_InstList.end(); }
236 friend ostream& operator<< (ostream &stream, const cInstrList &List);
237
GetCurr(void) const238 const char *GetCurr(void) const { return *m_it; };
239
240 private:
241 vector<const char*> m_InstList;
242 vector<const char*>::iterator m_it;
243 };
244
cInstrList(vector<const char * > & InstList)245 cInstrList::cInstrList(vector<const char*> &InstList)
246 : m_InstList(InstList), m_it(m_InstList.begin())
247 {
248 }
249
~cInstrList(void)250 cInstrList::~cInstrList(void)
251 {
252 }
253
operator <<(ostream & stream,const cInstrList & List)254 ostream& operator<< (ostream &stream, const cInstrList &List)
255 {
256 stream << *List.m_it;
257 return stream;
258 }
259
260 /* ------------------------------------- */
261
main(int argc,char ** argv)262 int main(int argc, char **argv)
263 {
264 cout << "\tcpu\tm16" << endl << endl;
265 cout << "\tpage\t0" << endl << endl;
266
267 {
268 vector<const char*> Instructions({"nop", "pib", "rie", "rrng", "rts", "stctx", "reit", "stop", "sleep"});
269
270 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
271 cout << "\t" << InstrList << endl;
272 cout << endl;
273 }
274
275 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
276 for (cGenMask DestMask(Mask_AllGen & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
277 cout << "\tmov:g\t" << SrcMask << "," << DestMask << endl;
278 for (cGenMask DestMask(Mask_AllGen & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
279 cout << "\tmov:e\t#55," << DestMask << endl;
280 for (cGenMask SrcMask(Mask_AllShort & ~MModPush, Mask_AllSize); !SrcMask.End(); SrcMask++)
281 cout << "\tmov:l\t" << SrcMask << ",r4.w" << endl;
282 for (cGenMask DestMask(Mask_AllShort & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
283 cout << "\tmov:s\tr5.w," << DestMask << endl;
284 for (cGenMask DestMask(Mask_AllGen & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
285 cout << "\tmov:z\t#0," << DestMask << endl;
286 for (cGenMask DestMask(Mask_AllShort & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
287 cout << "\tmov:q\t#4," << DestMask << endl;
288 for (cGenMask DestMask(Mask_AllShort & ~MModPop, Mask_AllSize); !DestMask.End(); DestMask++)
289 cout << "\tmov:i\t#55h," << DestMask << endl;
290 cout << endl;
291
292 {
293 vector<const char*> Instructions({"acs", "jmp", "jsr", "pusha" });
294
295 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
296 for (cGenMask StepMask(Mask_PureMem); !StepMask.End(); StepMask++)
297 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
298 }
299 {
300 vector<const char*> Instructions({"neg", "not", "pop" });
301
302 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
303 for (cGenMask StepMask(Mask_PureDest); !StepMask.End(); StepMask++)
304 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
305 }
306 {
307 vector<const char*> Instructions({"ldctx" });
308
309 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
310 for (cGenMask StepMask(MModIReg | MModDisp16 | MModDisp32 |
311 MModAbs16 | MModAbs32 | MModPCRel16 | MModPCRel32); !StepMask.End(); StepMask++)
312 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
313 }
314 {
315 vector<const char*> Instructions({"ldpsb", "ldpsm" });
316
317 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
318 for (cGenMask StepMask(Mask_Source); !StepMask.End(); StepMask++)
319 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
320 }
321 {
322 vector<const char*> Instructions({"push" });
323
324 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
325 for (cGenMask StepMask(Mask_Source & ~MModPop); !StepMask.End(); StepMask++)
326 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
327 }
328 {
329 vector<const char*> Instructions({"stpsb", "stpsm" });
330
331 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
332 for (cGenMask StepMask(Mask_Dest); !StepMask.End(); StepMask++)
333 cout << "\t" << InstrList << ":g\t" << StepMask << endl;
334 }
335 cout << endl;
336
337 {
338 vector<const char*> Instructions({"add","sub" });
339
340 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
341 for (cGenMask DestMask(Mask_PureDest, Mask_AllSize); !DestMask.End(); DestMask++)
342 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
343 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << DestMask << endl;
344
345 for (cGenMask DestMask(Mask_PureDest, Mask_AllSize); !DestMask.End(); DestMask++)
346 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
347 cout << "\t" << InstrList << ":e\t#10," << DestMask << endl;
348
349 for (cGenMask SrcMask(Mask_AllShort & ~MModPush, Mask_Size32); !SrcMask.End(); SrcMask++)
350 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
351 cout << "\t" << InstrList << ":l\t" << SrcMask << ",r6.w" << endl;
352
353 for (cGenMask DestMask(Mask_AllShort & ~(MModPop | MModPush | MModImm), Mask_AllSize); !DestMask.End(); DestMask++)
354 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
355 cout << "\t" << InstrList << ":q\t#5," << DestMask << endl;
356
357 for (cGenMask DestMask(Mask_AllShort & ~(MModPop | MModPush | MModImm), Mask_AllSize); !DestMask.End(); DestMask++)
358 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
359 cout << "\t" << InstrList << ":i\t#20," << DestMask << endl;
360 }
361 cout << endl;
362
363 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
364 for (cGenMask DestMask(Mask_NoImmGen & ~MModPush, Mask_AllSize); !DestMask.End(); DestMask++)
365 cout << "\tcmp:g\t" << SrcMask << "," << DestMask << endl;
366 for (cGenMask DestMask(Mask_NoImmGen & ~MModPush, Mask_AllSize); !DestMask.End(); DestMask++)
367 cout << "\tcmp:e\t#55," << DestMask << endl;
368 for (cGenMask SrcMask(Mask_AllShort & ~MModPush, Mask_AllSize); !SrcMask.End(); SrcMask++)
369 cout << "\tcmp:l\t" << SrcMask << ",r6.w" << endl;
370 for (cGenMask DestMask(Mask_Source & ~MModImm, Mask_AllSize); !DestMask.End(); DestMask++)
371 cout << "\tcmp:z\t#0," << DestMask << endl;
372 for (cGenMask DestMask(Mask_AllShort & ~(MModPush|MModImm), Mask_AllSize); !DestMask.End(); DestMask++)
373 cout << "\tcmp:q\t#4," << DestMask << endl;
374 for (cGenMask DestMask(Mask_AllShort & ~(MModPush|MModImm), Mask_AllSize); !DestMask.End(); DestMask++)
375 cout << "\tcmp:i\t#87," << DestMask << endl;
376 cout << endl;
377
378 {
379 vector<const char*> Instructions({"addu", "addx", "subu", "subx", "cmpu", "ldc", "ldp", "movu", "rem", "remu", "rot"});
380
381 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
382 {
383 unsigned SrcSizeMask = strcmp(InstrList.GetCurr(), "rot") ? Mask_AllSize : Mask_Size8;
384 unsigned DestSizeMask = strcmp(InstrList.GetCurr(), "ldc") ? Mask_AllSize : Mask_Size32;
385 unsigned DestAdrMask;
386
387 if (!strcmp(InstrList.GetCurr(), "ldp"))
388 DestAdrMask = Mask_PureMem;
389 else if (!strcmp(InstrList.GetCurr(), "movu"))
390 DestAdrMask = Mask_Dest;
391 else if (!strcmp(InstrList.GetCurr(), "cmpu"))
392 DestAdrMask = Mask_PureDest | MModPop;
393 else
394 DestAdrMask = Mask_PureDest;
395
396 for (cGenMask SrcMask(Mask_Source, SrcSizeMask); !SrcMask.End(); SrcMask++)
397 {
398 for (cGenMask DestMask(DestAdrMask, DestSizeMask); !DestMask.End(); DestMask++)
399 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << DestMask << endl;
400 }
401 for (cGenMask DestMask(DestAdrMask, DestSizeMask); !DestMask.End(); DestMask++)
402 cout << "\t" << InstrList << ":e\t#45," << DestMask << endl;
403 }
404 }
405 cout << endl;
406
407 {
408 vector<const char*> Instructions({"and", "or", "xor"});
409
410 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
411 {
412 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
413 for (cGenMask DestMask(Mask_Dest & ~MModPush, Mask_AllSize); !DestMask.End(); DestMask++)
414 if (SrcMask.GetCurrSize() <= DestMask.GetCurrSize())
415 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << DestMask << endl;
416
417 for (cGenMask DestMask(Mask_Dest & ~MModPush, Mask_AllSize); !DestMask.End(); DestMask++)
418 cout << "\t" << InstrList << ":e\t" << "#42," << DestMask << endl;
419
420 for (cGenMask DestMask(Mask_NoImmShort & ~(MModPush|MModPop)); !DestMask.End(); DestMask++)
421 cout << "\t" << InstrList << ":i\t" << "#42," << DestMask << endl;
422 }
423 }
424 cout << endl;
425
426 {
427 vector<const char*> Instructions({"mul", "mulu", "div", "divu"});
428
429 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
430 {
431 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
432 for (cGenMask DestMask(Mask_PureDest, Mask_AllSize); !DestMask.End(); DestMask++)
433 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << DestMask << endl;
434
435 for (cGenMask DestMask(Mask_Dest & ~MModPush, Mask_AllSize); !DestMask.End(); DestMask++)
436 cout << "\t" << InstrList << ":e\t" << "#120," << DestMask << endl;
437
438 if (strlen(InstrList.GetCurr()) < 4)
439 cout << "\t" << InstrList << ":r\tr5.w,r12.w" << endl;
440 }
441 }
442 cout << endl;
443
444 {
445 vector<const char*> Instructions({"getb0","getb1","getb2","geth0"});
446
447 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
448 for (cGenMask DestMask(Mask_Dest); !DestMask.End(); DestMask++)
449 cout << "\t" << InstrList << "\tr14," << DestMask << endl;
450 }
451 {
452 vector<const char*> Instructions({"putb0","putb1","putb2","puth0"});
453
454 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
455 for (cGenMask SrcMask(Mask_Source); !SrcMask.End(); SrcMask++)
456 cout << "\t" << InstrList << "\t" << SrcMask << ",r14" << endl;
457 }
458 cout << endl;
459
460 for (cGenMask SrcMask(Mask_PureMem); !SrcMask.End(); SrcMask++)
461 for (cGenMask DestMask(Mask_Dest, Mask_Size32); !DestMask.End(); DestMask++)
462 cout << "\tmova:g\t" << SrcMask << "," << DestMask << endl;
463 for (cGenMask SrcMask(MModDisp16); !SrcMask.End(); SrcMask++)
464 cout << "\tmova:r\t" << SrcMask << ",r10.w" << endl;
465 cout << endl;
466
467 {
468 vector<const char*> Instructions({"qdel", "qins" });
469
470 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
471 {
472 for (cGenMask SrcMask(Mask_PureMem); !SrcMask.End(); SrcMask++)
473 {
474 unsigned DestOpMask = Mask_PureMem | (strcmp(InstrList.GetCurr(), "qins") ? MModReg : 0);
475
476 for (cGenMask DestMask(DestOpMask); !DestMask.End(); DestMask++)
477 cout << "\t" << InstrList << "\t" << SrcMask << "," << DestMask << endl;
478 }
479 }
480 }
481 cout << endl;
482
483 for (cGenMask SrcMask(Mask_Source, Mask_AllSize); !SrcMask.End(); SrcMask++)
484 for (cGenMask DestMask(Mask_Dest, Mask_AllSize); !DestMask.End(); DestMask++)
485 cout << "\trvby\t" << SrcMask << "," << DestMask << endl;
486 cout << endl;
487
488 {
489 vector<const char*> Instructions({"sha","shl"});
490
491 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
492 {
493 for (cGenMask SrcMask(Mask_Source, Mask_Size8); !SrcMask.End(); SrcMask++)
494 for (cGenMask DestMask(Mask_PureMem, Mask_AllSize); !DestMask.End(); DestMask++)
495 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << DestMask << endl;
496
497 for (cGenMask DestMask(Mask_PureMem, Mask_AllSize); !DestMask.End(); DestMask++)
498 cout << "\t" << InstrList << ":e\t#13," << DestMask << endl;
499
500 for (cGenMask DestMask(Mask_AllShort & ~(MModImm|MModPush|MModPop)); !DestMask.End(); DestMask++)
501 cout << "\t" << InstrList << ":q\t#-3," << DestMask << endl;
502 }
503 }
504 cout << endl;
505
506 {
507 vector<const char*> Instructions({"shxl", "shxr"});
508
509 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
510 for (cGenMask DestMask(Mask_PureDest, Mask_Size32); !DestMask.End(); DestMask++)
511 cout << "\t" << InstrList << ":g\t" << DestMask << endl;
512 }
513 cout << endl;
514
515 {
516 vector<const char*> Instructions({"chk","chk/n","chk/s"});
517
518 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
519 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
520 for (cGenMask BoundMask(Mask_MemGen-MModPop-MModPush); !BoundMask.End(); BoundMask++)
521 for (cGenMask SrcMask(Mask_Source); !SrcMask.End(); SrcMask++)
522 cout << "\t" << InstrList << ":g\t" << BoundMask << SizeMask << "," << SrcMask << SizeMask << ",r14" << SizeMask << endl;
523 }
524 cout << endl;
525
526 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
527 for (cGenMask SrcMask(Mask_Source); !SrcMask.End(); SrcMask++)
528 for (cGenMask DestMask(Mask_PureMem); !DestMask.End(); DestMask++)
529 cout << "\tcsi\tr7" << SizeMask << "," << SrcMask << SizeMask << "," << DestMask << SizeMask << endl;
530 cout << endl;
531
532 {
533 vector<const char*> Instructions({ "divx", "mulx" });
534
535 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
536 for (cSizeMask SizeMask(Mask_Size32); !SizeMask.End(); SizeMask++)
537 for (cGenMask SrcMask(Mask_Source); !SrcMask.End(); SrcMask++)
538 for (cGenMask DestMask(Mask_PureDest); !DestMask.End(); DestMask++)
539 cout << "\t" << InstrList << ":g\t" << SrcMask << SizeMask << "," << DestMask << SizeMask << "," << "r7" << SizeMask << endl;
540 }
541 cout << endl;
542
543 {
544 vector<const char*> Instructions({"bclr","bclri","bnot","bset","bseti","btst"});
545
546 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
547 {
548 unsigned BaseSizeMask;
549
550 if (!strcmp(InstrList.GetCurr(), "bclri"))
551 BaseSizeMask = Mask_Size8;
552 else if (!strcmp(InstrList.GetCurr(), "bseti"))
553 BaseSizeMask = Mask_Size8;
554 else
555 BaseSizeMask = Mask_AllSize;
556
557 for (cGenMask OffsetMask(Mask_Source, Mask_AllSize); !OffsetMask.End(); OffsetMask++)
558 for (cGenMask BaseMask(Mask_PureDest, BaseSizeMask); !BaseMask.End(); BaseMask++)
559 {
560 if ((BaseMask.GetCurrSize() == 0) || (BaseMask.GetCurrMode() == ModReg))
561 cout << "\t" << InstrList << ":g\t" << OffsetMask << "," << BaseMask << endl;
562 }
563
564 for (cGenMask BaseMask(Mask_PureDest, BaseSizeMask); !BaseMask.End(); BaseMask++)
565 {
566 if ((BaseMask.GetCurrSize() == 0) || (BaseMask.GetCurrMode() == ModReg))
567 cout << "\t" << InstrList << ":e\t#4," << BaseMask << endl;
568 }
569
570 if ((strcmp(InstrList.GetCurr(), "bclri"))
571 && (strcmp(InstrList.GetCurr(), "bnot")))
572 {
573 for (cGenMask BaseMask(Mask_AllShort & ~(MModImm | MModPop | MModPush), Mask_Size8); !BaseMask.End(); BaseMask++)
574 cout << "\t" << InstrList << ":q\t#4," << BaseMask << endl;
575 }
576 }
577 }
578 cout << endl;
579
580 {
581 vector<const char*> Instructions({"bfcmp", "bfcmpu", "bfins", "bfinsu" });
582
583 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
584 {
585 for (cGenMask SrcMask(MModImm|MModReg, Mask_Size32); !SrcMask.End(); SrcMask++)
586 for (cGenMask WidthMask(MModReg, Mask_Size32); !WidthMask.End(); WidthMask++)
587 for (cGenMask OffsetMask(Mask_Source, Mask_AllSize); !OffsetMask.End(); OffsetMask++)
588 for (cGenMask BaseMask(Mask_PureMem, Mask_Size32); !BaseMask.End(); BaseMask++)
589 cout << "\t" << InstrList << ":g:" << ((SrcMask.GetCurrMode() == ModReg) ? "r" : "i")
590 << "\t" << SrcMask << "," << OffsetMask << "," << WidthMask << "," << BaseMask << endl;
591
592 for (cGenMask SrcMask(MModImm|MModReg, Mask_Size32); !SrcMask.End(); SrcMask++)
593 for (cGenMask BaseMask(Mask_PureMem, Mask_Size32); !BaseMask.End(); BaseMask++)
594 cout << "\t" << InstrList << ":e:" << ((SrcMask.GetCurrMode() == ModReg) ? "r" : "i")
595 << "\t" << SrcMask << ",#22,#7," << BaseMask << endl;
596 }
597 }
598 cout << endl;
599
600 {
601 vector<const char*> Instructions({"bfext", "bfextu" });
602
603 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
604 {
605 for (cGenMask DestMask(MModReg, Mask_Size32); !DestMask.End(); DestMask++)
606 for (cGenMask WidthMask(MModReg, Mask_Size32); !WidthMask.End(); WidthMask++)
607 for (cGenMask OffsetMask(Mask_Source, Mask_AllSize); !OffsetMask.End(); OffsetMask++)
608 for (cGenMask BaseMask(Mask_PureMem, Mask_Size32); !BaseMask.End(); BaseMask++)
609 cout << "\t" << InstrList << ":g\t" << OffsetMask << "," << WidthMask << "," << BaseMask << "," << DestMask << endl;
610
611 for (cGenMask DestMask(MModReg, Mask_Size32); !DestMask.End(); DestMask++)
612 for (cGenMask BaseMask(Mask_PureMem, Mask_Size32); !BaseMask.End(); BaseMask++)
613 cout << "\t" << InstrList << ":e\t#22,#7," << BaseMask << "," << DestMask << endl;
614 }
615 }
616 cout << endl;
617
618 {
619 vector<const char*> Instructions({"bsch/0", "bsch/1" });
620
621 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
622 for (cGenMask SrcMask(Mask_Source, Mask_Size32); !SrcMask.End(); SrcMask++)
623 for (cGenMask OffsetMask(Mask_PureDest, Mask_AllSize); !OffsetMask.End(); OffsetMask++)
624 cout << "\t" << InstrList << ":g\t" << SrcMask << "," << OffsetMask << endl;
625 }
626 cout << endl;
627
628 {
629 vector<const char*> Instructions({"acb","scb" });
630
631 for (cGenMask StepMask(Mask_AllGen & ~MModPush, Mask_AllSize); !StepMask.End(); StepMask++)
632 for (cGenMask LimitMask(Mask_AllGen & ~MModPush, Mask_AllSize); !LimitMask.End(); LimitMask++)
633 for (cDispMask DispMask(Mask_AllSize); !DispMask.End(); DispMask++)
634 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
635 cout << "\t" << InstrList << ":g\t" << StepMask << ",R12" << *(reinterpret_cast<const cSizeMask*>(&LimitMask)) << "," << LimitMask << "," << DispMask << endl;
636
637 for (cGenMask LimitMask(Mask_AllGen & ~MModPush, Mask_AllSize); !LimitMask.End(); LimitMask++)
638 for (cDispMask DispMask(Mask_AllSize); !DispMask.End(); DispMask++)
639 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
640 cout << "\t" << InstrList << ":e\t#42,R13" << *(reinterpret_cast<const cSizeMask*>(&LimitMask)) << "," << LimitMask << "," << DispMask << endl;
641
642 for (cDispMask DispMask(Mask_AllSize); !DispMask.End(); DispMask++)
643 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
644 cout << "\t" << InstrList << ":q\t#1,R14.w,#23," << DispMask << endl;
645
646 for (cDispMask DispMask(Mask_AllSize); !DispMask.End(); DispMask++)
647 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
648 cout << "\t" << InstrList << ":r\t#1,R12.w,R14.w," << DispMask << endl;
649 }
650 cout << endl;
651
652 {
653 vector<const char*> Instructions({"bsr", "bra", "bxs", "bxc", "beq", "bne", "blt", "bge",
654 "ble", "bgt", "bvs", "bvc", "bms", "bmc", "bfs", "bfc" });
655
656 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
657 {
658 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
659 cout << "\t" << InstrList << ":g\t$+6" << SizeMask << endl;
660 cout << "\t" << InstrList << ":d\t$+6" << endl;
661 }
662 }
663 cout << endl;
664
665 {
666 vector<const char*> Instructions({"trap/xs", "trap/xc", "trap/eq", "trap/ne", "trap/lt", "trap/ge", "trap/le",
667 "trap/gt", "trap/vs", "trap/vc", "trap/ms", "trap/mc", "trap/fs", "trap/fc" });
668
669 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
670 cout << "\t" << InstrList << endl;
671 }
672 cout << endl;
673
674 cout << "\ttrapa\t#11" << endl << endl;
675
676 {
677 for (cGenMask SizeMask(MModReg|MModImm, Mask_AllSize); !SizeMask.End(); SizeMask++)
678 {
679 cout << "\tenter:g\t" << SizeMask << ",r3-r7" << endl;
680 cout << "\texitd:g\t" << "r3-r7," << SizeMask << endl;
681 }
682 cout << "\tenter:g\t#5,r3-r7" << endl;
683 cout << "\texitd:g\tr3-r7,#5" << endl;
684 }
685 cout << endl;
686
687 cout << "\twait\t#2" << endl << endl;
688
689 {
690 vector<const char*> Conditions({"ltu","geu","eq","ne","lt","ge","n"});
691 vector<const char*> Instructions({"smov","ssch"});
692 vector<const char*> Options({"","/f","/b"});
693
694 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
695 {
696 for (cInstrList ConditionList(Conditions); !ConditionList.End(); ConditionList++)
697 cout << "\tscmp" << "/" << ConditionList << SizeMask << endl;
698 cout << "\tscmp" << SizeMask << endl;
699 }
700 cout << endl;
701
702 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
703 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
704 for (cInstrList OptionList(Options); !OptionList.End(); OptionList++)
705 {
706 cout << "\t" << InstrList << OptionList << SizeMask << endl;
707 for (cInstrList ConditionList(Conditions); !ConditionList.End(); ConditionList++)
708 cout << "\t" << InstrList << "/" << ConditionList << OptionList << SizeMask << endl;
709 }
710 }
711 cout << endl;
712
713 for (cSizeMask SizeMask(Mask_AllSize); !SizeMask.End(); SizeMask++)
714 cout << "\tsstr" << SizeMask << endl;
715 cout << endl;
716
717 for (cGenMask SrcMask(MModIReg+MModDisp16+MModDisp32+MModAbs16+MModAbs32+MModPCRel16+MModPCRel32+MModPop); !SrcMask.End(); SrcMask++)
718 cout << "\tldm\t" << SrcMask << ",r0-r7/r12" << endl;
719 for (cGenMask DestMask(MModIReg+MModDisp16+MModDisp32+MModAbs16+MModAbs32+MModPCRel16+MModPCRel32+MModPush); !DestMask.End(); DestMask++)
720 cout << "\tstm\tr0-r7/r12," << DestMask << endl;
721 cout << endl;
722
723 {
724 vector<const char*> Instructions({"stc","stp"});
725
726 for (cInstrList InstrList(Instructions); !InstrList.End(); InstrList++)
727 for (cSizeMask SizeMask(strcmp(InstrList.GetCurr(), "stc") ? Mask_AllSize : Mask_Size32); !SizeMask.End(); SizeMask++)
728 for (cGenMask SrcMask(Mask_PureMem); !SrcMask.End(); SrcMask++)
729 for (cGenMask DestMask(Mask_Dest); !DestMask.End(); DestMask++)
730 cout << "\t" << InstrList << "\t" << SrcMask << SizeMask << "," << DestMask << SizeMask << endl;
731 }
732 cout << endl;
733
734 for (cGenMask SrcMask(MModReg | MModImm); !SrcMask.End(); SrcMask++)
735 cout << "\tjrng:g\t" << SrcMask << endl;
736 cout << "\tjrng:e\t#17" << endl;
737 }
738