OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [software/] [AS64/] [source/] [Thor.cpp] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2015-2016  Robert Finch, Stratford
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
// A64 - Assembler
9
//  - 64 bit CPU
10
//
11
// This source file is free software: you can redistribute it and/or modify 
12
// it under the terms of the GNU Lesser General Public License as published 
13
// by the Free Software Foundation, either version 3 of the License, or     
14
// (at your option) any later version.                                      
15
//                                                                          
16
// This source file is distributed in the hope that it will be useful,      
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
19
// GNU General Public License for more details.                             
20
//                                                                          
21
// You should have received a copy of the GNU General Public License        
22
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
23
//                                                                          
24
// ============================================================================
25
//
26
#include "stdafx.h"
27
//#include <futs.h>
28
 
29
#define BCC(x)       (((x) << 12)|0x38)
30
 
31
// Fixup types
32
#define FUT_C15       1
33
#define FUT_C40       2
34
#define FUT_C64       3
35
#define FUT_R27       4
36
 
37
extern int isIdentChar(char);
38
static void emitAlignedCode(int cd);
39
static void process_shifti(int oc, int fn);
40
static void ProcessEOL(int opt);
41
static void mem_operand(int64_t *disp, int *regA, int *regB, int *sc, int *md);
42
static void getSzDir(int *, int *);
43
 
44
extern int first_rodata;
45
extern int first_data;
46
extern int first_bss;
47
static int64_t ca;
48
extern int isInitializationData;
49
extern int use_gp;
50
extern int pass;
51
extern char first_org;
52
extern int htblmax;
53
 
54
int predicate;
55
int seg;
56
 
57
// This structure not used.
58
typedef struct tagInsn
59
{
60
    union {
61
        struct {
62
            unsigned int opcode : 7;
63
            unsigned int Ra : 5;
64
            unsigned int Rt : 5;
65
            unsigned int imm : 15;
66
        } ri;
67
        struct {
68
            unsigned int opcode : 7;
69
            unsigned int Ra : 5;
70
            unsigned int Rt : 5;
71
            unsigned int Rb : 5;
72
            unsigned int resv : 3;
73
            unsigned int funct : 7;
74
        } rr;
75
    };
76
};
77
 
78
static int isdelim(char ch)
79
{
80
    return ch==',' || ch=='[' || ch=='(' || ch==']' || ch==')' || ch=='.';
81
}
82
 
83
// ----------------------------------------------------------------------------
84
// ----------------------------------------------------------------------------
85
 
86
static int getPredreg()
87
{
88
    int pr;
89
 
90
    NextToken();
91
    if (token != tk_pred) {
92
        printf("%d expecting predicate register %d.\r\n", lineno, token);
93
        return -1;
94
    }
95
     if (isdigit(inptr[0]) && isdigit(inptr[1])) {
96
          pr = ((inptr[0]-'0' * 10) + (inptr[1]-'0'));
97
          inptr += 2;
98
     }
99
     else if (isdigit(inptr[0])) {
100
          pr = (inptr[0]-'0');
101
          inptr += 1;
102
     }
103
     NextToken();
104
     return pr;
105
}
106
 
107
 
108
// ----------------------------------------------------------------------------
109
// ----------------------------------------------------------------------------
110
 
111
static int getCodeareg()
112
{
113
    int pr;
114
 
115
    SkipSpaces();
116
    if (inptr[0]=='c' || inptr[0]=='C') {
117
         if (isdigit(inptr[1]) && (inptr[2]==',' || isdelim(inptr[2]) || isspace(inptr[2]))) {
118
              pr = (inptr[1]-'0');
119
              inptr += 2;
120
         }
121
         else if (isdigit(inptr[1]) && isdigit(inptr[2]) && (inptr[3]==',' || isdelim(inptr[3]) || isspace(inptr[3]))) {
122
              pr = ((inptr[1]-'0') * 10) + (inptr[2]-'0');
123
              inptr += 3;
124
         }
125
         else
126
             return -1;
127
    }
128
    else
129
        return -1;
130
     NextToken();
131
     return pr;
132
}
133
 
134
static int getTlbReg()
135
{
136
   int Tn;
137
 
138
   Tn = -1;
139
   SkipSpaces();
140
   if ((inptr[0]=='a' || inptr[0]=='A') &&
141
       (inptr[1]=='s' || inptr[1]=='S') &&
142
       (inptr[2]=='i' || inptr[2]=='I') &&
143
       (inptr[3]=='d' || inptr[3]=='D') &&
144
       !isIdentChar(inptr[4])) {
145
       inptr += 4;
146
       NextToken();
147
       return 7;
148
   }
149
   if ((inptr[0]=='d' || inptr[0]=='D') &&
150
       (inptr[1]=='m' || inptr[1]=='M') &&
151
       (inptr[2]=='a' || inptr[2]=='A') &&
152
       !isIdentChar(inptr[3])) {
153
       inptr += 3;
154
       NextToken();
155
       return 8;
156
   }
157
   if ((inptr[0]=='i' || inptr[0]=='I') &&
158
       (inptr[1]=='m' || inptr[1]=='M') &&
159
       (inptr[2]=='a' || inptr[2]=='A') &&
160
       !isIdentChar(inptr[3])) {
161
       inptr += 3;
162
       NextToken();
163
       return 9;
164
   }
165
   if ((inptr[0]=='i' || inptr[0]=='I') &&
166
       (inptr[1]=='n' || inptr[1]=='N') &&
167
       (inptr[2]=='d' || inptr[2]=='D') &&
168
       (inptr[3]=='e' || inptr[3]=='E') &&
169
       (inptr[4]=='x' || inptr[4]=='X') &&
170
       !isIdentChar(inptr[5])) {
171
       inptr += 5;
172
       NextToken();
173
       return 2;
174
   }
175
   if ((inptr[0]=='p' || inptr[0]=='P') &&
176
       (inptr[1]=='a' || inptr[1]=='A') &&
177
       (inptr[2]=='g' || inptr[2]=='G') &&
178
       (inptr[3]=='e' || inptr[3]=='E') &&
179
       (inptr[4]=='s' || inptr[4]=='S') &&
180
       (inptr[5]=='i' || inptr[5]=='I') &&
181
       (inptr[6]=='z' || inptr[6]=='Z') &&
182
       (inptr[7]=='e' || inptr[7]=='E') &&
183
       !isIdentChar(inptr[8])) {
184
       inptr += 8;
185
       NextToken();
186
       return 3;
187
   }
188
   if ((inptr[0]=='p' || inptr[0]=='P') &&
189
       (inptr[1]=='h' || inptr[1]=='H') &&
190
       (inptr[2]=='y' || inptr[2]=='Y') &&
191
       (inptr[3]=='s' || inptr[3]=='S') &&
192
       (inptr[4]=='p' || inptr[4]=='P') &&
193
       (inptr[5]=='a' || inptr[5]=='A') &&
194
       (inptr[6]=='g' || inptr[6]=='G') &&
195
       (inptr[7]=='e' || inptr[7]=='E') &&
196
       !isIdentChar(inptr[8])) {
197
       inptr += 8;
198
       NextToken();
199
       return 5;
200
   }
201
   if ((inptr[0]=='p' || inptr[0]=='P') &&
202
       (inptr[1]=='t' || inptr[1]=='T') &&
203
       (inptr[2]=='a' || inptr[2]=='A') &&
204
       !isIdentChar(inptr[3])) {
205
       inptr += 3;
206
       NextToken();
207
       return 10;
208
   }
209
   if ((inptr[0]=='p' || inptr[0]=='P') &&
210
       (inptr[1]=='t' || inptr[1]=='T') &&
211
       (inptr[2]=='c' || inptr[2]=='C') &&
212
       !isIdentChar(inptr[3])) {
213
       inptr += 3;
214
       NextToken();
215
       return 11;
216
   }
217
   if ((inptr[0]=='r' || inptr[0]=='R') &&
218
       (inptr[1]=='a' || inptr[1]=='A') &&
219
       (inptr[2]=='n' || inptr[2]=='N') &&
220
       (inptr[3]=='d' || inptr[3]=='D') &&
221
       (inptr[4]=='o' || inptr[4]=='O') &&
222
       (inptr[5]=='m' || inptr[5]=='M') &&
223
       !isIdentChar(inptr[6])) {
224
       inptr += 6;
225
       NextToken();
226
       return 2;
227
   }
228
   if ((inptr[0]=='v' || inptr[0]=='V') &&
229
       (inptr[1]=='i' || inptr[1]=='I') &&
230
       (inptr[2]=='r' || inptr[2]=='R') &&
231
       (inptr[3]=='t' || inptr[3]=='T') &&
232
       (inptr[4]=='p' || inptr[4]=='P') &&
233
       (inptr[5]=='a' || inptr[5]=='A') &&
234
       (inptr[6]=='g' || inptr[6]=='G') &&
235
       (inptr[7]=='e' || inptr[7]=='E') &&
236
       !isIdentChar(inptr[8])) {
237
       inptr += 8;
238
       NextToken();
239
       return 4;
240
   }
241
   if ((inptr[0]=='w' || inptr[0]=='W') &&
242
       (inptr[1]=='i' || inptr[1]=='I') &&
243
       (inptr[2]=='r' || inptr[2]=='R') &&
244
       (inptr[3]=='e' || inptr[3]=='E') &&
245
       (inptr[4]=='d' || inptr[4]=='D') &&
246
       !isIdentChar(inptr[5])) {
247
       inptr += 5;
248
       NextToken();
249
       return 0;
250
   }
251
   return Tn;
252
}
253
 
254
// ----------------------------------------------------------------------------
255
// ----------------------------------------------------------------------------
256
static int getBitno()
257
{
258
    int bit;
259
 
260
    bit = -1;
261
    while(isspace(*inptr)) inptr++;
262
    switch(*inptr) {
263
    case 'b': case 'B':
264
         if (isdigit(inptr[1])) {
265
             bit = inptr[1]-'0';
266
             if (isdigit(inptr[2])) {
267
                 bit = 10 * bit + (inptr[2]-'0');
268
                 if (isIdentChar(inptr[3]))
269
                     return -1;
270
                 else {
271
                     inptr += 3;
272
                     NextToken();
273
                     return bit;
274
                 }
275
             }
276
             else if (isIdentChar(inptr[2]))
277
                 return -1;
278
             else {
279
                 inptr += 2;
280
                 NextToken();
281
                 return bit;
282
             }
283
         }
284
         else return -1;
285
    }
286
    return bit;
287
}
288
 
289
 
290
// ----------------------------------------------------------------------------
291
// Return the register number or -1 if not a register.
292
// Parses pretty register names like SP or BP in addition to r1,r2,etc.
293
// ----------------------------------------------------------------------------
294
 
295
static int getRegisterX()
296
{
297
    int reg;
298
 
299
    while(isspace(*inptr)) inptr++;
300
    switch(*inptr) {
301
    case 'r': case 'R':
302
         if (isdigit(inptr[1])) {
303
             reg = inptr[1]-'0';
304
             if (isdigit(inptr[2])) {
305
                 reg = 10 * reg + (inptr[2]-'0');
306
                 if (isdigit(inptr[3])) {
307
                     reg = 10 * reg + (inptr[3]-'0');
308
                     if (isIdentChar(inptr[4]))
309
                         return -1;
310
                     inptr += 4;
311
                     NextToken();
312
                     return reg;
313
                 }
314
                 else if (isIdentChar(inptr[3]))
315
                     return -1;
316
                 else {
317
                     inptr += 3;
318
                     NextToken();
319
                     return reg;
320
                 }
321
             }
322
             else if (isIdentChar(inptr[2]))
323
                 return -1;
324
             else {
325
                 inptr += 2;
326
                 NextToken();
327
                 return reg;
328
             }
329
         }
330
         else return -1;
331
    case 'b': case 'B':
332
        if ((inptr[1]=='P' || inptr[1]=='p') && !isIdentChar(inptr[2])) {
333
            inptr += 2;
334
            NextToken();
335
            return 26;
336
        }
337
        break;
338
    case 'g': case 'G':
339
        if ((inptr[1]=='P' || inptr[1]=='p') && !isIdentChar(inptr[2])) {
340
            inptr += 2;
341
            NextToken();
342
            return 25;
343
        }
344
        break;
345
    case 's': case 'S':
346
        if ((inptr[1]=='P' || inptr[1]=='p') && !isIdentChar(inptr[2])) {
347
            inptr += 2;
348
            NextToken();
349
            return 27;
350
        }
351
        break;
352
    case 't': case 'T':
353
        if ((inptr[1]=='P' || inptr[1]=='p') && !isIdentChar(inptr[2])) {
354
            inptr += 2;
355
            NextToken();
356
            return 24;
357
        }
358
        if ((inptr[1]=='R' || inptr[1]=='r') && !isIdentChar(inptr[2])) {
359
            inptr += 2;
360
            NextToken();
361
            return 31;
362
        }
363
        break;
364
    default:
365
        return -1;
366
    }
367
    return -1;
368
}
369
 
370
 
371
static int getBoundsRegister()
372
{
373
    int reg;
374
 
375
    while(isspace(*inptr)) inptr++;
376
    switch(*inptr) {
377
    case 'b': case 'B':
378
         if (isdigit(inptr[1])) {
379
             reg = inptr[1]-'0';
380
             if (isdigit(inptr[2])) {
381
                 reg = 10 * reg + (inptr[2]-'0');
382
                 if (isdigit(inptr[3])) {
383
                     reg = 10 * reg + (inptr[3]-'0');
384
                     if (isIdentChar(inptr[4]))
385
                         return -1;
386
                     inptr += 4;
387
                     NextToken();
388
                     return reg;
389
                 }
390
                 else if (isIdentChar(inptr[3]))
391
                     return -1;
392
                 else {
393
                     inptr += 3;
394
                     NextToken();
395
                     return reg;
396
                 }
397
             }
398
             else if (isIdentChar(inptr[2]))
399
                 return -1;
400
             else {
401
                 inptr += 2;
402
                 NextToken();
403
                 return reg;
404
             }
405
         }
406
         else return -1;
407
    }
408
    return -1;
409
}
410
 
411
 
412
// ----------------------------------------------------------------------------
413
// Get the friendly name of a special purpose register.
414
// ----------------------------------------------------------------------------
415
 
416
static int Thor_getSprRegister()
417
{
418
    int reg;
419
    int pr;
420
 
421
    while(isspace(*inptr)) inptr++;
422
    reg = getCodeareg();
423
    if (reg >= 0) {
424
       reg |= 0x10;
425
       return reg;
426
    }
427
    if (inptr[0]=='p' || inptr[0]=='P') {
428
         if (isdigit(inptr[1]) && isdigit(inptr[2])) {
429
              pr = ((inptr[1]-'0' * 10) + (inptr[2]-'0'));
430
              if (!isIdentChar(inptr[3])) {
431
                  inptr += 3;
432
                  NextToken();
433
                  return pr | 0x40;
434
              }
435
         }
436
         else if (isdigit(inptr[1])) {
437
              pr = (inptr[1]-'0');
438
              if (!isIdentChar(inptr[2])) {
439
                  inptr += 2;
440
                  NextToken();
441
                  return pr | 0x40;
442
              }
443
         }
444
     }
445
 
446
    while(isspace(*inptr)) inptr++;
447
    switch(*inptr) {
448
 
449
    case '0':
450
    case '1':
451
    case '2':
452
    case '3':
453
    case '4':
454
    case '5':
455
    case '6':
456
    case '7':
457
    case '8':
458
    case '9':
459
         NextToken();
460
         NextToken();
461
         return ival.low;
462
 
463
    // arg1
464
    case 'a': case 'A':
465
         if ((inptr[1]=='r' || inptr[1]=='R') &&
466
             (inptr[2]=='g' || inptr[2]=='G') &&
467
             (inptr[3]=='1' || inptr[3]=='1') &&
468
             !isIdentChar(inptr[4])) {
469
             inptr += 4;
470
             NextToken();
471
             return 58;
472
         }
473
         break;
474
    // bear
475
    case 'b': case 'B':
476
         if ((inptr[1]=='e' || inptr[1]=='E') &&
477
             (inptr[2]=='a' || inptr[2]=='A') &&
478
             (inptr[3]=='r' || inptr[3]=='R') &&
479
             !isIdentChar(inptr[4])) {
480
             inptr += 4;
481
             NextToken();
482
             return 11;
483
         }
484
         break;
485
    // cas clk cr0 cr3 cs CPL
486
    case 'c': case 'C':
487
         if ((inptr[1]=='a' || inptr[1]=='A') &&
488
             (inptr[2]=='s' || inptr[2]=='S') &&
489
             !isIdentChar(inptr[3])) {
490
             inptr += 3;
491
             NextToken();
492
             return 44;
493
         }
494
         if ((inptr[1]=='l' || inptr[1]=='L') &&
495
             (inptr[2]=='k' || inptr[2]=='K') &&
496
             !isIdentChar(inptr[3])) {
497
             inptr += 3;
498
             NextToken();
499
             return 0x06;
500
         }
501
         if ((inptr[1]=='r' || inptr[1]=='R') &&
502
             (inptr[2]=='0') &&
503
             !isIdentChar(inptr[3])) {
504
             inptr += 3;
505
             NextToken();
506
             return 0x00;
507
         }
508
         if ((inptr[1]=='r' || inptr[1]=='R') &&
509
             (inptr[2]=='3') &&
510
             !isIdentChar(inptr[3])) {
511
             inptr += 3;
512
             NextToken();
513
             return 0x03;
514
         }
515
        if ((inptr[1]=='s' || inptr[1]=='S') &&
516
            !isIdentChar(inptr[2])) {
517
            if (inptr[2]=='.') {
518
               if ((inptr[3]=='l' || inptr[3]=='L') &&
519
                   (inptr[4]=='m' || inptr[4]=='M') &&
520
                   (inptr[5]=='t' || inptr[5]=='T') &&
521
                   !isIdentChar(inptr[6])) {
522
                       inptr += 6;
523
                       NextToken();
524
                       return 0x2F;
525
               }
526
            }
527
            inptr += 2;
528
            NextToken();
529
            return 0x27;
530
        }
531
         if ((inptr[1]=='p' || inptr[1]=='P') &&
532
             (inptr[2]=='l' || inptr[2]=='L') &&
533
             !isIdentChar(inptr[3])) {
534
             inptr += 3;
535
             NextToken();
536
             return 42;
537
         }
538
         break;
539
 
540
    // dbad0 dbad1 dbctrl dpc dsp ds
541
    case 'd': case 'D':
542
         if ((inptr[1]=='b' || inptr[1]=='B') &&
543
             (inptr[2]=='a' || inptr[2]=='A') &&
544
             (inptr[3]=='d' || inptr[3]=='D') &&
545
             (inptr[4]=='0' || inptr[4]=='0') &&
546
             !isIdentChar(inptr[5])) {
547
             inptr += 5;
548
             NextToken();
549
             return 50;
550
         }
551
         if ((inptr[1]=='b' || inptr[1]=='B') &&
552
             (inptr[2]=='a' || inptr[2]=='A') &&
553
             (inptr[3]=='d' || inptr[3]=='D') &&
554
             (inptr[4]=='1' || inptr[4]=='1') &&
555
             !isIdentChar(inptr[5])) {
556
             inptr += 5;
557
             NextToken();
558
             return 51;
559
         }
560
         if ((inptr[1]=='b' || inptr[1]=='B') &&
561
             (inptr[2]=='a' || inptr[2]=='A') &&
562
             (inptr[3]=='d' || inptr[3]=='D') &&
563
             (inptr[4]=='2' || inptr[4]=='2') &&
564
             !isIdentChar(inptr[5])) {
565
             inptr += 5;
566
             NextToken();
567
             return 52;
568
         }
569
         if ((inptr[1]=='b' || inptr[1]=='B') &&
570
             (inptr[2]=='a' || inptr[2]=='A') &&
571
             (inptr[3]=='d' || inptr[3]=='D') &&
572
             (inptr[4]=='3' || inptr[4]=='3') &&
573
             !isIdentChar(inptr[5])) {
574
             inptr += 5;
575
             NextToken();
576
             return 53;
577
         }
578
         if ((inptr[1]=='b' || inptr[1]=='B') &&
579
             (inptr[2]=='c' || inptr[2]=='C') &&
580
             (inptr[3]=='t' || inptr[3]=='T') &&
581
             (inptr[4]=='r' || inptr[4]=='R') &&
582
             (inptr[5]=='l' || inptr[5]=='L') &&
583
             !isIdentChar(inptr[6])) {
584
             inptr += 6;
585
             NextToken();
586
             return 54;
587
         }
588
         if ((inptr[1]=='p' || inptr[1]=='P') &&
589
             (inptr[2]=='c' || inptr[2]=='C') &&
590
             !isIdentChar(inptr[3])) {
591
             inptr += 3;
592
             NextToken();
593
             return 7;
594
         }
595
         if (
596
             (inptr[1]=='b' || inptr[1]=='B') &&
597
             (inptr[2]=='p' || inptr[2]=='P') &&
598
             (inptr[3]=='c' || inptr[3]=='C') &&
599
             !isIdentChar(inptr[4])) {
600
             inptr += 4;
601
             NextToken();
602
             return 7;
603
         }
604
         if ((inptr[1]=='s' || inptr[1]=='S') &&
605
             (inptr[2]=='p' || inptr[2]=='P') &&
606
             !isIdentChar(inptr[3])) {
607
             inptr += 3;
608
             NextToken();
609
             return 16;
610
         }
611
        if ((inptr[1]=='s' || inptr[1]=='S') &&
612
            !isIdentChar(inptr[2])) {
613
            if (inptr[2]=='.') {
614
               if ((inptr[3]=='l' || inptr[3]=='L') &&
615
                   (inptr[4]=='m' || inptr[4]=='M') &&
616
                   (inptr[5]=='t' || inptr[5]=='T') &&
617
                   !isIdentChar(inptr[6])) {
618
                       inptr += 6;
619
                       NextToken();
620
                       return 0x29;
621
               }
622
            }
623
            inptr += 2;
624
            NextToken();
625
            return 0x21;
626
        }
627
         break;
628
 
629
    // ea epc esp es
630
    case 'e': case 'E':
631
         if ((inptr[1]=='a' || inptr[1]=='A') &&
632
             !isIdentChar(inptr[2])) {
633
             inptr += 2;
634
             NextToken();
635
             return 40;
636
         }
637
         if ((inptr[1]=='p' || inptr[1]=='P') &&
638
             (inptr[2]=='c' || inptr[2]=='C') &&
639
             !isIdentChar(inptr[3])) {
640
             inptr += 3;
641
             NextToken();
642
             return 9;
643
         }
644
         if ((inptr[1]=='s' || inptr[1]=='S') &&
645
             (inptr[2]=='p' || inptr[2]=='P') &&
646
             !isIdentChar(inptr[3])) {
647
             inptr += 3;
648
             NextToken();
649
             return 17;
650
         }
651
        if ((inptr[1]=='s' || inptr[1]=='S') &&
652
            !isIdentChar(inptr[2])) {
653
            if (inptr[2]=='.') {
654
               if ((inptr[3]=='l' || inptr[3]=='L') &&
655
                   (inptr[4]=='m' || inptr[4]=='M') &&
656
                   (inptr[5]=='t' || inptr[5]=='T') &&
657
                   !isIdentChar(inptr[6])) {
658
                       inptr += 6;
659
                       NextToken();
660
                       return 0x2A;
661
               }
662
            }
663
            inptr += 2;
664
            NextToken();
665
            return 0x22;
666
        }
667
         break;
668
 
669
    // fault_pc fs
670
    case 'f': case 'F':
671
         if ((inptr[1]=='a' || inptr[1]=='A') &&
672
             (inptr[2]=='u' || inptr[2]=='U') &&
673
             (inptr[3]=='l' || inptr[3]=='L') &&
674
             (inptr[4]=='t' || inptr[4]=='T') &&
675
             (inptr[5]=='_' || inptr[5]=='_') &&
676
             (inptr[6]=='p' || inptr[6]=='P') &&
677
             (inptr[7]=='c' || inptr[7]=='C') &&
678
             !isIdentChar(inptr[8])) {
679
             inptr += 8;
680
             NextToken();
681
             return 0x08;
682
         }
683
        if ((inptr[1]=='s' || inptr[1]=='S') &&
684
            !isIdentChar(inptr[2])) {
685
            if (inptr[2]=='.') {
686
               if ((inptr[3]=='l' || inptr[3]=='L') &&
687
                   (inptr[4]=='m' || inptr[4]=='M') &&
688
                   (inptr[5]=='t' || inptr[5]=='T') &&
689
                   !isIdentChar(inptr[6])) {
690
                       inptr += 6;
691
                       NextToken();
692
                       return 0x2B;
693
               }
694
            }
695
            inptr += 2;
696
            NextToken();
697
            return 0x23;
698
        }
699
         break;
700
 
701
    // gs GDT
702
    case 'g': case 'G':
703
        if ((inptr[1]=='s' || inptr[1]=='S') &&
704
            !isIdentChar(inptr[2])) {
705
            if (inptr[2]=='.') {
706
               if ((inptr[3]=='l' || inptr[3]=='L') &&
707
                   (inptr[4]=='m' || inptr[4]=='M') &&
708
                   (inptr[5]=='t' || inptr[5]=='T') &&
709
                   !isIdentChar(inptr[6])) {
710
                       inptr += 6;
711
                       NextToken();
712
                       return 0x2C;
713
               }
714
            }
715
            inptr += 2;
716
            NextToken();
717
            return 0x24;
718
        }
719
        if ((inptr[1]=='d' || inptr[1]=='D') &&
720
           (inptr[2]=='t' || inptr[2]=='T') &&
721
            !isIdentChar(inptr[3])) {
722
            inptr += 3;
723
            NextToken();
724
            return 41;
725
        }
726
        break;
727
 
728
    // history
729
    case 'h': case 'H':
730
         if ((inptr[1]=='i' || inptr[1]=='I') &&
731
             (inptr[2]=='s' || inptr[2]=='S') &&
732
             (inptr[3]=='t' || inptr[3]=='T') &&
733
             (inptr[4]=='o' || inptr[4]=='O') &&
734
             (inptr[5]=='r' || inptr[5]=='R') &&
735
             (inptr[6]=='y' || inptr[6]=='Y') &&
736
             !isIdentChar(inptr[7])) {
737
             inptr += 7;
738
             NextToken();
739
             return 0x0D;
740
         }
741
        if ((inptr[1]=='s' || inptr[1]=='S') &&
742
            !isIdentChar(inptr[2])) {
743
            if (inptr[2]=='.') {
744
               if ((inptr[3]=='l' || inptr[3]=='L') &&
745
                   (inptr[4]=='m' || inptr[4]=='M') &&
746
                   (inptr[5]=='t' || inptr[5]=='T') &&
747
                   !isIdentChar(inptr[6])) {
748
                       inptr += 6;
749
                       NextToken();
750
                       return 0x2D;
751
               }
752
            }
753
            inptr += 2;
754
            NextToken();
755
            return 0x25;
756
        }
757
         break;
758
 
759
    // ipc isp ivno
760
    case 'i': case 'I':
761
         if ((inptr[1]=='p' || inptr[1]=='P') &&
762
             (inptr[2]=='c' || inptr[2]=='C') &&
763
             !isIdentChar(inptr[3])) {
764
             inptr += 3;
765
             NextToken();
766
             return 8;
767
         }
768
         if ((inptr[1]=='s' || inptr[1]=='S') &&
769
             (inptr[2]=='p' || inptr[2]=='P') &&
770
             !isIdentChar(inptr[3])) {
771
             inptr += 3;
772
             NextToken();
773
             return 15;
774
         }
775
         if ((inptr[1]=='v' || inptr[1]=='V') &&
776
             (inptr[2]=='n' || inptr[2]=='N') &&
777
             (inptr[3]=='o' || inptr[3]=='O') &&
778
             !isIdentChar(inptr[4])) {
779
             inptr += 4;
780
             NextToken();
781
             return 0x0C;
782
         }
783
         break;
784
 
785
 
786
    // LC LDT
787
    case 'l': case 'L':
788
         if ((inptr[1]=='c' || inptr[1]=='C') &&
789
             !isIdentChar(inptr[2])) {
790
             inptr += 2;
791
             NextToken();
792
             return 0x33;
793
         }
794
         if ((inptr[1]=='d' || inptr[1]=='D') &&
795
            (inptr[2]=='t' || inptr[2]=='T') &&
796
             !isIdentChar(inptr[3])) {
797
             inptr += 3;
798
             NextToken();
799
             return 40;
800
         }
801
         break;
802
 
803
    // pregs
804
    case 'p': case 'P':
805
         if ((inptr[1]=='r' || inptr[1]=='R') &&
806
             (inptr[2]=='e' || inptr[2]=='E') &&
807
             (inptr[3]=='g' || inptr[3]=='G') &&
808
             (inptr[4]=='s' || inptr[4]=='S') &&
809
             !isIdentChar(inptr[5])) {
810
             inptr += 5;
811
             NextToken();
812
             return 52;
813
         }
814
         break;
815
 
816
    // rand
817
    case 'r': case 'R':
818
         if ((inptr[1]=='a' || inptr[1]=='A') &&
819
             (inptr[2]=='n' || inptr[2]=='N') &&
820
             (inptr[3]=='d' || inptr[3]=='D') &&
821
             !isIdentChar(inptr[4])) {
822
             inptr += 4;
823
             NextToken();
824
             return 0x12;
825
         }
826
         break;
827
    // ss_ll srand1 srand2 ss segsw segbase seglmt segacr
828
    case 's': case 'S':
829
         if ((inptr[1]=='s' || inptr[1]=='S') &&
830
             (inptr[2]=='_' || inptr[2]=='_') &&
831
             (inptr[3]=='l' || inptr[3]=='L') &&
832
             (inptr[4]=='l' || inptr[4]=='L') &&
833
             !isIdentChar(inptr[5])) {
834
             inptr += 5;
835
             NextToken();
836
             return 0x1A;
837
         }
838
         if ((inptr[1]=='r' || inptr[1]=='R') &&
839
             (inptr[2]=='a' || inptr[2]=='A') &&
840
             (inptr[3]=='n' || inptr[3]=='N') &&
841
             (inptr[4]=='d' || inptr[4]=='D') &&
842
             (inptr[5]=='1') &&
843
             !isIdentChar(inptr[6])) {
844
             inptr += 6;
845
             NextToken();
846
             return 0x10;
847
         }
848
         if ((inptr[1]=='r' || inptr[1]=='R') &&
849
             (inptr[2]=='a' || inptr[2]=='A') &&
850
             (inptr[3]=='n' || inptr[3]=='N') &&
851
             (inptr[4]=='d' || inptr[4]=='D') &&
852
             (inptr[5]=='2') &&
853
             !isIdentChar(inptr[6])) {
854
             inptr += 6;
855
             NextToken();
856
             return 0x11;
857
         }
858
         if ((inptr[1]=='p' || inptr[1]=='P') &&
859
             (inptr[2]=='r' || inptr[2]=='R') &&
860
             isdigit(inptr[3]) && isdigit(inptr[4]) &&
861
             !isIdentChar(inptr[5])) {
862
             inptr += 5;
863
             NextToken();
864
             return (inptr[3]-'0')*10 + (inptr[4]-'0');
865
         }
866
        if ((inptr[1]=='s' || inptr[1]=='S') &&
867
            !isIdentChar(inptr[2])) {
868
            if (inptr[2]=='.') {
869
               if ((inptr[3]=='l' || inptr[3]=='L') &&
870
                   (inptr[4]=='m' || inptr[4]=='M') &&
871
                   (inptr[5]=='t' || inptr[5]=='T') &&
872
                   !isIdentChar(inptr[6])) {
873
                       inptr += 6;
874
                       NextToken();
875
                       return 0x2E;
876
               }
877
            }
878
            inptr += 2;
879
            NextToken();
880
            return 0x26;
881
         }
882
         // segxxx
883
         if ((inptr[1]=='e' || inptr[1]=='E') &&
884
             (inptr[2]=='g' || inptr[2]=='G')) {
885
             // segsw
886
             if ((inptr[3]=='s' || inptr[3]=='S') &&
887
                  (inptr[4]=='w' || inptr[4]=='W') &&
888
                  !isIdentChar(inptr[5])) {
889
               inptr += 5;
890
               NextToken();
891
               return 43;
892
             }
893
             // segbase
894
             if ((inptr[3]=='b' || inptr[3]=='B') &&
895
                  (inptr[4]=='a' || inptr[4]=='A') &&
896
                  (inptr[5]=='s' || inptr[5]=='S') &&
897
                  (inptr[6]=='e' || inptr[6]=='E') &&
898
                  !isIdentChar(inptr[7])) {
899
               inptr += 7;
900
               NextToken();
901
               return 44;
902
             }
903
             // seglmt
904
             if ((inptr[3]=='l' || inptr[3]=='L') &&
905
                  (inptr[4]=='m' || inptr[4]=='M') &&
906
                  (inptr[5]=='t' || inptr[5]=='T') &&
907
                  !isIdentChar(inptr[6])) {
908
               inptr += 6;
909
               NextToken();
910
               return 45;
911
             }
912
             // segacr
913
             if ((inptr[3]=='a' || inptr[3]=='A') &&
914
                  (inptr[4]=='c' || inptr[4]=='C') &&
915
                  (inptr[5]=='r' || inptr[5]=='R') &&
916
                  !isIdentChar(inptr[6])) {
917
               inptr += 6;
918
               NextToken();
919
               return 47;
920
             }
921
         }
922
         break;
923
 
924
    // tag tick 
925
    case 't': case 'T':
926
         if ((inptr[1]=='i' || inptr[1]=='I') &&
927
             (inptr[2]=='c' || inptr[2]=='C') &&
928
             (inptr[3]=='k' || inptr[3]=='K') &&
929
             !isIdentChar(inptr[4])) {
930
             inptr += 4;
931
             NextToken();
932
             return 0x32;
933
         }
934
         if ((inptr[1]=='a' || inptr[1]=='A') &&
935
             (inptr[2]=='g' || inptr[2]=='G') &&
936
             !isIdentChar(inptr[3])) {
937
             inptr += 3;
938
             NextToken();
939
             return 41;
940
         }
941
         break;
942
 
943
    // vbr
944
    case 'v': case 'V':
945
         if ((inptr[1]=='b' || inptr[1]=='B') &&
946
             (inptr[2]=='r' || inptr[2]=='R') &&
947
             !isIdentChar(inptr[3])) {
948
             inptr += 3;
949
             NextToken();
950
             return 10;
951
         }
952
         break;
953
    case 'z': case 'Z':
954
        if ((inptr[1]=='s' || inptr[1]=='S') &&
955
            !isIdentChar(inptr[2])) {
956
            if (inptr[2]=='.') {
957
               if ((inptr[3]=='l' || inptr[3]=='L') &&
958
                   (inptr[4]=='m' || inptr[4]=='M') &&
959
                   (inptr[5]=='t' || inptr[5]=='T') &&
960
                   !isIdentChar(inptr[6])) {
961
                       inptr += 6;
962
                       NextToken();
963
                       return 0x28;
964
               }
965
            }
966
            inptr += 2;
967
            NextToken();
968
            return 0x20;
969
        }
970
        break;
971
    }
972
    return -1;
973
}
974
 
975
static int getPredcon()
976
{
977
    // longer match sequences must be first
978
    if ((inptr[0]=='l' || inptr[0]=='L') && (inptr[1]=='e' || inptr[1]=='E') && (inptr[2]=='u' || inptr[2]=='U')) {
979
        inptr += 3;
980
        return 8;
981
    }
982
    if ((inptr[0]=='g' || inptr[0]=='G') && (inptr[1]=='t' || inptr[1]=='T') && (inptr[2]=='u' || inptr[2]=='U')) {
983
        inptr += 3;
984
        return 9;
985
    }
986
    if ((inptr[0]=='g' || inptr[0]=='G') && (inptr[1]=='e' || inptr[1]=='E') && (inptr[2]=='u' || inptr[2]=='U')) {
987
        inptr += 3;
988
        return 10;
989
    }
990
    if ((inptr[0]=='l' || inptr[0]=='L') && (inptr[1]=='t' || inptr[1]=='T') && (inptr[2]=='u' || inptr[2]=='U')) {
991
        inptr += 3;
992
        return 11;
993
    }
994
    if (inptr[0]=='f' || inptr[0]=='F') {
995
        inptr += 1;
996
        return 0;
997
    }
998
    if (inptr[0]=='t' || inptr[0]=='T') {
999
        inptr += 1;
1000
        return 1;
1001
    }
1002
    if ((inptr[0]=='e' || inptr[0]=='E') && (inptr[1]=='q' || inptr[1]=='Q')) {
1003
        inptr += 2;
1004
        return 2;
1005
    }
1006
    if ((inptr[0]=='n' || inptr[0]=='N') && (inptr[1]=='e' || inptr[1]=='E')) {
1007
        inptr += 2;
1008
        return 3;
1009
    }
1010
    if ((inptr[0]=='l' || inptr[0]=='L') && (inptr[1]=='e' || inptr[1]=='E')) {
1011
        inptr += 2;
1012
        return 4;
1013
    }
1014
    if ((inptr[0]=='g' || inptr[0]=='G') && (inptr[1]=='t' || inptr[1]=='T')) {
1015
        inptr += 2;
1016
        return 5;
1017
    }
1018
    if ((inptr[0]=='g' || inptr[0]=='G') && (inptr[1]=='e' || inptr[1]=='E')) {
1019
        inptr += 2;
1020
        return 6;
1021
    }
1022
    if ((inptr[0]=='l' || inptr[0]=='L') && (inptr[1]=='t' || inptr[1]=='T')) {
1023
        inptr += 2;
1024
        return 7;
1025
    }
1026
    return -1;
1027
}
1028
 
1029
// ---------------------------------------------------------------------------
1030
// ---------------------------------------------------------------------------
1031
 
1032
static void emit_first(int oc)
1033
{
1034
     emitCode(oc & 255);
1035
     num_bytes ++;
1036
     num_insns += 1;
1037
}
1038
 
1039
static void emit_insn(int oc)
1040
{
1041
     emitCode(oc & 255);
1042
     num_bytes ++;
1043
}
1044
 
1045
// ---------------------------------------------------------------------------
1046
// ---------------------------------------------------------------------------
1047
 
1048
static void emit_insn4(int64_t oc)
1049
{
1050
    int ndx;
1051
 
1052
    //printf("<emit_insn4>");
1053
    if (pass==3 && !expand_flag) {
1054
       for (ndx = 0; ndx < htblmax; ndx++) {
1055
         if (oc == hTable[ndx].opcode) {
1056
           hTable[ndx].count++;
1057
           return;
1058
         }
1059
       }
1060
       if (htblmax < 100000) {
1061
          hTable[htblmax].opcode = oc;
1062
          hTable[htblmax].count = 1;
1063
          htblmax++;
1064
          return;
1065
       }
1066
       printf("Too many instructions.\r\n");
1067
       return;
1068
    }
1069
    if (pass > 3) {
1070
      if (!expand_flag) {
1071
       for (ndx = 0; ndx < htblmax && ndx < 1024; ndx++) {
1072
         if (oc == hTable[ndx].opcode) {
1073
           emit_insn(0xE0|(ndx & 0xF));
1074
           emit_insn(ndx >> 4);
1075
           num_insns += 1;
1076
           return;
1077
         }
1078
       }
1079
     }
1080
     emit_insn(oc & 255);
1081
     emit_insn((oc >> 8) & 255);
1082
     emit_insn((oc >> 16) & 255);
1083
     emit_insn((oc >> 24) & 255);
1084
     num_insns += 1;
1085
   }
1086
//    printf("</emit_insn4>\r\n");
1087
}
1088
 
1089
 
1090
static void emit_insn4a(int64_t oc)
1091
{
1092
     emit_insn(oc & 255);
1093
     emit_insn((oc >> 8) & 255);
1094
     emit_insn((oc >> 16) & 255);
1095
     emit_insn((oc >> 24) & 255);
1096
     num_insns += 1;
1097
}
1098
 
1099
 
1100
static void emit_insn3(int64_t oc)
1101
{
1102
    int ndx;
1103
    if (pass==3 && !expand_flag) {
1104
       for (ndx = 0; ndx < htblmax; ndx++) {
1105
         if (oc == hTable[ndx].opcode) {
1106
           hTable[ndx].count++;
1107
           return;
1108
         }
1109
       }
1110
       if (htblmax < 100000) {
1111
          hTable[htblmax].opcode = oc;
1112
          hTable[htblmax].count = 1;
1113
          htblmax++;
1114
          return;
1115
       }
1116
       printf("Too many instructions.\r\n");
1117
       return;
1118
    }
1119
    if (pass > 3) {
1120
      if (!expand_flag) {
1121
       for (ndx = 0; ndx < htblmax && ndx < 1024; ndx++) {
1122
         if (oc == hTable[ndx].opcode) {
1123
           emit_insn(0xE0|(ndx & 0xF));
1124
           emit_insn(ndx >> 4);
1125
           num_insns += 1;
1126
           return;
1127
         }
1128
       }
1129
     }
1130
     emit_insn(oc & 255);
1131
     emit_insn((oc >> 8) & 255);
1132
     emit_insn((oc >> 16) & 255);
1133
     num_insns += 1;
1134
   }
1135
//     emit_insn(oc & 255);
1136
//     emit_insn((oc >> 8) & 255);
1137
//     emit_insn((oc >> 16) & 255);
1138
//     num_bytes += 3;
1139
//     num_insns += 1;
1140
}
1141
 
1142
 
1143
static void emit2(int64_t oc)
1144
{
1145
     emitAlignedCode(oc & 255);
1146
     num_bytes += 1;
1147
     emit_insn((oc >> 8) & 255);
1148
     num_insns += 1;
1149
}
1150
 
1151
static void emit6(int64_t oc)
1152
{
1153
     emitAlignedCode(oc & 255);
1154
     num_bytes += 1;
1155
     emit_insn((oc >> 8) & 255);
1156
     emit_insn((oc >> 16) & 255);
1157
     emit_insn((oc >> 24) & 255);
1158
     emit_insn((oc >> 32) & 255);
1159
     emit_insn((oc >> 40) & 255);
1160
     num_insns += 1;
1161
}
1162
 
1163
// ---------------------------------------------------------------------------
1164
// Emit code aligned to a code address.
1165
// ---------------------------------------------------------------------------
1166
 
1167
static void emitAlignedCode(int cd)
1168
{
1169
     int64_t ad;
1170
 
1171
 
1172
     ad = code_address & 15;
1173
     while (ad != 0 && ad != 2 && ad != 4 && ad != 6 &&
1174
            ad != 8 && ad != 10 && ad != 12 && ad != 14) {
1175
         emitByte(0x00);
1176
         ad = code_address & 15;
1177
     }
1178
 
1179
     emitByte(cd);
1180
}
1181
 
1182
 
1183
// ---------------------------------------------------------------------------
1184
// Determine how big of a prefix is required.
1185
// ---------------------------------------------------------------------------
1186
 
1187
static int fitsIn0(int64_t v)
1188
{
1189
    return (((v < 0) && ((v >> 14) == -1L)) || ((v >= 0) && ((v >> 14) == 0)));
1190
}
1191
 
1192
static int fitsIn28(int64_t v)
1193
{
1194
    return (((v < 0) && ((v >> 42) == -1L)) || ((v >= 0) && ((v >> 42) == 0)));
1195
}
1196
 
1197
static int fitsIn41(int64_t v)
1198
{
1199
    return (((v < 0) && ((v >> 55) == -1L)) || ((v >= 0) && ((v >> 55) == 0)));
1200
}
1201
 
1202
static int fitsIn10(int64_t v)
1203
{
1204
    return ((v < 0) && ((v >> 9) == -1L)) || ((v >= 0) && ((v >> 9) == 0));
1205
}
1206
 
1207
static int fitsIn8(int64_t v)
1208
{
1209
    return ((v < 0) && ((v >> 7) == -1L)) || ((v >= 0) && ((v >> 7) == 0));
1210
}
1211
 
1212
static int fitsIn9(int64_t v)
1213
{
1214
    return ((v < 0) && ((v >> 8) == -1L)) || ((v >= 0) && ((v >> 8) == 0));
1215
}
1216
 
1217
static int fitsIn12(int64_t v)
1218
{
1219
    return ((v < 0) && ((v >> 11) == -1L)) || ((v >= 0) && ((v >> 11) == 0));
1220
}
1221
 
1222
static int fitsIn16(int64_t v)
1223
{
1224
    return ((v < 0) && ((v >> 15) == -1L)) || ((v >= 0) && ((v >> 15) == 0));
1225
}
1226
 
1227
static int fitsIn24(int64_t v)
1228
{
1229
    return ((v < 0) && ((v >> 23) == -1L)) || ((v >= 0) && ((v >> 23) == 0));
1230
}
1231
 
1232
static int fitsIn32(int64_t v)
1233
{
1234
    return ((v < 0) && ((v >> 31) == -1L)) || ((v >= 0) && ((v >> 31) == 0));
1235
}
1236
 
1237
static int fitsIn40(int64_t v)
1238
{
1239
    return ((v < 0) && ((v >> 39) == -1L)) || ((v >= 0) && ((v >> 39) == 0));
1240
}
1241
 
1242
static int fitsIn48(int64_t v)
1243
{
1244
    return ((v < 0) && ((v >> 47) == -1L)) || ((v >= 0) && ((v >> 47) == 0));
1245
}
1246
 
1247
static int fitsIn56(int64_t v)
1248
{
1249
    return ((v < 0) && ((v >> 55) == -1L)) || ((v >= 0) && ((v >> 55) == 0));
1250
}
1251
 
1252
static int emitImm8(int64_t v, int force)
1253
{
1254
     if (fitsIn8(v))
1255
         return 0;
1256
     num_insns++;
1257
     if (fitsIn16(v)) {
1258
         emit_insn(0x20);
1259
         emit_insn(v >> 8);
1260
         return 1;
1261
     }
1262
     if (fitsIn24(v)) {
1263
         emit_insn(0x30);
1264
         emit_insn(v >> 8);
1265
         emit_insn(v >> 16);
1266
         return 1;
1267
     }
1268
     if (fitsIn32(v)) {
1269
         emit_insn(0x40);
1270
         emit_insn(v >> 8);
1271
         emit_insn(v >> 16);
1272
         emit_insn(v >> 24);
1273
         return 1;
1274
     }
1275
     if (fitsIn40(v)) {
1276
         emit_insn(0x50);
1277
         emit_insn(v >> 8);
1278
         emit_insn(v >> 16);
1279
         emit_insn(v >> 24);
1280
         emit_insn(v >> 32);
1281
         return 1;
1282
     }
1283
     if (fitsIn48(v)) {
1284
         emit_insn(0x60);
1285
         emit_insn(v >> 8);
1286
         emit_insn(v >> 16);
1287
         emit_insn(v >> 24);
1288
         emit_insn(v >> 32);
1289
         emit_insn(v >> 40);
1290
         return 1;
1291
     }
1292
     if (fitsIn56(v)) {
1293
         emit_insn(0x70);
1294
         emit_insn(v >> 8);
1295
         emit_insn(v >> 16);
1296
         emit_insn(v >> 24);
1297
         emit_insn(v >> 32);
1298
         emit_insn(v >> 40);
1299
         emit_insn(v >> 48);
1300
         return 1;
1301
     }
1302
     emit_insn(0x80);
1303
     emit_insn(v >> 8);
1304
     emit_insn(v >> 16);
1305
     emit_insn(v >> 24);
1306
     emit_insn(v >> 32);
1307
     emit_insn(v >> 40);
1308
     emit_insn(v >> 48);
1309
     emit_insn(v >> 56);
1310
     return 1;
1311
}
1312
 
1313
static int emitImm9(int64_t v, int force)
1314
{
1315
     if (force > 0 && force < 16) {
1316
        num_insns++;
1317
         emit_insn(0x20);
1318
         emit_insn(v >> 8);
1319
         return 1;
1320
     }
1321
     else if (force >= 16 && force < 24) {
1322
        num_insns++;
1323
         emit_insn(0x30);
1324
         emit_insn(v >> 8);
1325
         emit_insn(v >> 16);
1326
         return 1;
1327
     }
1328
     else if (force >= 24 && force < 32) {
1329
        num_insns++;
1330
         emit_insn(0x40);
1331
         emit_insn(v >> 8);
1332
         emit_insn(v >> 16);
1333
         emit_insn(v >> 24);
1334
         return 1;
1335
     }
1336
     else if (force >= 32 && force < 40) {
1337
        num_insns++;
1338
         emit_insn(0x50);
1339
         emit_insn(v >> 8);
1340
         emit_insn(v >> 16);
1341
         emit_insn(v >> 24);
1342
         emit_insn(v >> 32);
1343
         return 1;
1344
     }
1345
     else if (force >= 40 && force < 48) {
1346
        num_insns++;
1347
         emit_insn(0x60);
1348
         emit_insn(v >> 8);
1349
         emit_insn(v >> 16);
1350
         emit_insn(v >> 24);
1351
         emit_insn(v >> 32);
1352
         emit_insn(v >> 40);
1353
         return 1;
1354
     }
1355
     if (fitsIn9(v))
1356
         return 0;
1357
     if (fitsIn16(v)) {
1358
        num_insns++;
1359
         emit_insn(0x20);
1360
         emit_insn(v >> 8);
1361
         return 1;
1362
     }
1363
     if (fitsIn24(v)) {
1364
        num_insns++;
1365
         emit_insn(0x30);
1366
         emit_insn(v >> 8);
1367
         emit_insn(v >> 16);
1368
         return 1;
1369
     }
1370
     if (fitsIn32(v)) {
1371
        num_insns++;
1372
         emit_insn(0x40);
1373
         emit_insn(v >> 8);
1374
         emit_insn(v >> 16);
1375
         emit_insn(v >> 24);
1376
         return 1;
1377
     }
1378
     if (fitsIn40(v)) {
1379
        num_insns++;
1380
         emit_insn(0x50);
1381
         emit_insn(v >> 8);
1382
         emit_insn(v >> 16);
1383
         emit_insn(v >> 24);
1384
         emit_insn(v >> 32);
1385
         return 1;
1386
     }
1387
     if (fitsIn48(v)) {
1388
        num_insns++;
1389
         emit_insn(0x60);
1390
         emit_insn(v >> 8);
1391
         emit_insn(v >> 16);
1392
         emit_insn(v >> 24);
1393
         emit_insn(v >> 32);
1394
         emit_insn(v >> 40);
1395
         return 1;
1396
     }
1397
     if (fitsIn56(v)) {
1398
        num_insns++;
1399
         emit_insn(0x70);
1400
         emit_insn(v >> 8);
1401
         emit_insn(v >> 16);
1402
         emit_insn(v >> 24);
1403
         emit_insn(v >> 32);
1404
         emit_insn(v >> 40);
1405
         emit_insn(v >> 48);
1406
         return 1;
1407
     }
1408
        num_insns++;
1409
     emit_insn(0x80);
1410
     emit_insn(v >> 8);
1411
     emit_insn(v >> 16);
1412
     emit_insn(v >> 24);
1413
     emit_insn(v >> 32);
1414
     emit_insn(v >> 40);
1415
     emit_insn(v >> 48);
1416
     emit_insn(v >> 56);
1417
     return 1;
1418
}
1419
 
1420
static int emitImm10(int64_t v, int force)
1421
{
1422
    if (force > 0 && force < 16) {
1423
        num_insns++;
1424
         emit_insn(0x20);
1425
         emit_insn(v >> 8);
1426
         return 1;
1427
    }
1428
    else if (force >= 16 && force < 24) {
1429
        num_insns++;
1430
         emit_insn(0x30);
1431
         emit_insn(v >> 8);
1432
         emit_insn(v >> 16);
1433
         return 1;
1434
    }
1435
    else if (force >= 24 && force < 32) {
1436
        num_insns++;
1437
         emit_insn(0x40);
1438
         emit_insn(v >> 8);
1439
         emit_insn(v >> 16);
1440
         emit_insn(v >> 24);
1441
         return 1;
1442
    }
1443
    else if (force >= 32 && force < 40) {
1444
        num_insns++;
1445
         emit_insn(0x50);
1446
         emit_insn(v >> 8);
1447
         emit_insn(v >> 16);
1448
         emit_insn(v >> 24);
1449
         emit_insn(v >> 32);
1450
         return 1;
1451
    }
1452
    else if (force >= 40 && force < 48) {
1453
        num_insns++;
1454
         emit_insn(0x60);
1455
         emit_insn(v >> 8);
1456
         emit_insn(v >> 16);
1457
         emit_insn(v >> 24);
1458
         emit_insn(v >> 32);
1459
         emit_insn(v >> 40);
1460
         return 1;
1461
    }
1462
     if (fitsIn10(v))
1463
         return 0;
1464
     if (fitsIn16(v)) {
1465
        num_insns++;
1466
         emit_insn(0x20);
1467
         emit_insn(v >> 8);
1468
         return 1;
1469
     }
1470
     if (fitsIn24(v)) {
1471
        num_insns++;
1472
         emit_insn(0x30);
1473
         emit_insn(v >> 8);
1474
         emit_insn(v >> 16);
1475
         return 1;
1476
     }
1477
     if (fitsIn32(v)) {
1478
        num_insns++;
1479
         emit_insn(0x40);
1480
         emit_insn(v >> 8);
1481
         emit_insn(v >> 16);
1482
         emit_insn(v >> 24);
1483
         return 1;
1484
     }
1485
     if (fitsIn40(v)) {
1486
        num_insns++;
1487
         emit_insn(0x50);
1488
         emit_insn(v >> 8);
1489
         emit_insn(v >> 16);
1490
         emit_insn(v >> 24);
1491
         emit_insn(v >> 32);
1492
         return 1;
1493
     }
1494
     if (fitsIn48(v)) {
1495
        num_insns++;
1496
         emit_insn(0x60);
1497
         emit_insn(v >> 8);
1498
         emit_insn(v >> 16);
1499
         emit_insn(v >> 24);
1500
         emit_insn(v >> 32);
1501
         emit_insn(v >> 40);
1502
         return 1;
1503
     }
1504
     if (fitsIn56(v)) {
1505
        num_insns++;
1506
         emit_insn(0x70);
1507
         emit_insn(v >> 8);
1508
         emit_insn(v >> 16);
1509
         emit_insn(v >> 24);
1510
         emit_insn(v >> 32);
1511
         emit_insn(v >> 40);
1512
         emit_insn(v >> 48);
1513
         return 1;
1514
     }
1515
        num_insns++;
1516
     emit_insn(0x80);
1517
     emit_insn(v >> 8);
1518
     emit_insn(v >> 16);
1519
     emit_insn(v >> 24);
1520
     emit_insn(v >> 32);
1521
     emit_insn(v >> 40);
1522
     emit_insn(v >> 48);
1523
     emit_insn(v >> 56);
1524
     return 1;
1525
}
1526
 
1527
// Immediate constants RI instructions
1528
static int emitImm12(int64_t v, int force)
1529
{
1530
     if (force > 0 && force < 16) {
1531
        num_insns++;
1532
         emit_insn(0x20);
1533
         emit_insn(v >> 8);
1534
         return 1;
1535
     }
1536
     else if (force >= 16 && force < 24) {
1537
        num_insns++;
1538
         emit_insn(0x30);
1539
         emit_insn(v >> 8);
1540
         emit_insn(v >> 16);
1541
         return 1;
1542
     }
1543
     else if (force >= 24 && force < 32) {
1544
        num_insns++;
1545
         emit_insn(0x40);
1546
         emit_insn(v >> 8);
1547
         emit_insn(v >> 16);
1548
         emit_insn(v >> 24);
1549
         return 1;
1550
     }
1551
     else if (force >= 32 && force < 40) {
1552
        num_insns++;
1553
         emit_insn(0x50);
1554
         emit_insn(v >> 8);
1555
         emit_insn(v >> 16);
1556
         emit_insn(v >> 24);
1557
         emit_insn(v >> 32);
1558
         return 1;
1559
     }
1560
     else if (force >= 40 && force < 48) {
1561
        num_insns++;
1562
         emit_insn(0x60);
1563
         emit_insn(v >> 8);
1564
         emit_insn(v >> 16);
1565
         emit_insn(v >> 24);
1566
         emit_insn(v >> 32);
1567
         emit_insn(v >> 40);
1568
         return 1;
1569
     }
1570
     if (fitsIn12(v))
1571
         return 0;
1572
     if (fitsIn16(v)) {
1573
        num_insns++;
1574
         emit_insn(0x20);
1575
         emit_insn(v >> 8);
1576
         return 1;
1577
     }
1578
     if (fitsIn24(v)) {
1579
        num_insns++;
1580
         emit_insn(0x30);
1581
         emit_insn(v >> 8);
1582
         emit_insn(v >> 16);
1583
         return 1;
1584
     }
1585
     if (fitsIn32(v)) {
1586
        num_insns++;
1587
         emit_insn(0x40);
1588
         emit_insn(v >> 8);
1589
         emit_insn(v >> 16);
1590
         emit_insn(v >> 24);
1591
         return 1;
1592
     }
1593
     if (fitsIn40(v)) {
1594
        num_insns++;
1595
         emit_insn(0x50);
1596
         emit_insn(v >> 8);
1597
         emit_insn(v >> 16);
1598
         emit_insn(v >> 24);
1599
         emit_insn(v >> 32);
1600
         return 1;
1601
     }
1602
     if (fitsIn48(v)) {
1603
        num_insns++;
1604
         emit_insn(0x60);
1605
         emit_insn(v >> 8);
1606
         emit_insn(v >> 16);
1607
         emit_insn(v >> 24);
1608
         emit_insn(v >> 32);
1609
         emit_insn(v >> 40);
1610
         return 1;
1611
     }
1612
     if (fitsIn56(v)) {
1613
        num_insns++;
1614
         emit_insn(0x70);
1615
         emit_insn(v >> 8);
1616
         emit_insn(v >> 16);
1617
         emit_insn(v >> 24);
1618
         emit_insn(v >> 32);
1619
         emit_insn(v >> 40);
1620
         emit_insn(v >> 48);
1621
         return 1;
1622
     }
1623
        num_insns++;
1624
     emit_insn(0x80);
1625
     emit_insn(v >> 8);
1626
     emit_insn(v >> 16);
1627
     emit_insn(v >> 24);
1628
     emit_insn(v >> 32);
1629
     emit_insn(v >> 40);
1630
     emit_insn(v >> 48);
1631
     emit_insn(v >> 56);
1632
     return 1;
1633
}
1634
 
1635
static int emitImm24(int64_t v, int force)
1636
{
1637
     if (fitsIn24(v))
1638
         return 0;
1639
     if (fitsIn32(v)) {
1640
        num_insns++;
1641
         emit_insn(0x40);
1642
         emit_insn(v >> 8);
1643
         emit_insn(v >> 16);
1644
         emit_insn(v >> 24);
1645
         return 1;
1646
     }
1647
     if (fitsIn40(v)) {
1648
        num_insns++;
1649
         emit_insn(0x50);
1650
         emit_insn(v >> 8);
1651
         emit_insn(v >> 16);
1652
         emit_insn(v >> 24);
1653
         emit_insn(v >> 32);
1654
         return 1;
1655
     }
1656
     if (fitsIn48(v)) {
1657
        num_insns++;
1658
         emit_insn(0x60);
1659
         emit_insn(v >> 8);
1660
         emit_insn(v >> 16);
1661
         emit_insn(v >> 24);
1662
         emit_insn(v >> 32);
1663
         emit_insn(v >> 40);
1664
         return 1;
1665
     }
1666
     if (fitsIn56(v)) {
1667
        num_insns++;
1668
         emit_insn(0x70);
1669
         emit_insn(v >> 8);
1670
         emit_insn(v >> 16);
1671
         emit_insn(v >> 24);
1672
         emit_insn(v >> 32);
1673
         emit_insn(v >> 40);
1674
         emit_insn(v >> 48);
1675
         return 1;
1676
     }
1677
        num_insns++;
1678
     emit_insn(0x80);
1679
     emit_insn(v >> 8);
1680
     emit_insn(v >> 16);
1681
     emit_insn(v >> 24);
1682
     emit_insn(v >> 32);
1683
     emit_insn(v >> 40);
1684
     emit_insn(v >> 48);
1685
     emit_insn(v >> 56);
1686
     return 1;
1687
}
1688
 
1689
// ---------------------------------------------------------------------------
1690
// Emit constant extension for 15-bit operands.
1691
// Returns number of constant prefixes placed.
1692
// ---------------------------------------------------------------------------
1693
 
1694
static int emitImm15(int64_t v, int force)
1695
{
1696
     int nn;
1697
 
1698
     if (fitsIn0(v))
1699
        return 0;
1700
     else if (fitsIn10(v)) {
1701
         emit2(
1702
            ((v >> 16) << 7) | ((v>>15) & 1) |
1703
            0x10
1704
         );
1705
         return 1;
1706
     }
1707
     else if (fitsIn28(v)) {
1708
         emit_insn(0x78|(((v >> 18)&0x1FFFFFFLL) << 7)|((v >> 15)&7));
1709
         return 1;
1710
     }
1711
     else if (fitsIn41(v)) {
1712
         emit6(0x13|((v >> 15)&0x1FFFFFFFFFFLL) << 7);
1713
         return 1;
1714
     }
1715
     else {
1716
         emit_insn(0x78|(((v >> 46)&0x3FFFFLL) << 7)|((v >> 43)&7));
1717
         emit_insn(0x78|(((v >> 18)&0x1FFFFFFLL) << 7)|((v >> 15)&7));
1718
         return 2;
1719
     }
1720
 
1721
     // ToDo: modify the fixup record type based on the number of prefixes emitted.
1722
    if (bGen && lastsym && !use_gp && (lastsym->isExtern || lastsym->defined==0))
1723
    if( lastsym->segment < 5)
1724
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | nn+1 | (lastsym->isExtern ? 128 : 0)|
1725
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
1726
     return nn;
1727
}
1728
 
1729
// ---------------------------------------------------------------------------
1730
// bfextu r1,r2,#1,#63
1731
// ---------------------------------------------------------------------------
1732
 
1733
static void process_bitfield(int oc)
1734
{
1735
    int Ra;
1736
    int Rt;
1737
    int mb;
1738
    int me;
1739
 
1740
    Rt = getRegisterX();
1741
    need(',');
1742
    Ra = getRegisterX();
1743
    need(',');
1744
    NextToken();
1745
    mb = expr();
1746
    need(',');
1747
    NextToken();
1748
    me = expr();
1749
    emit_insn(predicate);
1750
    emit_insn(oc);
1751
    emit_insn4a(
1752
        (oc << 29) |
1753
        (me << 23) |
1754
        (mb << 17) |
1755
        (Rt << 12) |
1756
        (Ra << 7) |
1757
        0x03          // bitfield
1758
    );
1759
}
1760
 
1761
// ---------------------------------------------------------------------------
1762
// sys 4
1763
// ---------------------------------------------------------------------------
1764
 
1765
static void process_sys(int oc)
1766
{
1767
     int64_t val;
1768
 
1769
     NextToken();
1770
     val = expr();
1771
     emit_insn(predicate);
1772
     emit_insn3(
1773
       ((val & 0xFF) << 16) |
1774
       (0xCD << 8) |
1775
       oc
1776
     );
1777
//     emit_insn(oc);
1778
//     emit_insn(0xCD);
1779
//     emit_insn(val);
1780
}
1781
 
1782
// ----------------------------------------------------------------------------
1783
// chk r1,r2,b32
1784
// ----------------------------------------------------------------------------
1785
 
1786
static void process_chk(int oc)
1787
{
1788
     int Ra;
1789
     int Br;
1790
     int Rt;
1791
 
1792
     Rt = getRegisterX();
1793
     need(',');
1794
     Ra = getRegisterX();
1795
     need(',');
1796
     Br = getBoundsRegister();
1797
     emit_insn4(
1798
         (oc << 25) |
1799
         (Br << 17) |
1800
         (Rt << 12) |
1801
         (Ra << 7) |
1802
         0x02
1803
     );
1804
     prevToken();
1805
}
1806
 
1807
// ----------------------------------------------------------------------------
1808
// cpuid r1,r2
1809
// ----------------------------------------------------------------------------
1810
 
1811
static void process_cpuid(int oc)
1812
{
1813
     int Ra;
1814
     int Rt;
1815
 
1816
     Rt = getRegisterX();
1817
     need(',');
1818
     Ra = getRegisterX();
1819
     emit_insn(predicate);
1820
     emit_insn3(
1821
                (Rt << 14) |
1822
                (Ra << 8)|
1823
                0x41
1824
     );
1825
//     emit_insn(0x41);
1826
//     emit_insn(Ra|(Rt << 6));
1827
//     emit_insn(Rt >> 4);
1828
}
1829
 
1830
// ---------------------------------------------------------------------------
1831
// JSR also processes JMP
1832
// jmp label[c0]
1833
// jsr c2,label[c0]
1834
// ---------------------------------------------------------------------------
1835
 
1836
static void process_jsr(int oc)
1837
{
1838
    int64_t addr, disp;
1839
    int Ca, Rb;
1840
    int Ct;
1841
 
1842
        Ca = 0;
1843
    Ct = getCodeareg();
1844
    if (Ct==-1) {
1845
       Ct = oc==1 ? 0 : 1;
1846
    }
1847
    else {
1848
        need(',');
1849
        NextToken();
1850
    }
1851
    if (oc==15) {
1852
       Ca = 15;
1853
    }
1854
    else {
1855
//         NextToken();
1856
        // Simple [Rn] ?
1857
        if (token=='(' || token=='[') {
1858
           Ca = getCodeareg();
1859
            if (token != ')' && token!=']')
1860
                printf("Missing close bracket\r\n");
1861
        num_insns++;
1862
            emit_insn(predicate);
1863
            emit_insn(0xA0);
1864
            emit_insn((Ca<<4)|Ct);
1865
            return;
1866
        }
1867
//        prevToken();
1868
    }
1869
    NextToken();
1870
    addr = expr();
1871
    prevToken();
1872
    // d(Rn)? 
1873
    if (token=='(' || token=='[' || oc==15) {
1874
        if (oc != 15) {
1875
            NextToken();
1876
            Ca = getCodeareg();
1877
            if (Ca==-1) {
1878
                printf("Illegal jump address mode.\r\n");
1879
                Ca = 0;
1880
            }
1881
        }
1882
        if (Ca==15)
1883
            disp = addr - code_address;
1884
        else
1885
            disp = addr;
1886
        if ((disp >= -32768 && disp < 32767) || code_bits < 16) {
1887
            if (bGen)
1888
                if (lastsym && !use_gp) {
1889
                    if( lastsym->segment < 5)
1890
                        sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT1 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1891
                }
1892
            num_insns++;
1893
            emit_insn(predicate);
1894
            emit_insn(0xA1);
1895
            emit_insn((Ca<<4)|Ct);
1896
            emit_insn(disp & 0xff);
1897
            emit_insn(disp >> 8);
1898
            return;
1899
        }
1900
        if ((disp >= -8388608 && disp < 8388607) || code_bits < 24) {
1901
            if (bGen)
1902
                if (lastsym && !use_gp) {
1903
                    if( lastsym->segment < 5)
1904
                        sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT2 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1905
                }
1906
        num_insns++;
1907
            emit_insn(predicate);
1908
            emit_insn(0xA2);
1909
            emit_insn((Ca<<4)|Ct);
1910
            emit_insn(disp & 0xff);
1911
            emit_insn(disp >> 8);
1912
            emit_insn(disp >> 16);
1913
            return;
1914
        }
1915
        emitImm8(disp,code_bits);
1916
        if (bGen)
1917
            if (lastsym && !use_gp) {
1918
                if( lastsym->segment < 5)
1919
                    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT1 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1920
            }
1921
        num_insns++;
1922
        emit_insn(predicate);
1923
        emit_insn(0xA1);
1924
        emit_insn((Ca<<4)|Ct);
1925
        emit_insn(disp & 0xff);
1926
        emit_insn(disp >> 8);
1927
        return;
1928
    }
1929
    if ((addr >= -32768 && addr < 32767)|| code_bits < 16) {
1930
        if (bGen)
1931
            if (lastsym && !use_gp) {
1932
                if( lastsym->segment < 5)
1933
                    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT1 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1934
            }
1935
        num_insns++;
1936
       emit_insn(predicate);
1937
       emit_insn(0xA1);
1938
       emit_insn((Ca<<4)|Ct);
1939
       emit_insn(disp & 0xff);
1940
       emit_insn(disp >> 8);
1941
       return;
1942
    }
1943
    if ((addr >= -8388608 && addr < 8388607) || code_bits < 24) {
1944
        if (bGen)
1945
            if (lastsym && !use_gp) {
1946
                if( lastsym->segment < 5)
1947
                    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT2 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1948
            }
1949
        num_insns++;
1950
        emit_insn(predicate);
1951
        emit_insn(0xA2);
1952
        emit_insn((Ca<<4)|Ct);
1953
        emit_insn(addr & 0xff);
1954
        emit_insn(addr >> 8);
1955
        emit_insn(addr >> 16);
1956
        return;
1957
    }
1958
    emitImm8(addr,code_bits);
1959
    if (bGen)
1960
        if (lastsym && !use_gp) {
1961
            if( lastsym->segment < 5)
1962
                sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT1 | (lastsym->isExtern ? 128 : 0) | (code_bits << 8));
1963
        }
1964
        num_insns++;
1965
    emit_insn(predicate);
1966
    emit_insn(0xA1);
1967
    emit_insn((Ca<<4)|Ct);
1968
    emit_insn(addr & 0xff);
1969
    emit_insn(addr >> 8);
1970
    return;
1971
}
1972
 
1973
// ---------------------------------------------------------------------------
1974
// subi r1,r2,#1234
1975
// ---------------------------------------------------------------------------
1976
 
1977
static void process_riop(int oc)
1978
{
1979
    int Ra;
1980
    int Rt;
1981
    char *p;
1982
    int64_t val;
1983
 
1984
//    printf("<process_riop>");
1985
    p = inptr;
1986
    Rt = getRegisterX();
1987
    need(',');
1988
    Ra = getRegisterX();
1989
    need(',');
1990
    NextToken();
1991
    val = expr();
1992
    if (oc==0x4C && Ra == Rt) {
1993
        emitImm10(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
1994
    //    emitImm15(val,lastsym!=(SYM*)NULL);
1995
        if (bGen && lastsym && !use_gp)
1996
        if( lastsym->segment < 5)
1997
        sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT4 | (lastsym->isExtern ? 128 : 0)|
1998
        (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
1999
        emit_insn(predicate);
2000
        emit_insn3(
2001
                   ((val & 0x3ff) << 14)|
2002
                   (Rt << 8)|
2003
                   0x47
2004
        );
2005
//        emit_insn(0x47);
2006
//        emit_insn(Rt|(val << 6));
2007
//        emit_insn(val >> 2);
2008
        return;
2009
    }
2010
    emitImm12(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2011
//    emitImm15(val,lastsym!=(SYM*)NULL);
2012
    if (bGen && lastsym && !use_gp)
2013
    if( lastsym->segment < 5)
2014
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT6 | (lastsym->isExtern ? 128 : 0)|
2015
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2016
    emit_insn(predicate);
2017
    emit_insn4((val << 20) | (Rt<<14)|(Ra<<8)|oc);
2018
//    emit_insn(oc);
2019
//    emit_insn(Ra|(Rt << 6));
2020
//    emit_insn((Rt >> 2)|((val &15) << 4));
2021
//    emit_insn(val >> 4);
2022
//    printf("</process_riop>\r\n");
2023
}
2024
 
2025
// ---------------------------------------------------------------------------
2026
// add r1,r2,r12
2027
// Translates mnemonics without the 'i' suffix that are really immediate.
2028
// ---------------------------------------------------------------------------
2029
 
2030
static void process_rrop(int op, int func)
2031
{
2032
    int Ra;
2033
    int Rb;
2034
    int Rt;
2035
    char *p;
2036
 
2037
    p = inptr;
2038
    Rt = getRegisterX();
2039
    need(',');
2040
    Ra = getRegisterX();
2041
    need(',');
2042
    NextToken();
2043
    if (token=='#') {
2044
        inptr = p;
2045
        if (op==0x40)
2046
            switch(func) {
2047
            case 0: process_riop(0x48); return;  // addi
2048
            case 1: process_riop(0x49); return;  // subi
2049
            case 2: process_riop(0x4A); return;  // muli
2050
            case 3: process_riop(0x4B); return;  // divi
2051
            case 4: process_riop(0x4C); return;  // addui
2052
            case 5: process_riop(0x4D); return;  // subui
2053
            case 6: process_riop(0x4E); return;  // mului
2054
            case 7: process_riop(0x4F); return;  // divui
2055
            case 8: process_riop(0x6B); return;  // 2addui
2056
            case 9: process_riop(0x6C); return;  // 4addui
2057
            case 10: process_riop(0x6D); return;  // 8addui
2058
            case 11: process_riop(0x6E); return;  // 16addui
2059
            case 0x13: process_riop(0x5B); return;      // modi
2060
            case 0x14:  process_riop(0x5D); return;     // chki
2061
            case 0x17:  process_riop(0x5F); return; // modui
2062
            }
2063
        else if (op==0x50)
2064
            switch(func) {
2065
            case 0:      process_riop(0x53); return; // andi
2066
            case 1:      process_riop(0x54); return; // ori
2067
            case 2:      process_riop(0x55); return; // eori
2068
            }
2069
        else if (op==0x58) {
2070
             process_shifti(0x58,func + 0x10); return;
2071
        }
2072
        return;
2073
    }
2074
    prevToken();
2075
    Rb = getRegisterX();
2076
    prevToken();
2077
 
2078
    emit_insn(predicate);
2079
    emit_insn4((func << 26)|(Rt << 20)|(Rb << 14)|(Ra << 8)|op);
2080
//    emit_insn(op);
2081
//    emit_insn(Ra|((Rb & 3 )<< 6));
2082
//    emit_insn((Rb >> 2)|((Rt & 15)<<4));
2083
//    emit_insn((func << 2)|(Rt >> 4));
2084
}
2085
 
2086
// ---------------------------------------------------------------------------
2087
// ---------------------------------------------------------------------------
2088
static void process_stset(int oc)
2089
{
2090
    int Ra;
2091
    int Rb, Rc;
2092
    int64_t disp;
2093
    int sc;
2094
    int md;
2095
    int sz,dir;
2096
 
2097
    getSzDir(&sz,&dir);
2098
    seg = 1;
2099
    Rb = getRegisterX();
2100
    need(',');
2101
    NextToken();
2102
//       prevToken();
2103
    mem_operand(&disp, &Ra, &Rc, &sc, &md);
2104
    if (disp!=0 || Rc != -1 || sc != 0)
2105
        printf("%d: illegal memory operand stset.\r\n", lineno);
2106
    if (token==']')
2107
       ;
2108
    emit_insn(predicate);
2109
    if (segmodel==2)
2110
       emit_insn4(
2111
                  (dir << 28) |
2112
                  (sz << 26) |
2113
                  (Rb << 14) |
2114
                  (Ra << 8) |
2115
                  oc
2116
       );
2117
    else
2118
       emit_insn4(
2119
                  (seg << 29) |
2120
                  (dir << 28) |
2121
                  (sz << 26) |
2122
                  (Rb << 14) |
2123
                  (Ra << 8) |
2124
                  oc
2125
       );
2126
//    emit_insn(oc);
2127
//    emit_insn(Ra|((Rb & 3)<<6));
2128
//    emit_insn((Rb >> 2));
2129
//    emit_insn((seg << 5)|(sz << 2)|(dir << 4));
2130
}
2131
 
2132
// ---------------------------------------------------------------------------
2133
// fabs.d r1,r2
2134
// ---------------------------------------------------------------------------
2135
 
2136
static void process_fprop(int oc, int fn)
2137
{
2138
    int Ra;
2139
    int Rt;
2140
    char *p;
2141
    int  sz;
2142
    int fmt;
2143
 
2144
    sz = 'd';
2145
    if (*inptr=='.') {
2146
        inptr++;
2147
        if (strchr("sdtqSDTQ",*inptr)) {
2148
            sz = tolower(*inptr);
2149
            inptr++;
2150
        }
2151
        else
2152
            printf("Illegal float size.\r\n");
2153
    }
2154
    Rt = getRegisterX();
2155
    need(',');
2156
    Ra = getRegisterX();
2157
    prevToken();
2158
 
2159
    if (sz=='s' || sz=='S')
2160
       oc = 0x79;
2161
    emit_insn(predicate);
2162
    emit_insn3(
2163
               (fn << 20) |
2164
               (Rt << 14) |
2165
               (Ra << 8)|
2166
               oc
2167
    );
2168
//    emit_insn(oc);
2169
//    emit_insn(Ra | (Rt << 6));
2170
//    emit_insn((Rt >> 2)|(fn << 4));
2171
}
2172
 
2173
// ---------------------------------------------------------------------------
2174
// fadd.d r1,r2,r12
2175
// fdiv.s r1,r3,r10
2176
// ---------------------------------------------------------------------------
2177
 
2178
static void process_fprrop(int oc, int fn)
2179
{
2180
    int Ra;
2181
    int Rb;
2182
    int Rt;
2183
    int  sz;
2184
 
2185
    sz = 'd';
2186
    if (*inptr=='.') {
2187
        inptr++;
2188
        if (strchr("sdtqSDTQ",*inptr)) {
2189
            sz = tolower(*inptr);
2190
            inptr++;
2191
        }
2192
        else
2193
            printf("Illegal float size.\r\n");
2194
    }
2195
    Rt = getRegisterX();
2196
    need(',');
2197
    Ra = getRegisterX();
2198
    need(',');
2199
    Rb = getRegisterX();
2200
//    if (token==',')
2201
//       rm = getFPRoundMode();
2202
    prevToken();
2203
    if (sz=='s' || sz=='S')
2204
       fn = fn + 0x10;
2205
    emit_insn(predicate);
2206
    emit_insn4(
2207
               (fn << 26) |
2208
               (Rt << 20) |
2209
               (Rb << 14) |
2210
               (Ra << 8) |
2211
               oc
2212
    );
2213
//    emit_insn(oc);
2214
//    emit_insn(Ra|(Rb << 6));
2215
//    emit_insn((Rb >> 2)|(Rt << 4));
2216
//    emit_insn((Rt >> 4)|(fn << 2));
2217
}
2218
 
2219
// ---------------------------------------------------------------------------
2220
// fcx r0,#2
2221
// fdx r1,#0
2222
// ---------------------------------------------------------------------------
2223
 
2224
static void process_fpstat(int oc)
2225
{
2226
    int Ra;
2227
    int64_t bits;
2228
    char *p;
2229
 
2230
    p = inptr;
2231
    bits = 0;
2232
    Ra = getRegister();
2233
    if (token==',') {
2234
       NextToken();
2235
       bits = expr();
2236
    }
2237
    prevToken();
2238
    emitAlignedCode(0x01);
2239
    emit_insn4(
2240
               ((bits & 0xFF) << 14)|
2241
               (Ra << 8) |
2242
               oc
2243
    );
2244
//    emit_insn(Ra);
2245
//    emit_insn(bits & 0xff);
2246
//    emit_insn(0x00);
2247
//    emit_insn(oc);
2248
}
2249
 
2250
// ---------------------------------------------------------------------------
2251
// not r3,r3
2252
// ---------------------------------------------------------------------------
2253
 
2254
static void process_rop(int oc, int fn)
2255
{
2256
    int Ra;
2257
    int Rt;
2258
 
2259
    Rt = getRegister();
2260
    need(',');
2261
    Ra = getRegister();
2262
    prevToken();
2263
    emit_insn(predicate);
2264
    emit_insn3(
2265
               (fn << 20) |
2266
               (Rt << 14) |
2267
               (Ra << 8) |
2268
               oc
2269
    );
2270
//    emit_insn(oc);
2271
//    emit_insn(Ra|(Rt << 6));
2272
//    emit_insn((Rt >> 2)|(fn << 4));
2273
}
2274
 
2275
// ---------------------------------------------------------------------------
2276
// bra label
2277
// ---------------------------------------------------------------------------
2278
 
2279
static void process_br(int oc)
2280
{
2281
    int64_t val;
2282
    int64_t disp;
2283
    int64_t ad;
2284
    char *nm;
2285
 
2286
    val = 0;
2287
    NextToken();
2288
    val = expr();
2289
     // ToDo: modify the fixup record type based on the number of prefixes emitted.
2290
    if (bGen && lastsym && (lastsym->isExtern || lastsym->defined==0))
2291
    if( lastsym->segment < 5)
2292
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | FUT_R27 | (lastsym->isExtern ? 128 : 0)|
2293
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2294
    ad = code_address + 3;
2295
    disp = (val - ad);
2296
    num_insns++;
2297
    emit_insn(predicate);
2298
    emit_insn(oc|((disp>>8)&15));
2299
    emit_insn(disp & 0xff);
2300
    if (disp >= -2048 && disp < 2047)
2301
       ;
2302
    else if (pass > 4) {
2303
         nm = (char *)0;
2304
         if (lastsym)
2305
                  nm = nmTable.GetName(lastsym->name);
2306
         printf("%d Branch out of range (%s).\r\n", lineno, nm ? nm : "");
2307
         printf("%.300s\r\n", inptr-150);
2308
    }
2309
}
2310
 
2311
 
2312
static void process_loop(int oc)
2313
{
2314
    int64_t val;
2315
    int64_t disp;
2316
    int64_t ad;
2317
 
2318
    val = 0;
2319
    NextToken();
2320
    val = expr();
2321
     // ToDo: modify the fixup record type based on the number of prefixes emitted.
2322
    if (bGen && lastsym && (lastsym->isExtern || lastsym->defined==0))
2323
    if( lastsym->segment < 5)
2324
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | FUT_R27 | (lastsym->isExtern ? 128 : 0)|
2325
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2326
    ad = code_address + 3;
2327
    disp = (val - ad);
2328
    num_insns++;
2329
    emit_insn(predicate);
2330
    emit_insn(oc);
2331
    emit_insn(disp & 0xff);
2332
    if ((disp < -128 || disp > 127) && pass > 4)
2333
       printf("%d: loop target too far away.\r\n");
2334
}
2335
 
2336
 
2337
// ---------------------------------------------------------------------------
2338
// ---------------------------------------------------------------------------
2339
 
2340
static void getIndexScale(int *sc)
2341
{
2342
      int64_t val;
2343
 
2344
      NextToken();
2345
      val = expr();
2346
      prevToken();
2347
      switch(val) {
2348
      case 0: *sc = 0; break;
2349
      case 1: *sc = 0; break;
2350
      case 2: *sc = 1; break;
2351
      case 4: *sc = 2; break;
2352
      case 8: *sc = 3; break;
2353
      default: printf("Illegal scaling factor.\r\n");
2354
      }
2355
}
2356
 
2357
// ---------------------------------------------------------------------------
2358
// ---------------------------------------------------------------------------
2359
static void process_message()
2360
{
2361
    char buf[200];
2362
    int nn;
2363
 
2364
    while(*inptr != '"' && *inptr != '\n') inptr++;
2365
    if (*inptr=='\n') { NextToken(); return; }
2366
    nn = 0;
2367
    inptr++;
2368
    while (*inptr != '"' && *inptr != '\n' && nn < 197) {
2369
        buf[nn] = *inptr;
2370
        inptr++;
2371
        nn++;
2372
    }
2373
    buf[nn] = '\0';
2374
    strcat(buf, "\r\n");
2375
    printf(buf);
2376
    ScanToEOL();
2377
}
2378
 
2379
// ---------------------------------------------------------------------------
2380
// expr
2381
// expr[Reg]
2382
// expr[Reg+Reg*sc]
2383
// [Reg]
2384
// [Reg+Reg*sc]
2385
// ---------------------------------------------------------------------------
2386
 
2387
static void mem_operand(int64_t *disp, int *regA, int *regB, int *sc, int *md)
2388
{
2389
     int64_t val;
2390
     int8_t ind;
2391
 
2392
     ind = false;
2393
 
2394
     // chech params
2395
     if (disp == (int64_t *)NULL)
2396
         return;
2397
     if (regA == (int *)NULL)
2398
         return;
2399
     if (regB == (int *)NULL)
2400
         return;
2401
     if (sc==(int *)NULL)
2402
         return;
2403
     if (md==(int *)NULL)
2404
         return;
2405
 
2406
     *disp = 0;
2407
     *regA = -1;
2408
     *regB = -1;
2409
     *sc = 0;
2410
     if (token==tk_zs) {
2411
        seg = 0;
2412
        NextToken();
2413
     }
2414
     else if (token==tk_ds) {
2415
         seg = 1;
2416
         NextToken();
2417
     }
2418
     else if (token==tk_es) {
2419
         seg = 2;
2420
         NextToken();
2421
     }
2422
     else if (token==tk_fs) {
2423
         seg = 3;
2424
         NextToken();
2425
     }
2426
     else if (token==tk_gs) {
2427
         seg = 4;
2428
         NextToken();
2429
     }
2430
     else if (token==tk_hs) {
2431
         seg = 5;
2432
         NextToken();
2433
     }
2434
     else if (token==tk_ss) {
2435
         seg = 6;
2436
         NextToken();
2437
     }
2438
     else if (token==tk_cs) {
2439
         seg = 7;
2440
         NextToken();
2441
     }
2442
     if (token!='[') {;
2443
          val = expr();
2444
          *disp = val;
2445
     }
2446
     if (token=='[') {
2447
         *regA = getRegisterX();
2448
         // Memory indirect ?
2449
         if (*regA == -1) {
2450
             ind = true;
2451
             prevToken();
2452
             *disp = expr();
2453
             if (token=='[') {
2454
                 *regA = getRegisterX();
2455
                 need(']');
2456
                 if (*regA==-1)
2457
                     printf("expecting a register\r\n");
2458
                 NextToken();
2459
             }
2460
             else
2461
                 *regA = 0;
2462
             need(']');
2463
             NextToken();
2464
             if (token=='[') {
2465
                 *regB = getRegisterX();
2466
                 if (*regB==-1)
2467
                     printf("expecting a register\r\n");
2468
                 if (token=='*')
2469
                     getIndexScale(sc);
2470
                 need(']');
2471
             }
2472
             NextToken();
2473
             if (token=='+') {
2474
                 NextToken();
2475
                 if (token=='+') {
2476
                     *md = 7;
2477
                     return;
2478
                 }
2479
             }
2480
             else if (token=='-') {
2481
                  NextToken();
2482
                  if (token=='-') {
2483
                      *md = 6;
2484
                      return;
2485
                  }
2486
             }
2487
             *md = 5;
2488
             return;
2489
         }
2490
         if (token=='+') {
2491
              *sc = 0;
2492
              *regB = getRegisterX();
2493
              if (*regB == -1) {
2494
                  printf("expecting a register\r\n");
2495
              }
2496
              if (token=='*') {
2497
                  getIndexScale(sc);
2498
              }
2499
         }
2500
         need(']');
2501
         if (token=='+') {
2502
             NextToken();
2503
             if (token=='+') {
2504
                 *md = 3;
2505
                 return;
2506
             }
2507
         }
2508
         else if (token=='-') {
2509
              NextToken();
2510
              if (token=='-') {
2511
                  *md = 2;
2512
                  return;
2513
              }
2514
         }
2515
         *md = 1;
2516
     }
2517
}
2518
 
2519
// ---------------------------------------------------------------------------
2520
// ---------------------------------------------------------------------------
2521
static void setSegAssoc(int Ra)
2522
{
2523
   if (seg < 0) {
2524
       if (Ra==26 || Ra==27)
2525
          seg = 6;
2526
       else if (Ra==31 || Ra==28)
2527
          seg = 0;
2528
       else
2529
          seg = 1;
2530
   }
2531
}
2532
 
2533
// ---------------------------------------------------------------------------
2534
// sws LC,disp[r1]
2535
// ----------------------------------------------------------------------------
2536
 
2537
static void process_sws(int oc, int opt)
2538
{
2539
    int Ra;
2540
    int Rb;
2541
    int Rs;
2542
    int sc;
2543
    int md;
2544
    int64_t disp;
2545
 
2546
    Rs = Thor_getSprRegister();
2547
    expect(',');
2548
    mem_operand(&disp, &Ra, &Rb, &sc, &md);
2549
    setSegAssoc(Ra);
2550
    if (Rs < 0) {
2551
        if (opt)
2552
            printf("%d: Expecting a source register.\r\n", lineno);
2553
        else
2554
            printf("%d: Expecting a special purpose source register.\r\n", lineno);
2555
        ScanToEOL();
2556
        //inptr -= 2;
2557
        return;
2558
    }
2559
    if (Rb >= 0) {
2560
       printf("%d: unsupported address mode.\r\n", lineno);
2561
        ScanToEOL();
2562
       return;
2563
    }
2564
    Rs &= 0x3f;
2565
    if (segmodel==2)
2566
        emitImm12(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2567
    else
2568
        emitImm9(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2569
    if (Ra < 0) Ra = 0;
2570
    if (bGen && lastsym && !use_gp)
2571
    if( lastsym->segment < 5)
2572
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT5 | (lastsym->isExtern ? 128 : 0)|
2573
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2574
    emit_insn(predicate);
2575
    if (segmodel==2)
2576
       emit_insn4((disp << 20)|(Rs<<14)|(Ra << 8)|oc);
2577
    else
2578
       emit_insn4((seg << 29)|((disp & 0x1FF) << 20)|(Rs<<14)|(Ra << 8)|oc);
2579
//    emit_insn(oc);
2580
//    emit_insn(Ra | ((Rs & 3) << 6));
2581
//    emit_insn((Rs >> 2)|((disp & 15) << 4));
2582
//    if (segmodel==2)
2583
//        emit_insn(disp >> 4);
2584
//    else
2585
//        emit_insn(((disp >> 4) & 31)|(seg << 5));
2586
    ScanToEOL();
2587
}
2588
 
2589
// ---------------------------------------------------------------------------
2590
// sw disp[r1],r2
2591
// sw [r1+r2],r3
2592
// ----------------------------------------------------------------------------
2593
 
2594
static void process_store(int oc)
2595
{
2596
    int Ra;
2597
    int Rb;
2598
    int Rs;
2599
    int sc;
2600
    int md;
2601
    int64_t disp;
2602
 
2603
    if (oc==0x94 || oc==0x95)
2604
        Rs = getFPRegister();
2605
    else
2606
        Rs = getRegisterX();
2607
    expect(',');
2608
    mem_operand(&disp, &Ra, &Rb, &sc, &md);
2609
    setSegAssoc(Ra);
2610
    if (Rs < 0) {
2611
        if (oc==0x93) {
2612
            process_sws(0x9E,1);
2613
            return;
2614
        }
2615
        printf("Expecting a source register.\r\n");
2616
        ScanToEOL();
2617
        return;
2618
    }
2619
    if (Rb > 0) {
2620
       if (disp != 0)
2621
           printf("%d: displacement not supported with indexed mode.\r\n", lineno);
2622
       emit_insn(predicate);
2623
//       emit_insn(oc+0x30);
2624
//       emit_insn(Ra|((Rb & 3)<<6));
2625
//       emit_insn((Rb >> 2)|((Rs & 15) << 4));
2626
//       emit_insn((Rs >> 4)|(sc << 2)|(seg << 5));
2627
      if (segmodel==2)
2628
         emit_insn4((sc<<26)|(Rs<<20)|(Rb<<14)|(Ra<<8)|(oc+0x30));
2629
      else
2630
         emit_insn4((seg << 29)|(sc<<26)|(Rs<<20)|(Rb<<14)|(Ra<<8)|(oc+0x30));
2631
       ScanToEOL();
2632
       return;
2633
    }
2634
    Rb = 0;
2635
    if (segmodel==2)
2636
        emitImm12(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2637
    else
2638
        emitImm9(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2639
    if (Ra < 0) Ra = 0;
2640
    if (bGen && lastsym && !use_gp)
2641
    if( lastsym->segment < 5)
2642
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT5 | (lastsym->isExtern ? 128 : 0)|
2643
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2644
    emit_insn(predicate);
2645
    if (segmodel==2)
2646
       emit_insn4((disp << 20)|(Rs<<14)|(Ra << 8)|oc);
2647
    else
2648
       emit_insn4((seg << 29)|((disp & 0x1FF) << 20)|(Rs<<14)|(Ra << 8)|oc);
2649
    ScanToEOL();
2650
}
2651
 
2652
// ----------------------------------------------------------------------------
2653
// ----------------------------------------------------------------------------
2654
 
2655
static void process_ldis(int oc)
2656
{
2657
    int Rt;
2658
    int64_t val;
2659
    int nn;
2660
 
2661
    Rt = Thor_getSprRegister();
2662
    Rt &= 0x3f;
2663
    if (Rt==-1) {
2664
        printf("%d: expecting a special purpose register.\r\n", lineno);
2665
        return;
2666
    }
2667
    expect(',');
2668
    val = expr();
2669
    emitImm10(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2670
    if (bGen && lastsym && !use_gp)
2671
    if( lastsym->segment < 5)
2672
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT4 | (lastsym->isExtern ? 128 : 0)|
2673
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2674
    emit_insn(predicate);
2675
    emit_insn3(
2676
               ((val & 0x3FF) << 14) |
2677
               (Rt << 8) |
2678
               oc
2679
    );
2680
//    emit_insn(oc);
2681
//    emit_insn(Rt|(val & 3) << 6);
2682
//    emit_insn((val >> 2) & 0xff);
2683
}
2684
 
2685
// ----------------------------------------------------------------------------
2686
// ----------------------------------------------------------------------------
2687
 
2688
static void process_ldi(int oc)
2689
{
2690
    int Rt;
2691
    int64_t val;
2692
    int nn;
2693
 
2694
    Rt = getRegisterX();
2695
    if (Rt==-1) {
2696
        process_ldis(0x9D);
2697
        return;
2698
//        Rt = getFPRegister();
2699
//        oc = 0x1A;
2700
    }
2701
    expect(',');
2702
    val = expr();
2703
    emitImm10(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2704
//    emitImm15(val,lastsym!=(SYM*)NULL);
2705
    if (bGen && lastsym && !use_gp)
2706
    if( lastsym->segment < 5)
2707
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT4 | (lastsym->isExtern ? 128 : 0)|
2708
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2709
    emit_insn(predicate);
2710
    emit_insn3(
2711
               ((val & 0x3FF) << 14) |
2712
               (Rt << 8) |
2713
               oc
2714
    );
2715
//    emit_insn(oc);
2716
//    emit_insn(Rt|(val & 3) << 6);
2717
//    emit_insn((val >> 2) & 0xff);
2718
}
2719
 
2720
// ----------------------------------------------------------------------------
2721
// lws lc,disp[r2]
2722
// ----------------------------------------------------------------------------
2723
 
2724
static void process_lws(int oc, int opt)
2725
{
2726
    int Ra;
2727
    int Rb;
2728
    int Spr;
2729
    int sc;
2730
    int md;
2731
    char *p;
2732
    int64_t disp;
2733
    int fixup = 5;
2734
 
2735
    sc = 0;
2736
    p = inptr;
2737
    Spr = Thor_getSprRegister();
2738
    if (Spr < 0) {
2739
        if (opt)
2740
            printf("%d: Expecting a target register %.60s.\r\n", lineno,inptr-30);
2741
        else
2742
            printf("%d: Expecting a special purpose target register.\r\n", lineno);
2743
//        printf("Line:%.60s\r\n",p);
2744
        ScanToEOL();
2745
        //inptr-=2;
2746
        return;
2747
    }
2748
    Spr &= 0x3F;
2749
    expect(',');
2750
    mem_operand(&disp, &Ra, &Rb, &sc, &md);
2751
    setSegAssoc(Ra);
2752
    if (Rb >= 0) {
2753
          printf("%d: Address mode not supported.\r\n", lineno);
2754
          return;
2755
    }
2756
    if (segmodel==2)
2757
        emitImm12(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2758
    else
2759
        emitImm9(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2760
    if (Ra < 0) Ra = 0;
2761
    if (bGen && lastsym && !use_gp)
2762
    if( lastsym->segment < 5)
2763
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT5 | (lastsym->isExtern ? 128 : 0)|
2764
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2765
    emit_insn(predicate);
2766
//    emit_insn(oc);
2767
    if (segmodel==2)
2768
       emit_insn4((disp << 20)|(Spr<<14)|(Ra << 8)|oc);
2769
    else
2770
       emit_insn4((seg << 29)|((disp & 0x1FF) << 20)|(Spr<<14)|(Ra << 8)|oc);
2771
//    emit_insn(Ra | ((Spr & 3) << 6));
2772
//    emit_insn((Spr >> 2)|((disp & 15) << 4));
2773
//    if (segmodel==2)
2774
//        emit_insn(disp >> 4);
2775
//    else
2776
//        emit_insn(((disp >> 4) & 31)|(seg << 5));
2777
    ScanToEOL();
2778
}
2779
 
2780
// ----------------------------------------------------------------------------
2781
// lw r1,disp[r2]
2782
// lw r1,[r2+r3]
2783
// cas r2,disp[r1]
2784
// ----------------------------------------------------------------------------
2785
 
2786
static void process_load(int oc)
2787
{
2788
    int Ra;
2789
    int Rb;
2790
    int Rt;
2791
    int sc;
2792
    int md;
2793
    char *p;
2794
    int64_t disp;
2795
    int fixup = 5;
2796
    int fn;
2797
 
2798
    sc = 0;
2799
    p = inptr;
2800
    if (oc==0x87 || oc==0x88)
2801
       Rt = getFPRegister();
2802
    else
2803
        Rt = getRegisterX();
2804
    if (Rt < 0) {
2805
        if (oc==0x86) {     // LW
2806
           process_lws(0x8E,1);
2807
           return;
2808
        }
2809
        printf("Expecting a target register %.60s.\r\n", inptr-30);
2810
//        printf("Line:%.60s\r\n",p);
2811
        ScanToEOL();
2812
        //inptr-=2;
2813
        return;
2814
    }
2815
    expect(',');
2816
    mem_operand(&disp, &Ra, &Rb, &sc, &md);
2817
    setSegAssoc(Ra);
2818
    if (Rb >= 0) {
2819
       if (disp != 0)
2820
           printf("%d: displacement not supported with indexed mode.\r\n", lineno);
2821
       fixup = 11;
2822
       if (oc==0x97 || oc==0x8E) {  //LWS CAS
2823
          printf("%d: Address mode not supported.\r\n", lineno);
2824
          return;
2825
       }
2826
//       if (oc==0x9F) oc = 0x8F;  // LEA
2827
                if (oc==0x4c) {// LEA
2828
                        oc = 0x40;
2829
                        switch(sc) {
2830
                        case 0: fn = 4; break;
2831
                        case 1: fn = 8; break;
2832
                        case 2: fn = 9; break;
2833
                        case 3: fn = 10; break;
2834
                        }
2835
                        emit_insn(predicate);
2836
                        emit_insn4(
2837
                                   (fn << 26) |
2838
                                   (Rt << 20) |
2839
                                   (Rb << 14) |
2840
                                   (Ra << 8) |
2841
                                   oc
2842
                        );
2843
//                      emit_insn(oc);
2844
//                      emit_insn(Rb|((Ra &3)<<6));
2845
//              emit_insn((Ra >> 2)|((Rt & 15) << 4));
2846
//           emit_insn((Rt >> 4)|(fn << 2));
2847
                ScanToEOL();
2848
            return;
2849
                }
2850
       emit_insn(predicate);
2851
      if (segmodel==2)
2852
         emit_insn4((sc << 26)|(Rt << 20)|(Rb<<14)|(Ra << 8)|((oc==0x6A || oc==0x4C) ? 0xB8 : oc+0x30));
2853
      else
2854
         emit_insn4((seg << 29)|(sc << 26)|(Rt << 20)|(Rb<<14)|(Ra << 8)|((oc==0x6A || oc==0x4C) ? 0xB8 : oc+0x30));
2855
//       emit_insn((oc==0x6A || oc==0x4C) ? 0xB8 : oc+0x30);
2856
//       emit_insn(Ra|((Rb & 3)<<6));
2857
//       emit_insn((Rb >> 2)|((Rt & 15) << 4));
2858
//       emit_insn((Rt >> 4)|(sc << 2)|(seg << 5));
2859
       ScanToEOL();
2860
       return;
2861
    }
2862
    Rb = 0;
2863
    if (segmodel==2)
2864
       emitImm12(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2865
    else
2866
        emitImm9(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2867
    if (Ra < 0) Ra = 0;
2868
    if (bGen && lastsym && !use_gp)
2869
    if( lastsym->segment < 5)
2870
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT5 | (lastsym->isExtern ? 128 : 0)|
2871
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2872
    emit_insn(predicate);
2873
    if (segmodel==2)
2874
       emit_insn4((disp << 20)|(Rt<<14)|(Ra << 8)|oc);
2875
    else
2876
       emit_insn4((seg << 29)|((disp & 0x1FF) << 20)|(Rt<<14)|(Ra << 8)|oc);
2877
//    emit_insn(oc);
2878
//    emit_insn(Ra | ((Rt & 3) << 6));
2879
//    emit_insn((Rt >> 2)|((disp & 15) << 4));
2880
//    if (segmodel==2)
2881
//        emit_insn(disp >> 4);
2882
//    else
2883
//        emit_insn(((disp >> 4) & 31)|(seg << 5));
2884
    ScanToEOL();
2885
}
2886
 
2887
// ----------------------------------------------------------------------------
2888
// jci c1,disp[r2]
2889
// jci c1,[r2+r3]
2890
// ----------------------------------------------------------------------------
2891
 
2892
static void process_jmpi(int fn)
2893
{
2894
    int Ra;
2895
    int Rb;
2896
    int Rt;
2897
    int sc;
2898
    int md;
2899
    char *p;
2900
    int64_t disp;
2901
    int fixup = 5;
2902
 
2903
    sc = 0;
2904
    p = inptr;
2905
    Rt = getCodeareg();
2906
    if (Rt < 0) {
2907
        printf("%d: Expecting a target register %.60s.\r\n", lineno, inptr-30);
2908
//        printf("Line:%.60s\r\n",p);
2909
        ScanToEOL();
2910
        //inptr-=2;
2911
        return;
2912
    }
2913
    expect(',');
2914
    mem_operand(&disp, &Ra, &Rb, &sc, &md);
2915
    setSegAssoc(Ra);
2916
    if (Rb >= 0) {
2917
       if (disp != 0)
2918
           printf("%d: displacement not supported with indexed mode.\r\n", lineno);
2919
       fixup = 11;
2920
//       if (oc==0x9F) oc = 0x8F;  // LEA
2921
        num_insns++;
2922
       emit_insn(predicate);
2923
       emit_insn(0xB7);
2924
       emit_insn(Ra|((Rb & 3)<<6));
2925
       emit_insn((Rb >> 2)|((Rt & 15) << 4));
2926
       emit_insn((sc << 2)|(seg << 5)|fn);
2927
       ScanToEOL();
2928
       return;
2929
    }
2930
    Rb = 0;
2931
    emitImm9(disp,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
2932
    if (Ra < 0) Ra = 0;
2933
    if (bGen && lastsym && !use_gp)
2934
    if( lastsym->segment < 5)
2935
    sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT5 | (lastsym->isExtern ? 128 : 0)|
2936
    (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
2937
        num_insns++;
2938
    emit_insn(predicate);
2939
    emit_insn(0x8D);
2940
    emit_insn(Ra | ((Rt & 3) << 6));
2941
    emit_insn((Rt >> 2)|((disp & 15) << 4)|(fn<<2));
2942
    emit_insn(((disp >> 4) & 31)|(seg << 5));
2943
    ScanToEOL();
2944
}
2945
 
2946
// ----------------------------------------------------------------------------
2947
// inc.b -8[bp],#1
2948
// ----------------------------------------------------------------------------
2949
 
2950
static void process_inc(int oc)
2951
{
2952
    int Ra;
2953
    int Rb;
2954
    int sc;
2955
    int sg;
2956
    int64_t incamt;
2957
    int64_t disp;
2958
    char *p;
2959
    int fixup = 5;
2960
    int neg = 0;
2961
    int  sz;
2962
 
2963
    sz = 'w';
2964
    if (*inptr=='.') {
2965
        inptr++;
2966
        if (strchr("bchwBCHW",*inptr)) {
2967
            sz = tolower(*inptr);
2968
            inptr++;
2969
        }
2970
        else
2971
            printf("Illegal increment size.\r\n");
2972
    }
2973
    switch(sz) {
2974
    case 'b':  sz = 0; break;
2975
    case 'c':  sz = 1; break;
2976
    case 'h':  sz = 2; break;
2977
    case 'w':  sz = 3; break;
2978
    }
2979
    NextToken();
2980
    p = inptr;
2981
    mem_operand(&disp, &Ra, &Rb, &sc, &sg);
2982
    setSegAssoc(Ra);
2983
    incamt = 1;
2984
    if (token==']')
2985
       NextToken();
2986
    if (token==',') {
2987
        NextToken();
2988
        incamt = expr();
2989
        prevToken();
2990
    }
2991
    if (Rb >= 0) {
2992
       printf("%d: Indexed mode not supported.\r\n", lineno);
2993
/*
2994
       if (disp < 0)
2995
           printf("inc offset must be greater than zero.\r\n");
2996
       if (disp > 255LL)
2997
           printf("inc offset too large.\r\n");
2998
       oc = 0x6F;  // INCX
2999
       emit_insn(
3000
           ((disp & 0xFF) << 24) |
3001
           (sc << 22) |
3002
           (Rb << 17) |
3003
           ((incamt & 0x1F) << 12) |
3004
           (Ra << 7) |
3005
           oc
3006
       );
3007
*/
3008
       return;
3009
    }
3010
    if (oc==0xC8) neg = 1;
3011
    oc = 0xC7;        // INC
3012
    if (segmodel==2)
3013
       emitImm12(disp,lastsym!=(SYM*)NULL);
3014
    else
3015
       emitImm9(disp,lastsym!=(SYM*)NULL);
3016
    if (Ra < 0) Ra = 0;
3017
    if (neg) incamt = -incamt;
3018
        num_insns++;
3019
    emit_insn(predicate);
3020
    emit_insn(oc);
3021
    emit_insn(Ra | (sz<<6));
3022
    emit_insn(disp << 4);
3023
    if (segmodel==2)
3024
        emit_insn(disp >> 4);
3025
    else
3026
        emit_insn(((disp >> 4) & 0x1f)|(seg << 5));
3027
    emit_insn(incamt);
3028
    ScanToEOL();
3029
}
3030
 
3031
// ----------------------------------------------------------------------------
3032
// push r1
3033
// push #123
3034
// push -8[BP]
3035
// ----------------------------------------------------------------------------
3036
 
3037
static void process_push(int oc)
3038
{
3039
    int Ra,Rb;
3040
    int64_t val;
3041
    int64_t disp;
3042
    int sc;
3043
    int sg;
3044
    int nn;
3045
 
3046
    printf("%d push not supported", lineno);
3047
    Ra = -1;
3048
    Rb = -1;
3049
    NextToken();
3050
    if (token=='#' && oc==0x67) {  // Filter to PUSH
3051
       val = expr();
3052
       emitImm15(val,(code_bits > 32 || data_bits > 32) && lastsym!=(SYM *)NULL);
3053
        emit_insn(
3054
            ((val & 0x7FFFLL) << 17) |
3055
            (0x1E << 12) |
3056
            (0x00 << 7) |
3057
            0x65   // PEA
3058
        );
3059
        return;
3060
    }
3061
    prevToken();
3062
    Ra = getRegisterX();
3063
    if (Ra == -1) {
3064
       Ra = Thor_getSprRegister();
3065
       if (Ra==-1)
3066
          printf("%d: unknown register.\r\n");
3067
       Ra |= 0x40;
3068
    }
3069
        num_insns++;
3070
    emit_insn(predicate);
3071
    emit_insn(oc);
3072
    emit_insn(Ra);
3073
    prevToken();
3074
}
3075
 
3076
// ----------------------------------------------------------------------------
3077
// mov r1,r2
3078
// ----------------------------------------------------------------------------
3079
 
3080
static void process_mov()
3081
{
3082
     int Ra;
3083
     int Rt;
3084
 
3085
     Rt = getRegisterX();
3086
     need(',');
3087
     Ra = getRegisterX();
3088
     emit_insn(predicate);
3089
     emit_insn3(
3090
                (Rt << 14) |
3091
                (Ra << 8) |
3092
                0xA7
3093
     );
3094
//     emit_insn(0xA7);
3095
//     emit_insn(Ra|((Rt << 6)));
3096
//     emit_insn(Rt >> 2);
3097
     prevToken();
3098
}
3099
 
3100
// ----------------------------------------------------------------------------
3101
// rts
3102
// rts #24
3103
// rtl
3104
// ----------------------------------------------------------------------------
3105
 
3106
static void process_rts(int oc)
3107
{
3108
     int64_t val,val1;
3109
 
3110
     val = 0;
3111
     NextToken();
3112
     if (token=='#') {
3113
        val = expr();
3114
     }
3115
     if (val > 15 || val < 0) {
3116
         printf("%d Return point too far.\r\n", lineno);
3117
         return;
3118
     }
3119
     if (val > 0) {
3120
        num_insns++;
3121
        emit_insn(predicate);
3122
        emit_insn(0xA3);
3123
        emit_insn(0x10|val);
3124
     }
3125
     else {
3126
        num_insns++;
3127
         emit_insn(predicate);
3128
         emit_insn(0xF2);
3129
     }
3130
}
3131
 
3132
// ----------------------------------------------------------------------------
3133
// asli r1,r2,#5
3134
// ----------------------------------------------------------------------------
3135
 
3136
static void process_shifti(int oc, int fn)
3137
{
3138
     int Ra;
3139
     int Rt;
3140
     int64_t val;
3141
 
3142
     Rt = getRegisterX();
3143
     need(',');
3144
     Ra = getRegisterX();
3145
     need(',');
3146
     NextToken();
3147
     val = expr();
3148
     emit_insn(predicate);
3149
     emit_insn4((fn << 26)|
3150
                (Rt << 20)|
3151
                ((val & 0x3F) << 14)|
3152
                (Ra << 8)|
3153
                oc);
3154
/*
3155
     emit_insn(oc);
3156
     emit_insn(Ra|(val << 6));
3157
     emit_insn(((val & 0x3f) >> 2)|(Rt << 4));
3158
     emit_insn((Rt >> 4)|(fn << 2));
3159
*/
3160
     ScanToEOL();
3161
}
3162
 
3163
// ----------------------------------------------------------------------------
3164
// gran r1
3165
// ----------------------------------------------------------------------------
3166
 
3167
static void process_gran(int oc)
3168
{
3169
    int Rt;
3170
 
3171
    Rt = getRegisterX();
3172
        num_insns++;
3173
    emitAlignedCode(0x01);
3174
    emit_insn(0x00);
3175
    emit_insn(Rt);
3176
    emit_insn(0x00);
3177
    emit_insn(oc);
3178
    prevToken();
3179
}
3180
 
3181
// ----------------------------------------------------------------------------
3182
// ----------------------------------------------------------------------------
3183
 
3184
static void process_mtspr(int oc)
3185
{
3186
    int spr;
3187
    int Ra;
3188
    int Rc;
3189
    int fn = 0;
3190
 
3191
    SkipSpaces();
3192
    if (*inptr=='!') {
3193
      fn = 0x10;
3194
      inptr++;
3195
    }
3196
    Rc = getRegisterX();
3197
    if (Rc==-1) {
3198
        Rc = 0;
3199
        spr = Thor_getSprRegister();
3200
        spr &= 0x3f;
3201
        if (spr==-1) {
3202
            printf("Line %d: An SPR is needed.\r\n", lineno);
3203
            return;
3204
        }
3205
    }
3206
    else
3207
       spr = 0;
3208
    need(',');
3209
    Ra = getRegisterX();
3210
    emit_insn(predicate);
3211
    emit_insn3(
3212
               (fn << 20) |
3213
               (spr << 14) |
3214
               (Ra << 8)|
3215
               oc
3216
    );
3217
//    emit_insn(oc);
3218
//    emit_insn(Ra|((spr & 3)<<6));
3219
//    emit_insn(fn | (spr >> 2));
3220
    if (Ra >= 0)
3221
    prevToken();
3222
}
3223
 
3224
// ----------------------------------------------------------------------------
3225
// ----------------------------------------------------------------------------
3226
 
3227
static void process_mfspr(int oc)
3228
{
3229
    int spr;
3230
    int Rt;
3231
    int Ra;
3232
 
3233
    Rt = getRegisterX();
3234
    need(',');
3235
    spr = Thor_getSprRegister();
3236
    spr &= 0x3f;
3237
    if (spr==-1) {
3238
        printf("An SPR is needed.\r\n");
3239
        return;
3240
    }
3241
    emit_insn(predicate);
3242
    emit_insn3(
3243
               (Rt << 14) |
3244
               (spr << 8) |
3245
               oc
3246
    );
3247
//    emit_insn(oc);
3248
//    emit_insn(spr|(Rt << 6));
3249
//    emit_insn(Rt >> 2);
3250
    if (spr >= 0)
3251
    prevToken();
3252
}
3253
 
3254
// ----------------------------------------------------------------------------
3255
// ----------------------------------------------------------------------------
3256
static void getSzDir(int *sz, int *dir)
3257
{
3258
    *sz = inptr[0];
3259
    switch(*sz) {
3260
    case 'b': case 'B': *sz = 0; break;
3261
    case 'c': case 'C': *sz = 1; break;
3262
    case 'h': case 'H': *sz = 2; break;
3263
    case 'w': case 'W': *sz = 3; break;
3264
    default:
3265
             printf("%d bad string size.\r\n", lineno);
3266
             *sz = 0;
3267
    }
3268
    *dir = inptr[1];
3269
    switch(*dir) {
3270
    case 'i': case 'I': *dir = 0; break;
3271
    case 'd': case 'D': *dir = 1; break;
3272
    default:
3273
              printf("%d bad inc/dec indicator.\r\n", lineno);
3274
              *dir = 0;
3275
    }
3276
    inptr += 2;
3277
}
3278
 
3279
// ----------------------------------------------------------------------------
3280
// ----------------------------------------------------------------------------
3281
 
3282
static void process_stcmp(int oc)
3283
{
3284
    int sz;
3285
    int dir;
3286
    int64_t disp;
3287
    int Ra, Rb, Rc;
3288
    int sc;
3289
    int md;
3290
 
3291
    if (seg == -1)
3292
       seg = 1;
3293
 
3294
    getSzDir(&sz,&dir);
3295
    NextToken();
3296
    mem_operand(&disp, &Ra, &Rc, &sc, &md);
3297
    if (disp!=0 || Rc != -1 || sc != 0)
3298
        printf("%d: illegal memory operand - 1.\r\n", lineno);
3299
    if (token==']')
3300
       NextToken();
3301
    need(',');
3302
    NextToken();
3303
    mem_operand(&disp, &Rb, &Rc, &sc, &md);
3304
    if (disp!=0 || Rc != -1 || sc != 0)
3305
        printf("%d: illegal memory operand - 2.\r\n", lineno);
3306
    if (token==']')
3307
       NextToken();
3308
    need(',');
3309
    Rc = getRegisterX();
3310
    if (Ra==-1 || Rb==-1 || Rc==-1)
3311
       printf("%d bad register.\r\n");
3312
    emit_insn(predicate);
3313
    if (segmodel==2)
3314
        emit_insn4(
3315
               (dir << 28)|
3316
               (sz << 26)|
3317
               (Rc << 20)|
3318
               (Rb << 14)|
3319
               (Ra << 8)|
3320
               oc
3321
    );
3322
    else
3323
        emit_insn4(
3324
               (seg << 29)|
3325
               (dir << 28)|
3326
               (sz << 26)|
3327
               (Rc << 20)|
3328
               (Rb << 14)|
3329
               (Ra << 8)|
3330
               oc
3331
    );
3332
//    emit_insn(oc);
3333
//    emit_insn(Ra|(Rb << 6));
3334
//    emit_insn((Rb >> 2)|(Rc << 4));
3335
//    emit_insn((Rc >> 4) | (sz << 2) | (dir << 4)|(seg << 5));
3336
}
3337
 
3338
// ----------------------------------------------------------------------------
3339
// ----------------------------------------------------------------------------
3340
 
3341
static void process_cmp()
3342
{
3343
    int Pt;
3344
    int Ra;
3345
    int Rb;
3346
    int64_t val;
3347
 
3348
    Pt = getPredreg();
3349
    need(',');
3350
    Ra = getRegisterX();
3351
    need(',');
3352
    NextToken();
3353
    if (token=='#') {
3354
       val = expr();
3355
        emitImm10(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
3356
    //    emitImm15(val,lastsym!=(SYM*)NULL);
3357
        if (bGen && lastsym && !use_gp)
3358
        if( lastsym->segment < 5)
3359
        sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | 4 | (lastsym->isExtern ? 128 : 0)|
3360
        (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
3361
       emit_insn(predicate);
3362
       emit_insn3(
3363
                  ((val & 0x3FF) << 14)|
3364
                  (Ra << 8)|
3365
                  (Pt|0x20)
3366
       );
3367
//       emit_insn(Pt|0x20);
3368
//       emit_insn(Ra|(val << 6));
3369
//       emit_insn(val >> 2);
3370
    }
3371
    else {
3372
        prevToken();
3373
        Rb = getRegisterX();
3374
        emit_insn(predicate);
3375
        emit_insn3(
3376
                   (Rb << 14) |
3377
                   (Ra << 8) |
3378
                   (Pt|0x10)
3379
        );
3380
//        emit_insn(Pt|0x10);
3381
//        emit_insn(Ra|(Rb << 6));
3382
//        emit_insn(Rb >> 2);
3383
        prevToken();
3384
    }
3385
}
3386
 
3387
static void process_pand(int oc, int fn)
3388
{
3389
    int Bt;
3390
    int Ba;
3391
    int Bb;
3392
 
3393
    Bt = getBitno();
3394
    need(',');
3395
    Ba = getBitno();
3396
    need(',');
3397
    Bb = getBitno();
3398
    if (Bt==-1 || Ba==-1 || Bb==-1)
3399
       printf("%d expecting a bit number.\r\n", lineno);
3400
    emit_insn(predicate);
3401
    emit_insn4(
3402
               (fn << 26) |
3403
               (Bt << 20) |
3404
               (Bb << 14) |
3405
               (Ba << 8) |
3406
               oc
3407
    );
3408
//    emit_insn(oc);
3409
//    emit_insn(Ba|(Bb << 6));
3410
//    emit_insn((Bb >> 2)|(Bt << 4));
3411
//    emit_insn((Bt >> 4)|(fn << 2));
3412
}
3413
 
3414
static void process_biti(int oc)
3415
{
3416
    int Pt;
3417
    int Ra;
3418
    int Rb;
3419
    int64_t val;
3420
 
3421
    Pt = getPredreg();
3422
    need(',');
3423
    Ra = getRegisterX();
3424
    need(',');
3425
    NextToken();
3426
    if (token=='#') {
3427
       val = expr();
3428
        emitImm12(val,lastsym!=(SYM*)NULL?(lastsym->segment==codeseg ? code_bits : data_bits):0);
3429
    //    emitImm15(val,lastsym!=(SYM*)NULL);
3430
        if (bGen && lastsym && !use_gp)
3431
        if( lastsym->segment < 5)
3432
        sections[segment+7].AddRel(sections[segment].index,((lastsym->ord+1) << 32) | THOR_FUT6 | (lastsym->isExtern ? 128 : 0)|
3433
        (lastsym->segment==codeseg ? code_bits << 8 : data_bits << 8));
3434
       emit_insn(predicate);
3435
       emit_insn4(
3436
                  ((val & 0xFFF) << 20) |
3437
                  (Pt << 14) |
3438
                  (Ra << 8) |
3439
                  oc
3440
       );
3441
//       emit_insn(oc);
3442
//       emit_insn(Ra|(Pt << 6));
3443
//       emit_insn((Pt>>2)|(val << 4));
3444
//       emit_insn(val >> 4);
3445
    }
3446
    else {
3447
         printf("%d: register mode not supported.\r\n");
3448
        prevToken();
3449
    }
3450
}
3451
 
3452
static void process_stp(int oc)
3453
{
3454
    int64_t val;
3455
 
3456
    val = 0;
3457
    NextToken();
3458
    if (token=='#')
3459
       val = expr();
3460
    emit_insn(predicate);
3461
    emit_insn3(
3462
               ((val & 0xFFFF) << 8) |
3463
               oc
3464
    );
3465
//    emit_insn(oc);
3466
//    emit_insn(val);
3467
//    emit_insn(val >> 8);
3468
}
3469
 
3470
static void process_sync(int oc)
3471
{
3472
    num_insns++;
3473
    emit_insn(predicate);
3474
    emit_insn(oc);
3475
}
3476
 
3477
static void process_tlb(int oc, int cmd)
3478
{
3479
    int Rb;
3480
    int Tn;
3481
 
3482
    Rb = 0;
3483
    Tn = 0;
3484
    switch(cmd) {
3485
    case 1:     Rb = getRegisterX(); prevToken(); break;  // TLBPB
3486
    case 2:     Rb = getRegisterX(); prevToken(); break;  // TLBRD
3487
    case 3:     break;       // TLBWR
3488
    case 4:     break;       // TLBWI
3489
    case 5:     break;       // TLBEN
3490
    case 6:     break;       // TLBDIS
3491
    case 7:     {            // TLBRDREG
3492
                Rb = getRegisterX();
3493
                need(',');
3494
                Tn = getTlbReg();
3495
                }
3496
                break;
3497
    case 8:     {            // TLBWRREG
3498
                Tn = getTlbReg();
3499
                need(',');
3500
                Rb = getRegisterX();
3501
                prevToken();
3502
                }
3503
                break;
3504
    case 9:     break;
3505
 
3506
    }
3507
    emit_insn(predicate);
3508
    emit_insn3(
3509
        (Rb << 16) |
3510
        (cmd << 8) | (Tn << 12) |
3511
        oc
3512
    );
3513
//    emit_insn(oc);
3514
//    emit_insn(cmd|(Tn << 4));
3515
//    emit_insn(Rb);    
3516
}
3517
 
3518
// ----------------------------------------------------------------------------
3519
// ----------------------------------------------------------------------------
3520
 
3521
static void process_tst(int fn)
3522
{
3523
    int Pt;
3524
    int Ra;
3525
 
3526
    if (inptr[0]=='.') {
3527
        ++inptr;
3528
        switch(inptr[0]) {
3529
        case 's': case 'S': fn = 1; break;
3530
        case 'd': case 'D': fn = 2; break;
3531
        default: fn = 0; break;
3532
        }
3533
        inptr++;
3534
    }
3535
    Pt = getPredreg();
3536
    need(',');
3537
    Ra = getRegisterX();
3538
    num_insns++;
3539
    emit_insn(predicate);
3540
    emit_insn(Pt);
3541
    emit_insn(Ra|(fn << 6));
3542
    prevToken();
3543
}
3544
 
3545
// ----------------------------------------------------------------------------
3546
// ----------------------------------------------------------------------------
3547
 
3548
static void ProcessEOL(int opt)
3549
{
3550
    int nn,mm;
3551
    int first;
3552
    int cc;
3553
 
3554
     //printf("Line: %d\r", lineno);
3555
     expand_flag = 0;
3556
     predicate = 0x01;
3557
     seg = -1;
3558
     segprefix = -1;
3559
     if (bGen && (segment==codeseg || segment==dataseg || segment==rodataseg)) {
3560
    nn = binstart;
3561
    cc = 8;
3562
    if (segment==codeseg) {
3563
       cc = 12;
3564
/*
3565
        if (sections[segment].bytes[binstart]==0x61) {
3566
            fprintf(ofp, "%06LLX ", ca);
3567
            for (nn = binstart; nn < binstart + 5 && nn < sections[segment].index; nn++) {
3568
                fprintf(ofp, "%02X ", sections[segment].bytes[nn]);
3569
            }
3570
            fprintf(ofp, "   ; imm\n");
3571
             if (((ca+5) & 15)==15) {
3572
                 ca+=6;
3573
                 binstart+=6;
3574
                 nn++;
3575
             }
3576
             else {
3577
                  ca += 5;
3578
                  binstart += 5;
3579
             }
3580
        }
3581
*/
3582
/*
3583
        if (sections[segment].bytes[binstart]==0xfd) {
3584
            fprintf(ofp, "%06LLX ", ca);
3585
            for (nn = binstart; nn < binstart + 5 && nn < sections[segment].index; nn++) {
3586
                fprintf(ofp, "%02X ", sections[segment].bytes[nn]);
3587
            }
3588
            fprintf(ofp, "   ; imm\n");
3589
             if (((ca+5) & 15)==15) {
3590
                 ca+=6;
3591
                 binstart+=6;
3592
                 nn++;
3593
             }
3594
             else {
3595
                  ca += 5;
3596
                  binstart += 5;
3597
             }
3598
        }
3599
         if (sections[segment].bytes[binstart]==0xfe) {
3600
            fprintf(ofp, "%06LLX ", ca);
3601
            for (nn = binstart; nn < binstart + 5 && nn < sections[segment].index; nn++) {
3602
                fprintf(ofp, "%02X ", sections[segment].bytes[nn]);
3603
            }
3604
            fprintf(ofp, "   ; imm\n");
3605
             if (((ca+5) & 15)==15) {
3606
                 ca+=6;
3607
                 nn++;
3608
             }
3609
             else {
3610
                  ca += 5;
3611
             }
3612
        }
3613
*/
3614
    }
3615
 
3616
    first = 1;
3617
    while (nn < sections[segment].index) {
3618
        fprintf(ofp, "%06LLX ", ca);
3619
        for (mm = nn; nn < mm + cc && nn < sections[segment].index; nn++) {
3620
            fprintf(ofp, "%02X ", sections[segment].bytes[nn]);
3621
        }
3622
        for (; nn < mm + cc; nn++)
3623
            fprintf(ofp, "   ");
3624
        if (first & opt) {
3625
            fprintf(ofp, "\t%.*s\n", inptr-stptr-1, stptr);
3626
            first = 0;
3627
        }
3628
        else
3629
            fprintf(ofp, opt ? "\n" : "; NOP Ramp\n");
3630
        ca += cc;
3631
    }
3632
    // empty (codeless) line
3633
    if (binstart==sections[segment].index) {
3634
        fprintf(ofp, "%41s\t%.*s", "", inptr-stptr, stptr);
3635
    }
3636
    } // bGen
3637
    if (opt) {
3638
       stptr = inptr;
3639
       lineno++;
3640
    }
3641
//    printf("line:%d\r",lineno);
3642
    binstart = sections[segment].index;
3643
    ca = sections[segment].address;
3644
}
3645
 
3646
// ----------------------------------------------------------------------------
3647
// ----------------------------------------------------------------------------
3648
 
3649
void Thor_processMaster()
3650
{
3651
    int nn,mm;
3652
    int64_t bs1, bs2;
3653
 
3654
    lineno = 1;
3655
    binndx = 0;
3656
    binstart = 0;
3657
    bs1 = 0;
3658
    bs2 = 0;
3659
    inptr = &masterFile[0];
3660
    stptr = inptr;
3661
    code_address = 0;
3662
    bss_address = 0;
3663
    start_address = 0;
3664
    data_address = 0;
3665
    first_org = 1;
3666
    first_rodata = 1;
3667
    first_data = 1;
3668
    first_bss = 1;
3669
    for (nn = 0; nn < 12; nn++) {
3670
        sections[nn].index = 0;
3671
        if (nn == 0)
3672
        sections[nn].address = 0;
3673
        else
3674
        sections[nn].address = 0;
3675
        sections[nn].start = 0;
3676
        sections[nn].end = 0;
3677
    }
3678
    ca = code_address;
3679
    segment = codeseg;
3680
    memset(current_label,0,sizeof(current_label));
3681
    predicate = 0x01;
3682
    seg = -1;
3683
    num_bytes = 0;
3684
    num_insns = 0;
3685
    expand_flag = 0;
3686
    NextToken();
3687
    while (token != tk_eof) {
3688
/*
3689
        if (pass > 1) {
3690
 
3691
        printf("\t%.*s\n", inptr-stptr-1, stptr);
3692
        printf("fo:%d %d token=%d\r\n", first_org, lineno, token);
3693
        if (first_org != 1) getchar();
3694
    }
3695
*/
3696
j_processToken:
3697
//        printf("line: %d, token %d\r\n", lineno, token);
3698
          if (expandedBlock)
3699
             expand_flag = 1;
3700
        switch(token) {
3701
          case '+': expand_flag = 1; break;
3702
        case tk_eol: ProcessEOL(1); break;
3703
        case tk_add:  process_rrop(0x40,0x00); break;
3704
        case tk_addi: process_riop(0x48); break;
3705
        case tk_addu:  process_rrop(0x40,0x04); break;
3706
        case tk_addui: process_riop(0x4C); break;
3707
        case tk_2addu:  process_rrop(0x40,0x08); break;
3708
        case tk_4addu:  process_rrop(0x40,0x09); break;
3709
        case tk_8addu:  process_rrop(0x40,0x0A); break;
3710
        case tk_16addu:  process_rrop(0x40,0x0B); break;
3711
        case tk_2addui:  process_riop(0x6B); break;
3712
        case tk_4addui:  process_riop(0x6C); break;
3713
        case tk_8addui:  process_riop(0x6D); break;
3714
        case tk_16addui:  process_riop(0x6E); break;
3715
        case tk_align: process_align(); continue; break;
3716
        case tk_and:  process_rrop(0x50,0x00); break;
3717
        case tk_andi:  process_riop(0x53); break;
3718
        case tk_asl:  process_rrop(0x58,0x00); break;
3719
        case tk_asli: process_shifti(0x58,0x10); break;
3720
        case tk_asr:  process_rrop(0x58,0x01); break;
3721
        case tk_asri: process_shifti(0x58,0x11); break;
3722
        case tk_begin_expand: expandedBlock = 1; break;
3723
//        case tk_bfextu: process_bitfield(6); break;
3724
        case tk_biti: process_biti(0x46); break;
3725
        case tk_br:  process_br(0x30); break;
3726
        case tk_brk: emit_insn(0x00); break;
3727
        case tk_bsr: process_jsr(15); break;
3728
        case tk_bss:
3729
            if (first_bss) {
3730
                while(sections[segment].address & 4095)
3731
                    emitByte(0x00);
3732
                sections[3].address = sections[segment].address;
3733
                first_bss = 0;
3734
                binstart = sections[3].index;
3735
                ca = sections[3].address;
3736
            }
3737
            segment = bssseg;
3738
            break;
3739
        case tk_byte:  process_db(); break;
3740
        case tk_cas: process_load(0x6C); break;
3741
        case tk_chk: process_rrop(0x40,0x14); break;
3742
        case tk_chki: process_riop(0x5D); break;
3743
        case tk_cli: emit_insn(predicate); emit_insn(0xFA); break;
3744
        case tk_cmp: process_cmp(); break;
3745
        case tk_cmpi: process_cmp(); break;
3746
        case tk_code: process_code(); break;
3747
        case tk_com: process_rop(0xA7,0x0B); break;
3748
        case tk_cpuid: process_cpuid(0x36); break;
3749
        case tk_cs: seg = 7; break;
3750
        case tk_data:
3751
             // Process data declarations as if we are in the rodata segment
3752
             // for initialization data.
3753
             if (isInitializationData) {
3754
                 token = tk_rodata;
3755
                 goto j_processToken;
3756
             }
3757
            if (first_data) {
3758
                while(sections[segment].address & 4095)
3759
                    emitByte(0x00);
3760
                sections[2].address = sections[segment].address;   // set starting address
3761
                first_data = 0;
3762
                binstart = sections[2].index;
3763
                ca = sections[2].address;
3764
            }
3765
            process_data(dataseg);
3766
            break;
3767
        case tk_db:  process_db(); break;
3768
        case tk_dc:  process_dc(); break;
3769
        case tk_dec: process_inc(0xC8); break;
3770
        case tk_dh:  process_dh(); break;
3771
        case tk_dh_htbl:  process_dh_htbl(); break;
3772
        case tk_div: process_rrop(0x40,0x03); break;
3773
        case tk_divi: process_riop(0x4B); break;
3774
        case tk_divu: process_rrop(0x40,0x07); break;
3775
        case tk_divui: process_riop(0x4F); break;
3776
        case tk_ds: seg = 1; break;
3777
        case tk_dw:  process_dw(); break;
3778
        case tk_end: goto j1;
3779
        case tk_end_expand: expandedBlock = 0; break;
3780
        case tk_endpublic: break;
3781
        case tk_enor:  process_rrop(0x50,0x05); break;
3782
        case tk_eor: process_rrop(0x50,0x02); break;
3783
        case tk_eori: process_riop(0x55); break;
3784
        case tk_es: seg = 2; break;
3785
        case tk_extern: process_extern(); break;
3786
 
3787
        case tk_fabs: process_fprop(0x77,0x05); break;
3788
        case tk_fadd: process_fprrop(0x78,0x08); break;
3789
//        case tk_fcmp: process_fprrop(0x2A); break;
3790
        case tk_fdiv: process_fprrop(0x78,0x0C); break;
3791
        case tk_ftst:   process_tst(2); break;
3792
        case tk_fs: seg = 3; break;
3793
        case tk_gs: seg = 4; break;
3794
        case tk_hs: seg = 5; break;
3795
/*
3796
        case tk_fcx: process_fpstat(0x74); break;
3797
        case tk_fdx: process_fpstat(0x77); break;
3798
        case tk_fex: process_fpstat(0x76); break;
3799
*/
3800
        case tk_fill: process_fill(); break;
3801
        case tk_fix2flt: process_fprop(0x77,0x03); break;
3802
        case tk_flt2fix: process_fprop(0x77,0x02); break;
3803
        case tk_fmov: process_fprop(0x77,0x00); break;
3804
        case tk_fmul: process_fprrop(0x78,0x0A); break;
3805
        case tk_fnabs: process_fprop(0x77,0x08); break;
3806
/*
3807
        case tk_frm: process_fpstat(0x78); break;
3808
        case tk_fstat: process_fprdstat(0x86); break;
3809
        case tk_ftx: process_fpstat(0x75); break;
3810
*/
3811
        case tk_fneg: process_fprop(0x77,0x04); break;
3812
        case tk_fsub: process_fprrop(0x78,0x09); break;
3813
 
3814
        case tk_gran: process_gran(0x14); break;
3815
        case tk_inc: process_inc(0xC7); break;
3816
//        case tk_int: process_brk(2); break;
3817
 
3818
        case tk_jci:  process_jmpi(1); break;
3819
        case tk_jhi:  process_jmpi(2); break;
3820
        case tk_jmp: process_jsr(1); break;
3821
        case tk_jsf: emit_insn(predicate); emit_insn(0xFE); break;
3822
        case tk_jsr: process_jsr(0); break;
3823
 
3824
        case tk_lb:  process_load(0x80); break;
3825
        case tk_lbu: process_load(0x81); break;
3826
        case tk_lc:  process_load(0x82); break;
3827
        case tk_lcu: process_load(0x83); break;
3828
        case tk_ldi: process_ldi(0x6F); break;
3829
        case tk_ldis: process_ldis(0x9D); break;
3830
 
3831
        case tk_lea: process_load(0x4C); break;
3832
//        case tk_leax: process_load(0x4C); break;
3833
        case tk_lfd: process_load(0x51); break;
3834
 
3835
        case tk_lh:  process_load(0x84); break;
3836
        case tk_lhu: process_load(0x85); break;
3837
        case tk_lla: process_load(0x6A); break;
3838
//        case tk_llax: process_load(0xB8); break;
3839
        case tk_loop: process_loop(0xA4); break;
3840
        case tk_lsr: process_rrop(0x58,0x03); break;
3841
        case tk_lsri: process_shifti(0x58,0x13); break;
3842
        case tk_lvb: process_load(0xAC); break;
3843
        case tk_lvc: process_load(0xAD); break;
3844
        case tk_lvh: process_load(0xAE); break;
3845
        case tk_lvw: process_load(0xAF); break;
3846
        case tk_lw:  process_load(0x86); break;
3847
        case tk_lws: process_lws(0x8E,0); break;
3848
        case tk_lvwar:  process_load(0x8B); break;
3849
        case tk_memdb: process_sync(0xF9); break;
3850
        case tk_memsb: process_sync(0xF8); break;
3851
        case tk_message: process_message(); break;
3852
        case tk_mfspr: process_mfspr(0xA8); break;
3853
        case tk_max: process_rrop(0x40,0x11); break;
3854
        case tk_mod: process_rrop(0x40,0x13); break;
3855
        case tk_modu: process_rrop(0x40,0x17); break;
3856
        case tk_modi: process_riop(0x5B); break;
3857
        case tk_modui: process_riop(0x5F); break;
3858
        case tk_mov: process_mov(); break;
3859
        case tk_mtspr: process_mtspr(0xA9); break;
3860
        case tk_mul: process_rrop(0x40,0x02); break;
3861
        case tk_muli: process_riop(0x4A); break;
3862
        case tk_mulu: process_rrop(0x40,0x06); break;
3863
        case tk_mului: process_riop(0x4E); break;
3864
        case tk_nand:  process_rrop(0x50,0x03); break;
3865
        case tk_neg: process_rop(0xA7,0x01); break;
3866
        case tk_nop: emit_insn(0x10); break;
3867
        case tk_nor:  process_rrop(0x50,0x04); break;
3868
        case tk_not: process_rop(0xA7,0x02); break;
3869
        case tk_or:  process_rrop(0x50,0x01); break;
3870
        case tk_ori: process_riop(0x54); break;
3871
        case tk_org: process_org(); break;
3872
        case tk_pand: process_pand(0x42,0x00); break;
3873
        case tk_por: process_pand(0x42,0x01); break;
3874
        case tk_peor: process_pand(0x42,0x02); break;
3875
        case tk_pnand: process_pand(0x42,0x03); break;
3876
        case tk_pnor: process_pand(0x42,0x04); break;
3877
        case tk_penor: process_pand(0x42,0x05); break;
3878
        case tk_pandc: process_pand(0x42,0x06); break;
3879
        case tk_porc: process_pand(0x42,0x07); break;
3880
        case tk_pop: process_push(0xCA); break;
3881
        case tk_pred:
3882
             if (isdigit(inptr[0]) && isdigit(inptr[1])) {
3883
                  predicate = ((inptr[0]-'0' * 10) + (inptr[1]-'0')) << 4;
3884
                  inptr += 2;
3885
                  if (inptr[0]=='.') inptr++;
3886
                  nn = getPredcon();
3887
                  if (nn >= 0)
3888
                     predicate |= nn;
3889
             }
3890
             else if (isdigit(inptr[0])) {
3891
                  predicate = (inptr[0]-'0') << 4;
3892
                  inptr += 1;
3893
                  if (inptr[0]=='.') inptr++;
3894
                  nn = getPredcon();
3895
                  if (nn >= 0)
3896
                     predicate |= nn;
3897
             }
3898
             SkipSpaces();
3899
             break;
3900
        case tk_public: process_public(); break;
3901
        case tk_push: process_push(0xC8); break;
3902
        case tk_rodata:
3903
            if (first_rodata) {
3904
                while(sections[segment].address & 4095)
3905
                    emitByte(0x00);
3906
                sections[1].address = sections[segment].address;
3907
                first_rodata = 0;
3908
                binstart = sections[1].index;
3909
                ca = sections[1].address;
3910
            }
3911
            segment = rodataseg;
3912
            break;
3913
        case tk_rol: process_rrop(0x58,0x04); break;
3914
        case tk_ror: process_rrop(0x58,0x05); break;
3915
        case tk_roli: process_shifti(0x58,0x14); break;
3916
        case tk_rori: process_shifti(0x58,0x15); break;
3917
        case tk_rte: emit_insn(predicate); emit_insn(0xF3); break;
3918
        case tk_rtf: emit_insn(predicate); emit_insn(0xFD); break;
3919
        case tk_rti: emit_insn(predicate); emit_insn(0xF4); break;
3920
        case tk_rtl: process_rts(0x27); break;
3921
        case tk_rts: process_rts(0x3B); break;
3922
        case tk_sb:  process_store(0x90); break;
3923
//        case tk_sbx:  process_store(0xC0); break;
3924
        case tk_sc:  process_store(0x91); break;
3925
//        case tk_scx:  process_store(0xC1); break;
3926
        case tk_sei: emit_insn(predicate); emit_insn(0xFB); break;
3927
        case tk_sfd: process_store(0x71); break;
3928
        case tk_sh:  process_store(0x92); break;
3929
        case tk_shl:  process_rrop(0x58,0x00); break;
3930
        case tk_shli: process_shifti(0x58,0x10); break;
3931
        case tk_shr:  process_rrop(0x58,0x01); break;
3932
        case tk_shri: process_shifti(0x58,0x11); break;
3933
        case tk_shru:  process_rrop(0x58,0x03); break;
3934
        case tk_shrui: process_shifti(0x58,0x13); break;
3935
//        case tk_shx:  process_store(0xC2); break;
3936
        case tk_ss: seg = 6; break;
3937
        case tk_stcmp: process_stcmp(0x9A); break;
3938
        case tk_stmov: process_stcmp(0x99); break;
3939
        case tk_stp: process_stp(0xF6); break;
3940
        case tk_stset: process_stset(0x98); break;
3941
//        case tk_stsb: process_sts(0x98,0); break;
3942
//        case tk_stsc: process_sts(0x98,1); break;
3943
//        case tk_stsh: process_sts(0x98,2); break;
3944
//        case tk_stsw: process_sts(0x98,3); break;
3945
        case tk_sub:  process_rrop(0x40,0x01); break;
3946
        case tk_subi: process_riop(0x49); break;
3947
        case tk_subu:  process_rrop(0x40,0x05); break;
3948
        case tk_subui: process_riop(0x4D); break;
3949
        case tk_sws: process_sws(0x9E,0); break;
3950
        case tk_sxb: process_rop(0xA7,0x08); break;
3951
        case tk_sxc: process_rop(0xA7,0x09); break;
3952
        case tk_sxh: process_rop(0xA7,0x0A); break;
3953
        case tk_sync: process_sync(0xF7); break;
3954
        case tk_sys: process_sys(0xA5); break;
3955
        case tk_sw:  process_store(0x93); break;
3956
        case tk_swcr:  process_store(0x8C); break;
3957
//        case tk_swx:  process_store(0xC3); break;
3958
        case tk_tlbdis:  process_tlb(0xFFF6F0,6); break;
3959
        case tk_tlben:   process_tlb(0xFFF5F0,5); break;
3960
        case tk_tlbpb:   process_tlb(0x0001F0,1); break;
3961
        case tk_tlbrd:   process_tlb(0x0002F0,2); break;
3962
        case tk_tlbrdreg:   process_tlb(0x0007F0,7); break;
3963
        case tk_tlbwi:   process_tlb(0x0004F0,4); break;
3964
        case tk_tlbwr:   process_tlb(0x0003F0,3); break;
3965
        case tk_tlbwrreg:   process_tlb(0x0008F0,8); break;
3966
        case tk_tst:   process_tst(0); break;
3967
        case tk_xor: process_rrop(0x40,0x02); break;
3968
        case tk_xori: process_riop(0x55); break;
3969
        case tk_id:  process_label(); break;
3970
        case tk_zs:  seg = 0; break;
3971
        case tk_zxb: process_rop(0xA7,0x0C); break;
3972
        case tk_zxc: process_rop(0xA7,0x0D); break;
3973
        case tk_zxh: process_rop(0xA7,0x0E); break;
3974
        }
3975
        NextToken();
3976
    }
3977
j1:
3978
    ;
3979
}
3980
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.