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

Subversion Repositories or1k

[/] [or1k/] [branches/] [oc/] [gdb-5.0/] [sim/] [z8k/] [writecode.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 106 markom
 
2
/* generate instructions for Z8KSIM
3
   Copyright (C) 1992, 1993 Free Software Foundation, Inc.
4
 
5
This file is part of Z8KSIM
6
 
7
Z8KSIM is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2, or (at your option)
10
any later version.
11
 
12
Z8KSIM is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with Z8KZIM; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
 
21
/* This program generates the code which emulates each of the z8k
22
   instructions
23
 
24
   code goes into three files, tc-gen1.h, tc-gen2.h and tc-gen3.h.
25
   which file being made depends upon the options
26
 
27
   -1  tc-gen1.h contains the fully expanded code for some selected
28
       opcodes, (those in the quick.c list)
29
 
30
   -2   tc-gen2.h contains a list of pointers to functions, one for each
31
   opcode.  It points to functions in tc-gen3.h and tc-gen1.h
32
   depending upon quick.c
33
 
34
   -3   tc-gen3.h contains all the opcodes in unexpanded form.
35
 
36
   -b3   tc-genb3.h same as -3 but for long pointers
37
 
38
   -m  regenerates list.c, which is an inverted list of opcodes to
39
       pointers into the z8k dissassemble opcode table, it's just there
40
       to makes things faster.
41
   */
42
 
43
/* steve chamberlain
44
   sac@cygnus.com */
45
 
46
#include "config.h"
47
 
48
#include <ansidecl.h>
49
#include <stdio.h>
50
#ifdef HAVE_STDLIB_H
51
#include <stdlib.h>
52
#endif
53
#ifdef HAVE_STRING_H
54
#include <string.h>
55
#else
56
#ifdef HAVE_STRINGS_H
57
#include <strings.h>
58
#endif
59
#endif
60
 
61
#define NICENAMES
62
 
63
#define DEFINE_TABLE
64
#include "../opcodes/z8k-opc.h"
65
 
66
#define NOPS 500
67
 
68
#define DIRTY_HACK 0 /* Enable if your gcc can't cope with huge tables */
69
extern short z8k_inv_list[];
70
struct opcode_value
71
{
72
  int n;
73
  struct opcode_value *next;
74
};
75
 
76
#define NICENAMES
77
int BIG;
78
 
79
static char *reg_names[] =
80
{"bad", "src", "dst", "aux_a", "aux_b", "aux_r", "aux_x"};
81
 
82
#define IS_DST(x) ((x & 0xf) == 2)
83
#define IS_SRC(x) ((x & 0xf)==1)
84
#define SIZE_ADDRESS (BIG ? 8 : 4)      /* number of nibbles in a ptr*/
85
 
86
static int file;
87
static int makelist;
88
 
89
static int nibs = 0;
90
 
91
static char *current_size;
92
static char *current_name;
93
static char current_word0[40];
94
static char current_byte0[40];
95
static char current_byte1[40];
96
static int indent;
97
static char *p;
98
static char *d;
99
 
100
struct opcode_value *list[NOPS];
101
 
102
static opcode_entry_type *
103
lookup_inst (what)
104
     int what;
105
{
106
  if (makelist)
107
    {
108
 
109
      int nibl_index;
110
      int nibl_matched;
111
      unsigned short instr_nibl;
112
      unsigned short tabl_datum, datum_class, datum_value;
113
      char instr_nibbles[8];
114
 
115
      opcode_entry_type *ptr = z8k_table;
116
 
117
      nibl_matched = 0;
118
 
119
      instr_nibbles[3] = (what >> 0) & 0xf;
120
      instr_nibbles[2] = (what >> 4) & 0xf;
121
      instr_nibbles[1] = (what >> 8) & 0xf;
122
      instr_nibbles[0] = (what >> 12) & 0xf;
123
 
124
      while (ptr->name)
125
        {
126
          nibl_matched = 1;
127
          for (nibl_index = 0; nibl_index < 4 && nibl_matched; nibl_index++)
128
            {
129
              instr_nibl = instr_nibbles[nibl_index];
130
 
131
              tabl_datum = ptr->byte_info[nibl_index];
132
              datum_class = tabl_datum & CLASS_MASK;
133
              datum_value = ~CLASS_MASK & tabl_datum;
134
 
135
              switch (datum_class)
136
                {
137
                case CLASS_BIT_1OR2:
138
                  if (datum_value != (instr_nibl & ~0x2))
139
                    nibl_matched = 0;
140
                  break;
141
 
142
                case CLASS_BIT:
143
                  if (datum_value != instr_nibl)
144
                    nibl_matched = 0;
145
                  break;
146
                case CLASS_00II:
147
                  if (!((~instr_nibl) & 0x4))
148
                    nibl_matched = 0;
149
                  break;
150
                case CLASS_01II:
151
                  if (!(instr_nibl & 0x4))
152
                    nibl_matched = 0;
153
                  break;
154
                case CLASS_0CCC:
155
                  if (!((~instr_nibl) & 0x8))
156
                    nibl_matched = 0;
157
                  break;
158
                case CLASS_1CCC:
159
                  if (!(instr_nibl & 0x8))
160
                    nibl_matched = 0;
161
                  break;
162
                case CLASS_0DISP7:
163
                  if (!((~instr_nibl) & 0x8))
164
                    nibl_matched = 0;
165
                  nibl_index += 1;
166
                  break;
167
                case CLASS_1DISP7:
168
                  if (!(instr_nibl & 0x8))
169
                    nibl_matched = 0;
170
                  nibl_index += 1;
171
                  break;
172
                case CLASS_REGN0:
173
                  if (instr_nibl == 0)
174
                    nibl_matched = 0;
175
                  break;
176
                default:
177
                  break;
178
                }
179
            }
180
          if (nibl_matched)
181
            {
182
              return ptr;
183
            }
184
          ptr++;
185
        }
186
      return 0;
187
    }
188
  else
189
    {
190
 
191
      if (z8k_inv_list[what] < 0)
192
        return 0;
193
      return z8k_table + z8k_inv_list[what];
194
    }
195
}
196
 
197
static char *
198
insn_4 (n)
199
     int n;
200
{
201
  switch (n)
202
    {
203
    case 1:
204
      return "((iwords_0>>8) & 0xf)";
205
    case 2:
206
      return "((ibytes_1 >> 4) & 0xf)";
207
    case 3:
208
      return "((ibytes_1) & 0xf)";
209
    case 4:
210
      return "((ibytes_2>>4) & 0xf)";
211
    case 5:
212
      return "((ibytes_2) & 0xf)";
213
    case 6:
214
      return "((ibytes_3 >> 4) & 0xf)";
215
    case 7:
216
      return "((ibytes_3) & 0xf)";
217
    default:
218
      return "****";
219
    }
220
}
221
 
222
char *
223
ptr_mode ()
224
{
225
  if (BIG)
226
    {
227
      return "ptr_long";
228
    }
229
  return "word";
230
}
231
 
232
static
233
char *
234
ptr_size ()
235
{
236
  if (BIG)
237
    return "4";
238
  return "2";
239
}
240
 
241
static char *
242
reg_n (x)
243
     unsigned int x;
244
{
245
  return reg_names[x & 0xf];
246
}
247
 
248
char *
249
stack_ptr ()
250
{
251
  return BIG ? "14" : "15";
252
}
253
 
254
char *
255
mem ()
256
{
257
#if 0
258
  return BIG ? "segmem" : "unsegmem";
259
#else
260
  return "mem";
261
#endif
262
}
263
 
264
int
265
match (a)
266
     char *a;
267
{
268
  if (strncmp (p, a, strlen (a)) == 0)
269
    {
270
      p += strlen (a);
271
      return 1;
272
    }
273
  return 0;
274
}
275
 
276
static
277
void
278
sub (y)
279
     char *y;
280
{
281
  sprintf (d, "%s", y);
282
  d += strlen (d);
283
}
284
 
285
static char *
286
insn_16 (n)
287
     int n;
288
{
289
  switch (n)
290
    {
291
    case 0:
292
      return "(iwords_0)";
293
    case 4:
294
      return "(iwords_1)";
295
    case 8:
296
      return "(iwords_2)";
297
    case 12:
298
      return "(iwords_3)";
299
    default:
300
      return "****";
301
    }
302
}
303
 
304
static
305
char *
306
insn_32 (n)
307
     int n;
308
{
309
  switch (n)
310
    {
311
    case 0:
312
      return "((iwords_0<<16) | (iwords_1))";
313
    case 4:
314
      return "((iwords_1<<16) | (iwords_2))";
315
    case 8:
316
      return "((iwords_2<<16) | (iwords_3))";
317
    default:
318
      return "****";
319
    }
320
}
321
 
322
static char *
323
size_name (x)
324
     int x;
325
{
326
  switch (x)
327
    {
328
    case 8:
329
      return "byte";
330
    case 16:
331
      return "word";
332
    case 32:
333
      return "long";
334
    case 64:
335
      return "quad";
336
    }
337
  return "!!";
338
}
339
 
340
/*VARARGS*/
341
void
342
emit (string, a1, a2, a3, a4, a5)
343
     char *string;
344
     char* a1;
345
     char* a2;
346
     char* a3;
347
     char* a4;
348
     char* a5;
349
{
350
  int indent_inc = 0;
351
  int indent_dec = 0;
352
  int i;
353
  char buffer[1000];
354
 
355
  d = buffer;
356
  p = string;
357
 
358
  while (*p)
359
    {
360
      if (match ("<fop>"))
361
        {
362
          if (BIG)
363
            {
364
              sub ("bfop");
365
            }
366
          else
367
            {
368
              sub ("sfop");
369
            }
370
        }
371
      else if (match ("<iptr>"))
372
        {
373
          if (BIG)
374
            {
375
              switch (nibs)
376
                {
377
                case 4:
378
                  sub ("(((iwords_1 << 8) | (iwords_2)) & 0x7fffff)");
379
                  break;
380
                default:
381
                  sub ("fail(context,124)");
382
                  break;
383
                }
384
            }
385
          else
386
            {
387
              switch (nibs)
388
                {
389
                case 4:
390
                  sub ("iwords_1");
391
                  break;
392
                default:
393
                  sub ("fail(context,123)");
394
                  break;
395
                }
396
            }
397
        }
398
      else if (match ("<name>"))
399
        {
400
          sub (current_name);
401
        }
402
      else if (match ("<size>"))
403
        {
404
          sub (current_size);
405
        }
406
      else if (match ("<insn_4>"))
407
        {
408
          sub (insn_4 (nibs));
409
        }
410
      else if (match ("<insn_16>"))
411
        {
412
          sub (insn_16 (nibs));
413
        }
414
      else if (match ("<insn_32>"))
415
        {
416
          sub (insn_32 (nibs));
417
        }
418
      else if (match ("iwords_0"))
419
        {
420
          sub (current_word0);
421
        }
422
      else if (match ("ibytes_0"))
423
        {
424
          sub (current_byte0);
425
        }
426
      else if (match ("<ibytes_1>"))
427
        {
428
          sub (current_byte1);
429
        }
430
      else if (match ("<next_size>"))
431
        {
432
          if (strcmp (current_size, "word") == 0)
433
            sub ("long");
434
          if (strcmp (current_size, "byte") == 0)
435
            sub ("word");
436
          else if (strcmp (current_size, "long") == 0)
437
            sub ("quad");
438
          else
439
            abort ();
440
        }
441
      else if (match ("<addr_type>"))
442
        {
443
          if (BIG)
444
            sub ("unsigned long");
445
          else
446
            sub ("unsigned short");
447
        }
448
 
449
      else if (match ("<c_size>"))
450
        {
451
          if (strcmp (current_size, "word") == 0)
452
            sub ("short");
453
          else if (strcmp (current_size, "byte") == 0)
454
            sub ("char");
455
          else if (strcmp (current_size, "long") == 0)
456
            sub ("long");
457
          else
458
            abort ();
459
        }
460
 
461
      else if (match ("<pc>"))
462
        {
463
          sub ("pc");
464
        }
465
      else if (match ("<mem>"))
466
        {
467
          sub (mem ());
468
        }
469
      else if (match ("<sp>"))
470
        {
471
          sub (stack_ptr ());
472
        }
473
      else if (match ("<ptr_size>"))
474
        {
475
          sub (ptr_size ());
476
        }
477
      else if (match ("<ptr_mode>"))
478
        {
479
          sub (ptr_mode ());
480
        }
481
      else if (match ("<insn_8>"))
482
        {
483
          switch (nibs)
484
            {
485
            case 2:
486
              sub ("(iwords_0&0xff)");
487
              break;
488
            case 4:
489
              sub ("(iwords_1>>8)");
490
              break;
491
            case 6:
492
              sub ("(iwords_1&0xff)");
493
              break;
494
            case 8:
495
              sub ("(iwords_2>>8)");
496
              break;
497
            case 12:
498
              sub ("(/* WHO */iwords_3&0xff)");
499
              break;
500
            default:
501
              abort ();
502
            }
503
        }
504
      else
505
        {
506
          if (*p == '{')
507
            indent_inc++;
508
          if (*p == '}')
509
            indent_dec++;
510
          *d++ = *p;
511
          p++;
512
        }
513
    }
514
  *d++ = 0;
515
  indent -= indent_dec;
516
  for (i = 0; i < indent; i++)
517
    printf ("\t");
518
  indent += indent_inc;
519
  printf (buffer, a1, a2, a3, a4, a5);
520
 
521
}
522
 
523
/* fetch the lvalues of the operands */
524
void
525
info_args (p)
526
     opcode_entry_type *p;
527
{
528
  unsigned int *s;
529
 
530
  int done_one_imm8 = 0;
531
 
532
  /* int done_read = 4;*/
533
  s = p->byte_info;
534
  nibs = 0;
535
  while (*s)
536
    {
537
      switch (*s & CLASS_MASK)
538
        {
539
        case CLASS_BIT_1OR2:
540
          emit ("register unsigned int imm_src=(<insn_4>& 2)?2:1;\n");
541
          break;
542
        case CLASS_BIT:
543
          /* Just ignore these, we've already decoded this bit */
544
          nibs++;
545
          break;
546
        case CLASS_REGN0:
547
        case CLASS_REG:
548
          /* this nibble tells us which register to use as an arg,
549
             if we've already gobbled the nibble we know what to use */
550
          {
551
            int regname = *s & 0xf;
552
 
553
            emit ("register unsigned int reg_%s=<insn_4>;\n",
554
                  reg_names[regname]);
555
 
556
            nibs++;
557
          }
558
          break;
559
        case CLASS_ADDRESS:
560
          emit ("register unsigned base_%s=<iptr>;\n", reg_n (*s));
561
 
562
          nibs += SIZE_ADDRESS;
563
 
564
          break;
565
        case CLASS_01II:
566
        case CLASS_00II:
567
          emit ("register unsigned int imm_src=<insn_4>&0x2;\n");
568
          nibs++;
569
          break;
570
        case CLASS_FLAGS:
571
                emit ("register unsigned int imm_src=<insn_4>;\n");
572
                nibs++;
573
break;
574
        case CLASS_IMM:
575
          /* Work out the size of the think to fetch */
576
 
577
          {
578
            switch (*s & ~CLASS_MASK)
579
              {
580
              case ARG_IMM16:
581
                emit ("register unsigned imm_src=<insn_16>;\n");
582
                nibs += 4;
583
                break;
584
              case ARG_IMM32:
585
                emit ("register unsigned int imm_src= %s;\n", insn_32 (nibs));
586
                nibs += 8;
587
                break;
588
              case ARG_IMM4:
589
                emit ("register unsigned int imm_src=<insn_4>;\n");
590
                nibs++;
591
                break;
592
              case ARG_IMM2:
593
                emit ("register unsigned int imm_src=<insn_4> & 0x2;\n");
594
                nibs++;
595
                break;
596
 
597
              case ARG_IMM4M1:
598
                emit ("register unsigned int imm_src=(<insn_4> + 1);\n");
599
                nibs++;
600
                break;
601
              case ARG_IMM_1:
602
                emit ("register unsigned int imm_src=1;\n");
603
                break;
604
              case ARG_IMM_2:
605
                emit ("register unsigned int imm_src=2;\n");
606
                break;
607
              case ARG_NIM8:
608
                emit ("register unsigned int imm_src=-<insn_8>;\n");
609
                nibs += 2;
610
                break;
611
              case ARG_IMM8:
612
                if (!done_one_imm8)
613
                  {
614
                    emit ("register unsigned int imm_src=<insn_8>;\n");
615
                    nibs += 2;
616
                    done_one_imm8 = 1;
617
                  }
618
                break;
619
              default:
620
                emit ("register int fail%d=fail(context,1);\n", nibs);
621
                break;
622
              }
623
            break;
624
 
625
        case CLASS_DISP8:
626
            /* We can't use `(char)' since char might be unsigned.
627
               We can't use `(signed char)' because the compiler might be K&R.
628
               This seems safe, since it only assumes that bytes are 8
629
               bits.  */
630
            emit ("register unsigned int oplval_dst=((ibytes_1 << (sizeof (int) * 8 - 8)) >> (sizeof (int) * 8 - 9)) + pc;\n");
631
#if 0
632
            /* Original code: fails if characters are unsigned.  */
633
            emit ("register unsigned int oplval_dst=(((char)ibytes_1)<<1) + pc;\n");
634
#endif
635
            nibs += 2;
636
            break;
637
        case CLASS_CC:
638
            emit ("register unsigned int op_cc=<insn_4>;\n");
639
            nibs++;
640
            break;
641
        default:
642
            emit ("register int FAIL%d=fail(context,2);\n", nibs);
643
            break;
644
          }
645
          ;
646
          /* work out how to fetch the immediate value */
647
        }
648
 
649
      s++;
650
    }
651
}
652
 
653
void
654
info_special (p, getdst, nostore, before, nosrc)
655
     opcode_entry_type *p;
656
     int *getdst;
657
     int *nostore;
658
     int *before;
659
     int *nosrc;
660
{
661
  switch (p->opcode)
662
    {
663
    case OPC_exts:
664
    case OPC_extsb:
665
    case OPC_extsl:
666
      *nostore = 1;
667
      *nosrc = 1;
668
      break;
669
    case OPC_ldm:
670
      *nostore = 1;
671
      *nosrc = 1;
672
      break;
673
    case OPC_negb:
674
    case OPC_neg:
675
    case OPC_sla:
676
    case OPC_slab:
677
    case OPC_slal:
678
    case OPC_sda:
679
    case OPC_sdab:
680
    case OPC_sdal:
681
    case OPC_com:
682
    case OPC_comb:
683
    case OPC_adc:
684
    case OPC_sbc:
685
    case OPC_nop:
686
    case OPC_adcb:
687
    case OPC_add:
688
    case OPC_addb:
689
    case OPC_addl:
690
    case OPC_inc:
691
    case OPC_sub:
692
    case OPC_subb:
693
    case OPC_subl:
694
    case OPC_and:
695
    case OPC_andb:
696
    case OPC_xorb:
697
    case OPC_xor:
698
      break;
699
 
700
    case OPC_mult:
701
    case OPC_multl:
702
    case OPC_div:
703
    case OPC_divl:
704
 
705
      *nostore = 1;
706
      break;
707
 
708
    case OPC_testb:
709
    case OPC_test:
710
    case OPC_testl:
711
    case OPC_cp:
712
    case OPC_cpb:
713
    case OPC_cpl:
714
    case OPC_bit:
715
      *nostore = 1;
716
      *before = 0;
717
      break;
718
 
719
    case OPC_bpt:
720
    case OPC_jr:
721
    case OPC_jp:
722
    case OPC_ret:
723
    case OPC_call:
724
    case OPC_tcc:
725
      *nosrc = 1;
726
      *nostore = 1;
727
      *before = 1;
728
      break;
729
    case OPC_sc:
730
      *nostore = 1;
731
      *before = 0;
732
      break;
733
    case OPC_clrb:
734
    case OPC_clr:
735
      *before = 1;
736
      *nosrc = 1;
737
      break;
738
    case OPC_ldi:
739
    case OPC_ldib:
740
    case OPC_lddb:
741
    case OPC_ldd:
742
 
743
      *before = 1;
744
      *nostore = 1;
745
      *nosrc = 1;
746
      break;
747
    case OPC_ldk:
748
    case OPC_ld:
749
    case OPC_ldb:
750
    case OPC_ldl:
751
      *before = 1;
752
      *getdst = 0;
753
      break;
754
    case OPC_push:
755
    case OPC_pushl:
756
    case OPC_pop:
757
    case OPC_popl:
758
      *before = 1;
759
      *getdst = 0;
760
      break;
761
    case OPC_lda:
762
      *nosrc = 1;
763
      break;
764
    }
765
}
766
 
767
/* calculate the lvalues required for the opcode */
768
void
769
info_lvals (p)
770
     opcode_entry_type *p;
771
{
772
  /* emit code to work out lvalues, if any */
773
  unsigned int *i = p->arg_info;
774
 
775
  while (*i)
776
    {
777
      current_name = reg_n (*i);
778
      current_size = size_name (p->type);
779
      switch (*i & CLASS_MASK)
780
        {
781
        case CLASS_X:
782
          /* address(reg) */
783
          emit ("register  <addr_type> oplval_<name>= ((base_<name> + (short)get_word_reg(context,reg_<name>)) & 0xffff) + (base_<name> & ~0xffff);\n");
784
          break;
785
        case CLASS_IR:
786
          /* Indirect register */
787
          emit ("register  int oplval_<name> = get_<ptr_mode>_reg(context,reg_<name>);\n");
788
          break;
789
        case CLASS_DA:
790
          emit ("register  int oplval_<name>=base_<name>;\n");
791
          break;
792
        case CLASS_IMM:
793
        case CLASS_REG_WORD:
794
        case CLASS_REG_LONG:
795
        case CLASS_REG_BYTE:
796
        case CLASS_PR:
797
          break;
798
        case CLASS_BA:
799
          emit ("register  int oplval_<name> = get_<ptr_mode>_reg(context,reg_<name>) + (short)(imm_src);\n");
800
          break;
801
        case CLASS_BX:
802
          emit ("register  int oplval_<name> = get_<ptr_mode>_reg(context,reg_<name>)\n");
803
          emit ("  + get_word_reg(context,reg_aux_x);\n");
804
          break;
805
        }
806
      i++;
807
    }
808
}
809
 
810
/* emit code to fetch the args from calculated lvalues */
811
int allregs;
812
void
813
info_fetch (p, getdst)
814
     opcode_entry_type *p;
815
     int getdst;
816
{
817
  unsigned int *i = p->arg_info;
818
  int had_src = 0;
819
 
820
  allregs = 1;
821
  while (*i)
822
    {
823
 
824
      current_name = reg_n (*i);
825
      current_size = size_name (p->type);
826
      switch (*i & CLASS_MASK)
827
        {
828
        case CLASS_X:
829
        case CLASS_IR:
830
        case CLASS_BA:
831
        case CLASS_BX:
832
        case CLASS_DA:
833
          if (!getdst && IS_DST (*i))
834
            break;
835
          emit ("register int op_<name>= get_<size>_<mem>_da(context,oplval_<name>);\n");
836
          allregs = 0;
837
          break;
838
        case CLASS_IMM:
839
          if (!had_src)
840
            {
841
              if (p->opcode == OPC_out ||
842
                  p->opcode == OPC_outb ||
843
                  p->opcode == OPC_sout ||
844
                  p->opcode == OPC_soutb)
845
                {
846
                  /* The imm is a dest here */
847
                  emit ("register int op_dst = imm_src;\n");
848
                }
849
              else
850
                {
851
                  emit ("register int op_src = imm_src;\n");
852
                }
853
            }
854
          break;
855
        case CLASS_REG_QUAD:
856
          if (!getdst && IS_DST (*i))
857
            break;
858
          had_src |= IS_SRC (*i);
859
          emit ("UDItype op_<name> ;\n");
860
 
861
          break;
862
        case CLASS_REG_WORD:
863
          if (!getdst && IS_DST (*i))
864
            break;
865
          had_src |= IS_SRC (*i);
866
          emit ("register int op_<name> = get_word_reg(context,reg_<name>);\n");
867
          break;
868
 
869
        case CLASS_REG_LONG:
870
          if (!getdst && IS_DST (*i))
871
            break;
872
          had_src |= IS_SRC (*i);
873
          emit ("register int op_<name> = get_long_reg(context,reg_<name>);\n");
874
          break;
875
        case CLASS_REG_BYTE:
876
          if (!getdst && IS_DST (*i))
877
            break;
878
          had_src |= IS_SRC (*i);
879
          emit ("register int op_<name> = get_byte_reg(context,reg_<name>);\n");
880
          break;
881
        }
882
      i++;
883
    }
884
}
885
 
886
static void
887
normal_flags (p, s, neg)
888
     opcode_entry_type *p;
889
     char *s;
890
{
891
  emit (" %s;\n", s);
892
  emit ("NORMAL_FLAGS(context,%d, tmp,  op_dst, op_src,%d); \n", p->type,neg);
893
}
894
 
895
static void
896
test_normal_flags (p, s, opt)
897
     opcode_entry_type *p;
898
     char *s;
899
     int opt;
900
{
901
  emit (" %s;\n", s);
902
  if (0 && opt)
903
    {
904
      emit ("context->broken_flags = TST_FLAGS;\n");
905
      emit ("context->size = %d;\n", p->type);
906
    }
907
  else
908
    {
909
      emit ("TEST_NORMAL_FLAGS(context,%d, tmp); \n", p->type);
910
    }
911
 
912
}
913
 
914
static void
915
optimize_normal_flags (p, s,neg)
916
     opcode_entry_type *p;
917
     char *s;
918
{
919
  emit (" %s;\n", s);
920
#if 0
921
  emit ("context->broken_flags = CMP_FLAGS;\n");
922
#else
923
  emit ("NORMAL_FLAGS(context,%d, tmp,  op_dst, op_src,%d); \n", p->type, neg);
924
#endif
925
}
926
 
927
static
928
void
929
jp (p)
930
     opcode_entry_type *p;
931
{
932
 
933
  emit ("if(op_cc == 8 || COND(context,op_cc)) pc = oplval_dst;\n");
934
}
935
 
936
static void
937
jr (p)
938
     opcode_entry_type *p;
939
{
940
  emit ("if(op_cc == 8 || COND(context,op_cc)) pc = oplval_dst;\n");
941
}
942
 
943
static void
944
ret (p)
945
     opcode_entry_type *p;
946
{
947
  emit ("if(op_cc == 8 || COND(context,op_cc))\n{\n");
948
  emit ("pc = get_<ptr_mode>_<mem>_ir(context,<sp>);\n");
949
  emit ("put_<ptr_mode>_reg(context,<sp>, get_<ptr_mode>_reg(context,<sp>) + <ptr_size>);\n");
950
  emit ("};\n");
951
}
952
 
953
static void
954
call (p)
955
     opcode_entry_type *p;
956
{
957
  emit ("put_<ptr_mode>_reg(context,<sp>,tmp =  get_<ptr_mode>_reg(context,<sp>) - <ptr_size>);\n");
958
  emit ("put_<ptr_mode>_<mem>_da(context,tmp, pc);\n");
959
  emit ("pc = oplval_dst;\n");
960
}
961
 
962
static void
963
push (p)
964
     opcode_entry_type *p;
965
{
966
  emit ("tmp = op_src;\n");
967
  emit ("oplval_dst -= %d;\n", p->type / 8);
968
  emit ("put_<ptr_mode>_reg(context,reg_dst, oplval_dst);\n");
969
}
970
 
971
static void
972
pop (p)
973
     opcode_entry_type *p;
974
{
975
  emit ("tmp = op_src;\n");
976
  emit ("put_<ptr_mode>_reg(context,reg_src, oplval_src + %d);\n", p->type / 8);
977
}
978
 
979
static void
980
ld (p)
981
     opcode_entry_type *p;
982
{
983
  emit ("tmp = op_src;\n");
984
}
985
 
986
static void
987
sc ()
988
{
989
  emit ("support_call(context,imm_src);\n");
990
}
991
 
992
static void
993
bpt ()
994
{
995
  emit ("pc -=2; \n");
996
  emit ("context->exception = SIM_BREAKPOINT;\n");
997
}
998
 
999
static void
1000
ldi (p, size, inc)
1001
     opcode_entry_type *p;
1002
     int size;
1003
     int inc;
1004
{
1005
  int dinc = (size / 8) * inc;
1006
 
1007
  current_size = size_name (size);
1008
  emit ("{ \n");
1009
  emit ("int type = %s;\n", insn_4 (7));
1010
  emit ("int rs = get_<ptr_mode>_reg(context,reg_src);\n");
1011
  emit ("int rd = get_<ptr_mode>_reg(context,reg_dst);\n");
1012
  emit ("int rr = get_word_reg(context,reg_aux_r);\n");
1013
  emit ("do {\n");
1014
  emit ("put_<size>_<mem>_da(context,rd, get_<size>_<mem>_da(context,rs));\n");
1015
  emit ("rd += %d;\n", dinc);
1016
  emit ("rs += %d;\n", dinc);
1017
  emit ("rr --;\n");
1018
  emit ("context->cycles += 9;\n");
1019
  emit ("} while (!type && rr != 0 && context->exception <= 1);\n");
1020
  emit ("if (context->exception>1) pc -=4;\n");
1021
  emit ("put_<ptr_mode>_reg(context,reg_src, rs);\n");
1022
  emit ("put_<ptr_mode>_reg(context,reg_dst, rd);\n");
1023
  emit ("put_word_reg(context,reg_aux_r, rr);\n");
1024
  emit ("}\n");
1025
 
1026
}
1027
 
1028
static void
1029
shift (p, arith)
1030
     opcode_entry_type *p;
1031
     int arith;
1032
{
1033
 
1034
  /* We can't use `(char)' since char might be unsigned.
1035
     We can't use `(signed char)' because the compiler might be K&R.
1036
     This seems safe, since it only assumes that bytes are 8 bits.  */
1037
  emit ("op_src = (op_src << (sizeof (int) * 8 - 8)) >> (sizeof (int) * 8 - 8);\n");
1038
#if 0
1039
  /* Original code: fails if characters are unsigned.  */
1040
  emit ("op_src = (char)op_src;\n");
1041
#endif
1042
  emit ("if (op_src < 0) \n");
1043
  emit ("{\n");
1044
  emit ("op_src = -op_src;\n");
1045
  emit ("op_dst = (%s <c_size>)op_dst;\n", arith ? "" : "unsigned");
1046
  emit ("tmp = (%s op_dst) >> op_src;\n", arith ? "" : "(unsigned)");
1047
  emit ("context->carry = op_dst >> (op_src-1);\n", p->type);
1048
  emit ("}\n");
1049
  emit ("else\n");
1050
  emit ("{\n");
1051
  emit ("tmp = op_dst << op_src;\n");
1052
  emit ("context->carry = op_dst >> (%d - op_src);\n", p->type);
1053
  emit ("}\n");
1054
  emit ("context->zero = (<c_size>)tmp == 0;\n");
1055
  emit ("context->sign = (int)((<c_size>)tmp) < 0;\n");
1056
  emit ("context->overflow = ((int)tmp < 0) != ((int)op_dst < 0);\n");
1057
  emit ("context->cycles += 3*op_src;\n");
1058
  emit ("context->broken_flags = 0;\n");
1059
 
1060
}
1061
 
1062
static void
1063
rotate (p, through_carry, size, left)
1064
     opcode_entry_type *p;
1065
     int through_carry;
1066
     int size;
1067
     int left;
1068
{
1069
 
1070
  if (!left)
1071
    {
1072
      emit ("while (op_src--) {\n");
1073
      emit ("int rotbit;\n");
1074
      emit ("rotbit = op_dst & 1;\n");
1075
      emit ("op_dst = ((unsigned)op_dst) >> 1;\n");
1076
 
1077
      if (through_carry)
1078
        {
1079
          emit ("op_dst |= context->carry << %d;\n", size - 1);
1080
        }
1081
      else
1082
        {
1083
          emit ("op_dst |= rotbit << %d;\n", size - 1);
1084
        }
1085
      emit ("context->carry = rotbit;\n");
1086
      emit ("}\n");
1087
    }
1088
  else
1089
    {
1090
      emit ("while (op_src--) {\n");
1091
      emit ("int rotbit;\n");
1092
 
1093
      emit ("rotbit = (op_dst >> (%d))&1;\n", size - 1);
1094
      emit ("op_dst <<=1;\n");
1095
      if (through_carry)
1096
        {
1097
          emit ("if (context->carry) op_dst |=1;\n");
1098
        }
1099
      else
1100
        {
1101
          emit ("if (rotbit) op_dst |= 1;\n");
1102
        }
1103
      emit ("context->carry = rotbit;\n");
1104
      emit ("}\n");
1105
    }
1106
  emit ("tmp = (<c_size>)op_dst;\n");
1107
  emit ("context->zero = tmp == 0;\n");
1108
  emit ("context->sign = (int)tmp < 0;\n");
1109
  emit ("context->overflow = ((int)tmp < 0) != ((int)op_dst < 0);\n");
1110
  emit ("context->cycles += 3*op_src;\n");
1111
  emit ("context->broken_flags = 0;\n");
1112
 
1113
}
1114
 
1115
static void
1116
adiv (p)
1117
     opcode_entry_type *p;
1118
{
1119
  emit ("if (op_src==0)\n");
1120
  emit ("{\n");
1121
  emit ("context->exception = SIM_DIV_ZERO;\n");
1122
  emit ("}\n");
1123
  emit ("else\n");
1124
  emit ("{\n");
1125
 
1126
  if (p->type == 32)
1127
    {
1128
      emit ("op_dst.low = (int)get_long_reg(context,reg_dst+2);\n");
1129
      emit ("op_dst.high = (int)get_long_reg(context,reg_dst+0);\n");
1130
#ifdef __GNUC__
1131
      emit ("tmp = (((long long)op_dst.high << 32) + (op_dst.low)) / (int)op_src;\n");
1132
#else
1133
      emit ("tmp = (long)op_dst.low / (int)op_src;\n");
1134
#endif
1135
      emit ("put_long_reg(context,reg_dst+2, tmp);\n");
1136
#ifdef __GNUC__
1137
      emit ("put_long_reg(context,reg_dst, (((long long)op_dst.high << 32) + (op_dst.low)) %% (int)op_src);\n");
1138
#else
1139
      emit ("put_long_reg(context,reg_dst, (int)op_dst.low %% (int)op_src);\n");
1140
#endif
1141
 
1142
      emit ("context->zero = op_src == 0 || (op_dst.low==0 && op_dst.high==0);\n");
1143
    }
1144
  else
1145
    {
1146
      emit ("tmp = (long)op_dst / (short)op_src;\n");
1147
      emit ("put_word_reg(context,reg_dst+1, tmp);\n");
1148
      emit ("put_word_reg(context,reg_dst, (long) op_dst %% (short)op_src);\n");
1149
      emit ("context->zero = op_src == 0 || op_dst==0;\n");
1150
    }
1151
 
1152
  emit ("context->sign = (int)tmp < 0;\n");
1153
  emit ("context->overflow =(tmp & 0x%x) != 0;\n",
1154
        ~((1 << (p->type)) - 1));
1155
  emit ("context->carry = (tmp & 0x%x) != 0;\n",
1156
        ~(1 << (p->type)));
1157
 
1158
  emit ("}\n");
1159
}
1160
 
1161
static void
1162
dobit (p)
1163
opcode_entry_type *p;
1164
{
1165
  emit("context->zero = (op_dst & (1<<op_src))==0;\n");
1166
  emit("context->broken_flags = 0;\n");
1167
}
1168
static void
1169
doset (p, v)
1170
opcode_entry_type*p;
1171
int v;
1172
{
1173
  if (v)
1174
    emit (" tmp = op_dst | (1<< op_src);\n");
1175
  else
1176
    emit (" tmp = op_dst & ~(1<< op_src);\n");
1177
}
1178
 
1179
static void
1180
mult (p)
1181
     opcode_entry_type *p;
1182
{
1183
 
1184
  if (p->type == 32)
1185
    {
1186
      emit ("op_dst.low =  get_long_reg(context,reg_dst+2);\n");
1187
      emit ("tmp = op_dst.low * op_src;\n");
1188
      emit ("put_long_reg(context,reg_dst+2, tmp);\n");
1189
      emit ("put_long_reg(context,reg_dst, 0);\n");
1190
    }
1191
  else
1192
    {
1193
      emit ("op_dst =  get_word_reg(context,reg_dst+1);\n");
1194
      emit ("tmp = op_dst * op_src;\n");
1195
      emit ("put_long_reg(context,reg_dst, tmp);\n");
1196
    }
1197
 
1198
  emit ("context->sign = (int)tmp < 0;\n");
1199
  emit ("context->overflow =0;\n");
1200
  emit ("context->carry = (tmp & 0x%x) != 0;\n", ~((1 << (p->type)) - 1));
1201
  emit ("context->zero = tmp == 0;\n");
1202
 
1203
}
1204
 
1205
static void
1206
exts (p)
1207
     opcode_entry_type *p;
1208
{
1209
  /* Fetch the ls part of the src */
1210
  current_size = size_name (p->type * 2);
1211
 
1212
  if (p->type == 32)
1213
    {
1214
      emit ("tmp= get_long_reg(context,reg_dst+2);\n");
1215
      emit ("if (tmp & (1<<%d)) {\n", p->type - 1);
1216
      emit ("put_long_reg(context,reg_dst, 0xffffffff);\n");
1217
      emit ("}\n");
1218
      emit ("else\n");
1219
      emit ("{\n");
1220
      emit ("put_long_reg(context,reg_dst, 0);\n");
1221
      emit ("}\n");
1222
    }
1223
  else
1224
    {
1225
      emit ("tmp= get_<size>_reg(context,reg_dst);\n");
1226
      emit ("if (tmp & (1<<%d)) {\n", p->type - 1);
1227
      emit ("tmp |= 0x%x;\n", ~((1 << p->type) - 1));
1228
      emit ("}\n");
1229
      emit ("else\n");
1230
      emit ("{\n");
1231
 
1232
      emit ("tmp &= 0x%x;\n", ((1 << p->type) - 1));
1233
      emit ("}\n");
1234
      emit ("put_<size>_reg(context,reg_dst, tmp);\n");
1235
    }
1236
}
1237
doflag(on)
1238
int on;
1239
{
1240
  /* Load up the flags */
1241
  emit(" COND (context, 0x0b);\n");
1242
 
1243
  if (on)
1244
    emit ("{ int on =1;\n ");
1245
  else
1246
    emit ("{ int on =0;\n ");
1247
 
1248
  emit ("if (imm_src & 1)\n");
1249
  emit ("PSW_OVERFLOW = on;\n");
1250
 
1251
  emit ("if (imm_src & 2)\n");
1252
  emit ("PSW_SIGN = on;\n");
1253
 
1254
  emit ("if (imm_src & 4)\n");
1255
  emit ("PSW_ZERO = on;\n");
1256
 
1257
  emit ("if (imm_src & 8)\n");
1258
  emit ("PSW_CARRY = on;\n");
1259
  emit("}\n");
1260
 
1261
 
1262
}
1263
/* emit code to perform operation */
1264
void
1265
info_docode (p)
1266
     opcode_entry_type *p;
1267
{
1268
  switch (p->opcode)
1269
    {
1270
    case OPC_clr:
1271
    case OPC_clrb:
1272
      emit ("tmp = 0;\n");
1273
      break;
1274
    case OPC_ex:
1275
    case OPC_exb:
1276
 
1277
      emit ("tmp = op_src; \n");
1278
      if (allregs)
1279
        {
1280
          emit ("put_<size>_reg(context,reg_src, op_dst);\n");
1281
        }
1282
      else
1283
        {
1284
          emit ("put_<size>_mem_da(context, oplval_src, op_dst);\n");
1285
        }
1286
      break;
1287
    case OPC_adc:
1288
    case OPC_adcb:
1289
      normal_flags (p, "op_src += COND(context,7);tmp = op_dst + op_src ;",0);
1290
      break;
1291
    case OPC_sbc:
1292
      normal_flags (p, "op_src +=  COND(context,7);tmp = op_dst - op_src ;",1);
1293
      break;
1294
    case OPC_nop:
1295
      break;
1296
    case OPC_com:
1297
    case OPC_comb:
1298
      test_normal_flags (p, "tmp = ~ op_dst", 1);
1299
      break;
1300
    case OPC_and:
1301
    case OPC_andb:
1302
      test_normal_flags (p, "tmp = op_dst & op_src", 1);
1303
      break;
1304
    case OPC_xor:
1305
    case OPC_xorb:
1306
      test_normal_flags (p, "tmp = op_dst ^ op_src", 1);
1307
      break;
1308
    case OPC_or:
1309
    case OPC_orb:
1310
      test_normal_flags (p, "tmp = op_dst | op_src", 1);
1311
      break;
1312
    case OPC_sla:
1313
    case OPC_slab:
1314
    case OPC_slal:
1315
    case OPC_sda:
1316
    case OPC_sdab:
1317
    case OPC_sdal:
1318
      shift (p, 1);
1319
      break;
1320
 
1321
    case OPC_sll:
1322
    case OPC_sllb:
1323
    case OPC_slll:
1324
    case OPC_sdl:
1325
    case OPC_sdlb:
1326
    case OPC_sdll:
1327
      shift (p, 0);
1328
      break;
1329
    case OPC_rl:
1330
      rotate (p, 0, 16, 1);
1331
      break;
1332
    case OPC_rlb:
1333
      rotate (p, 0, 8, 1);
1334
      break;
1335
    case OPC_rr:
1336
      rotate (p, 0, 16, 0);
1337
      break;
1338
    case OPC_rrb:
1339
      rotate (p, 0, 8, 0);
1340
      break;
1341
    case OPC_rrc:
1342
      rotate (p, 1, 16, 0);
1343
      break;
1344
    case OPC_rrcb:
1345
      rotate (p, 1, 8, 0);
1346
      break;
1347
    case OPC_rlc:
1348
      rotate (p, 1, 16, 1);
1349
      break;
1350
    case OPC_rlcb:
1351
      rotate (p, 1, 8, 1);
1352
      break;
1353
 
1354
    case OPC_extsb:
1355
    case OPC_exts:
1356
    case OPC_extsl:
1357
      exts (p);
1358
      break;
1359
    case OPC_add:
1360
    case OPC_addb:
1361
    case OPC_addl:
1362
    case OPC_inc:
1363
    case OPC_incb:
1364
      optimize_normal_flags (p, "tmp = op_dst + op_src",0);
1365
      break;
1366
    case OPC_testb:
1367
    case OPC_test:
1368
    case OPC_testl:
1369
      test_normal_flags (p, "tmp = op_dst", 0);
1370
      break;
1371
    case OPC_cp:
1372
    case OPC_cpb:
1373
    case OPC_cpl:
1374
      normal_flags (p, "tmp = op_dst - op_src",1);
1375
      break;
1376
    case OPC_negb:
1377
    case OPC_neg:
1378
      emit ("{\n");
1379
      emit ("int op_src = -op_dst;\n");
1380
      emit ("op_dst = 0;\n");
1381
      optimize_normal_flags (p, "tmp = op_dst + op_src;\n",1);
1382
      emit ("}");
1383
      break;
1384
 
1385
    case OPC_sub:
1386
    case OPC_subb:
1387
    case OPC_subl:
1388
    case OPC_dec:
1389
    case OPC_decb:
1390
      optimize_normal_flags (p, "tmp = op_dst - op_src",1);
1391
      break;
1392
    case OPC_bpt:
1393
      bpt ();
1394
      break;
1395
    case OPC_jr:
1396
      jr (p);
1397
      break;
1398
    case OPC_sc:
1399
      sc ();
1400
      break;
1401
    case OPC_jp:
1402
      jp (p);
1403
      break;
1404
    case OPC_ret:
1405
      ret (p);
1406
      break;
1407
    case OPC_call:
1408
      call (p);
1409
      break;
1410
    case OPC_tcc:
1411
    case OPC_tccb:
1412
      emit ("if(op_cc == 8 || COND(context,op_cc)) put_word_reg(context,reg_dst, 1);\n");
1413
      break;
1414
    case OPC_lda:
1415
      emit ("tmp = oplval_src; \n");
1416
      /*(((oplval_src) & 0xff0000) << 8) | (oplval_src & 0xffff); \n");*/
1417
      break;
1418
    case OPC_ldk:
1419
    case OPC_ld:
1420
 
1421
    case OPC_ldb:
1422
    case OPC_ldl:
1423
      ld (p);
1424
      break;
1425
    case OPC_ldib:
1426
      ldi (p, 8, 1);
1427
      break;
1428
    case OPC_ldi:
1429
      ldi (p, 16, 1);
1430
      break;
1431
 
1432
    case OPC_lddb:
1433
      ldi (p, 8, -1);
1434
      break;
1435
    case OPC_ldd:
1436
      ldi (p, 16, -1);
1437
      break;
1438
 
1439
    case OPC_push:
1440
    case OPC_pushl:
1441
      push (p);
1442
      break;
1443
 
1444
    case OPC_div:
1445
    case OPC_divl:
1446
      adiv (p);
1447
      break;
1448
    case OPC_mult:
1449
    case OPC_multl:
1450
      mult (p);
1451
      break;
1452
    case OPC_pop:
1453
    case OPC_popl:
1454
      pop (p);
1455
      break;
1456
    case OPC_set:
1457
      doset (p,1);
1458
      break;
1459
    case OPC_res:
1460
      doset (p,0);
1461
      break;
1462
    case OPC_bit:
1463
      dobit(p);
1464
      break;
1465
    case OPC_resflg:
1466
      doflag(0);
1467
      break;
1468
    case OPC_setflg:
1469
      doflag(1);
1470
      break;
1471
    default:
1472
 
1473
      emit ("tmp = fail(context,%d);\n", p->opcode);
1474
      break;
1475
    }
1476
}
1477
 
1478
/* emit code to store result in calculated lvalue */
1479
 
1480
void
1481
info_store (p)
1482
     opcode_entry_type *p;
1483
{
1484
  unsigned int *i = p->arg_info;
1485
 
1486
  while (*i)
1487
    {
1488
      current_name = reg_n (*i);
1489
      current_size = size_name (p->type);
1490
 
1491
      if (IS_DST (*i))
1492
        {
1493
          switch (*i & CLASS_MASK)
1494
            {
1495
            case CLASS_PR:
1496
              emit ("put_<ptr_mode>_reg(context,reg_<name>, tmp);\n");
1497
              break;
1498
            case CLASS_REG_LONG:
1499
            case CLASS_REG_WORD:
1500
            case CLASS_REG_BYTE:
1501
 
1502
              emit ("put_<size>_reg(context,reg_<name>,tmp);\n");
1503
              break;
1504
            case CLASS_X:
1505
            case CLASS_IR:
1506
            case CLASS_DA:
1507
            case CLASS_BX:
1508
            case CLASS_BA:
1509
 
1510
              emit ("put_<size>_<mem>_da(context,oplval_<name>, tmp);\n");
1511
              break;
1512
            case CLASS_IMM:
1513
              break;
1514
            default:
1515
              emit ("abort(); ");
1516
              break;
1517
            }
1518
 
1519
        }
1520
      i++;
1521
    }
1522
}
1523
 
1524
static
1525
void
1526
mangle (p, shortcut, value)
1527
     opcode_entry_type *p;
1528
     int shortcut;
1529
     int value;
1530
{
1531
  int nostore = 0;
1532
  int extra;
1533
  int getdst = 1;
1534
  int before = 0;
1535
  int nosrc = 0;
1536
 
1537
  emit ("/\052 %s \052/\n", p->nicename);
1538
  if (shortcut)
1539
    {
1540
      emit ("int <fop>_%04x(context,pc)\n", value);
1541
    }
1542
  else
1543
    {
1544
      emit ("int <fop>_%d(context,pc,iwords0)\n", p->idx);
1545
      emit ("int iwords0;\n");
1546
    }
1547
  emit ("sim_state_type *context;\n");
1548
  emit ("int pc;\n");
1549
  emit ("{\n");
1550
  emit ("register unsigned int tmp;\n");
1551
  if (shortcut)
1552
    {
1553
      emit ("register unsigned int iwords0 = 0x%x;\n", value);
1554
    }
1555
 
1556
  /* work out how much bigger this opcode could be because it's large
1557
     model */
1558
  if (BIG)
1559
    {
1560
      int i;
1561
 
1562
      extra = 0;
1563
      for (i = 0; i < 4; i++)
1564
        {
1565
          if ((p->arg_info[i] & CLASS_MASK) == CLASS_DA
1566
              || (p->arg_info[i] & CLASS_MASK) == CLASS_X)
1567
            extra += 2;
1568
        }
1569
    }
1570
  else
1571
    {
1572
      extra = 0;
1573
    }
1574
  printf ("                     /* Length %d */ \n", p->length + extra);
1575
  switch (p->length + extra)
1576
    {
1577
    case 2:
1578
      emit ("pc += 2\n;");
1579
      break;
1580
    case 4:
1581
      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");
1582
      emit ("pc += 4;\n");
1583
      break;
1584
    case 6:
1585
 
1586
      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");
1587
      emit ("register unsigned int iwords2 = get_word_mem_da(context,pc+4);\n");
1588
      emit ("pc += 6;\n");
1589
      break;
1590
    case 8:
1591
      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");
1592
      emit ("register unsigned int iwords2 = get_word_mem_da(context,pc+4);\n");
1593
      emit ("register unsigned int iwords3 = get_word_mem_da(context,pc+6);\n");
1594
      emit ("pc += 8;\n");
1595
      break;
1596
    default:
1597
      break;
1598
 
1599
    }
1600
  emit ("context->cycles += %d;\n", p->cycles);
1601
 
1602
  emit ("{\n");
1603
  info_args (p);
1604
  info_special (p, &getdst, &nostore, &before, &nosrc);
1605
 
1606
  info_lvals (p);
1607
  if (!nosrc)
1608
    {
1609
      info_fetch (p, getdst);
1610
    }
1611
 
1612
  if (before)
1613
    {
1614
      info_docode (p);
1615
    }
1616
  else
1617
    {
1618
      info_docode (p);
1619
    }
1620
  if (!nostore)
1621
    info_store (p);
1622
  emit ("}\n");
1623
  emit ("return pc;\n");
1624
  emit ("}\n");
1625
}
1626
 
1627
void
1628
static
1629
one_instruction (i)
1630
     int i;
1631
{
1632
  /* find the table entry */
1633
  opcode_entry_type *p = z8k_table + i;
1634
 
1635
  if (!p)
1636
    return;
1637
  mangle (p, 0, 0);
1638
}
1639
 
1640
void
1641
add_to_list (ptr, value)
1642
     struct opcode_value **ptr;
1643
     int value;
1644
{
1645
  struct opcode_value *prev;
1646
 
1647
  prev = *ptr;
1648
  *ptr = (struct opcode_value *) malloc (sizeof (struct opcode_value));
1649
 
1650
  (*ptr)->n = value;
1651
  (*ptr)->next = prev;
1652
}
1653
 
1654
void
1655
build_list (i)
1656
     int i;
1657
{
1658
  opcode_entry_type *p = lookup_inst (i);
1659
 
1660
  if (!p)
1661
    return;
1662
  add_to_list (&list[p->idx], i);
1663
}
1664
 
1665
int
1666
main (ac, av)
1667
     int ac;
1668
     char **av;
1669
{
1670
  int i;
1671
  int needcomma = 0;
1672
 
1673
  makelist = 0;
1674
 
1675
  for (i = 1; i < ac; i++)
1676
    {
1677
      if (strcmp (av[i], "-m") == 0)
1678
        makelist = 1;
1679
      if (strcmp (av[i], "-1") == 0)
1680
        file = 1;
1681
      if (strcmp (av[i], "-2") == 0)
1682
        file = 2;
1683
      if (strcmp (av[i], "-3") == 0)
1684
        file = 3;
1685
      if (strcmp (av[i], "-b3") == 0)
1686
        {
1687
          file = 3;
1688
          BIG = 1;
1689
        }
1690
 
1691
    }
1692
  if (makelist)
1693
    {
1694
 
1695
      int i;
1696
      needcomma = 0;
1697
      printf ("short int z8k_inv_list[] = {\n");
1698
 
1699
      for (i = 0; i < 1 << 16; i++)
1700
        {
1701
          opcode_entry_type *p = lookup_inst (i);
1702
 
1703
          if(needcomma)
1704
            printf(",");
1705
          if ((i & 0xf) == 0)
1706
            printf ("\n");
1707
 
1708
#if 0
1709
          printf ("\n           /*%04x %s */", i, p ? p->nicename : "");
1710
#endif
1711
 
1712
          if (!p)
1713
            {
1714
              printf ("-1");
1715
            }
1716
          else
1717
            {
1718
              printf ("%d", p->idx);
1719
            }
1720
 
1721
          if ((i & 0x3f) == 0 && DIRTY_HACK)
1722
            {
1723
              printf ("\n#ifdef __GNUC__\n");
1724
              printf ("};\n");
1725
              printf("short int int_list%d[] = {\n", i);
1726
              printf ("#else\n");
1727
              printf (",\n");
1728
              printf ("#endif\n");
1729
              needcomma = 0;
1730
            }
1731
          else
1732
            needcomma = 1;
1733
 
1734
        }
1735
      printf ("};\n");
1736
      return 1;
1737
    }
1738
 
1739
  /* First work out which opcodes use which bit patterns,
1740
     build a list of all matching bit pattens */
1741
  for (i = 0; i < 1 << 16; i++)
1742
    {
1743
      build_list (i);
1744
    }
1745
#if DUMP_LIST
1746
  for (i = 0; i < NOPS; i++)
1747
    {
1748
      struct opcode_value *p;
1749
 
1750
      printf ("%d,", i);
1751
      p = list[i];
1752
      while (p)
1753
        {
1754
          printf (" %04x,", p->n);
1755
          p = p->next;
1756
        }
1757
      printf ("-1\n");
1758
    }
1759
 
1760
#endif
1761
 
1762
  if (file == 1)
1763
    {
1764
      extern int quick[];
1765
 
1766
      /* Do the shortcuts */
1767
      printf ("                 /* SHORTCUTS */\n");
1768
      for (i = 0; quick[i]; i++)
1769
        {
1770
          int t = quick[i];
1771
 
1772
          mangle (z8k_table + z8k_inv_list[t],
1773
                  1,
1774
                  t);
1775
        }
1776
    }
1777
  if (file == 3)
1778
    {
1779
      printf ("                 /* NOT -SHORTCUTS */\n");
1780
      for (i = 0; i < NOPS; i++)
1781
        {
1782
          if (list[i])
1783
            {
1784
              one_instruction (i);
1785
            }
1786
          else
1787
            {
1788
              emit ("int <fop>_%d(context,pc)\n", i);
1789
              printf ("sim_state_type *context;\n");
1790
              printf ("int pc;\n");
1791
              emit ("{ <fop>_bad1();return pc; }\n");
1792
            }
1793
        }
1794
      emit ("int <fop>_bad() ;\n");
1795
 
1796
      /* Write the jump table */
1797
      emit ("int (*(<fop>_table[]))() = {");
1798
      needcomma = 0;
1799
      for (i = 0; i < NOPS; i++)
1800
        {
1801
          if (needcomma)
1802
            printf (",");
1803
          emit ("<fop>_%d\n", i);
1804
          needcomma = 1;
1805
          if ((i & 0x3f) == 0 && DIRTY_HACK)
1806
            {
1807
              printf ("#ifdef __GNUC__\n");
1808
              printf ("};\n");
1809
              emit ("int (*(<fop>_table%d[]))() = {\n", i);
1810
              printf ("#else\n");
1811
              printf (",\n");
1812
              printf ("#endif\n");
1813
              needcomma = 0;
1814
            }
1815
        }
1816
      emit ("};\n");
1817
    }
1818
 
1819
  if (file == 2)
1820
    {
1821
      extern int quick[];
1822
      /* Static - since it's too be to be automatic on the apollo */
1823
      static int big[64 * 1024];
1824
 
1825
      for (i = 0; i < 64 * 1024; i++)
1826
        big[i] = 0;
1827
 
1828
      for (i = 0; quick[i]; i++)
1829
        {
1830
#if 0
1831
 
1832
          printf ("extern int <fop>_%04x();\n", quick[i]);
1833
#endif
1834
 
1835
          big[quick[i]] = 1;
1836
        }
1837
 
1838
      for (i = 0; i < NOPS; i++)
1839
        {
1840
#if 0
1841
          printf ("extern int fop_%d();\n", i);
1842
#endif
1843
        }
1844
#if 0
1845
      printf ("extern int fop_bad();\n");
1846
#endif
1847
      printf ("struct op_info op_info_table[] = {\n");
1848
      for (i = 0; i < 1 << 16; i++)
1849
        {
1850
          int inv = z8k_inv_list[i];
1851
          opcode_entry_type *p = z8k_table + inv;
1852
 
1853
          if (needcomma)
1854
            printf (",");
1855
#if 0
1856
          if (big[i])
1857
            {
1858
              printf ("<fop>_%04x", i);
1859
            }
1860
          else
1861
#endif
1862
          if (inv >= 0)
1863
            {
1864
              printf ("%d", inv);
1865
            }
1866
          else
1867
            printf ("400");
1868
          if (inv >= 0)
1869
            {
1870
              printf ("         /* %04x %s */\n", i, p->nicename);
1871
            }
1872
          else
1873
            {
1874
              printf ("\n");
1875
            }
1876
          needcomma = 1;
1877
          if ((i & 0x3f) == 0 && DIRTY_HACK)
1878
            {
1879
              printf ("#ifdef __GNUC__\n");
1880
              printf ("}; \n");
1881
              printf ("struct op_info op_info_table%d[] = {\n", i);
1882
              printf ("#else\n");
1883
              printf (",\n");
1884
 
1885
              printf ("#endif\n");
1886
              needcomma = 0;
1887
            }
1888
        }
1889
      printf ("};\n");
1890
 
1891
    }
1892
  return 0;
1893
}
1894
 
1895
char *
1896
insn_ptr (n)
1897
     int n;
1898
{
1899
  if (BIG)
1900
    {
1901
      abort ();
1902
    }
1903
 
1904
  switch (n)
1905
    {
1906
    case 4:
1907
      return "iwords_1";
1908
    default:
1909
      return "fail(context,123)";
1910
    }
1911
}
1912
 
1913
/* work out if the opcode only wants lvalues */
1914
int
1915
lvalue (p)
1916
     opcode_entry_type *p;
1917
{
1918
  switch (p->opcode)
1919
    {
1920
    case OPC_lda:
1921
      return 1;
1922
    case OPC_call:
1923
    case OPC_jp:
1924
      return 1;
1925
    default:
1926
      return 0;
1927
    }
1928
}
1929
 
1930
int
1931
info_len_in_words (o)
1932
     opcode_entry_type *o;
1933
{
1934
  unsigned  int *p = o->byte_info;
1935
  int nibs = 0;
1936
 
1937
  while (*p)
1938
    {
1939
      switch (*p & CLASS_MASK)
1940
        {
1941
        case CLASS_BIT:
1942
        case CLASS_REGN0:
1943
        case CLASS_REG:
1944
        case CLASS_01II:
1945
        case CLASS_00II:
1946
          nibs++;
1947
          break;
1948
        case CLASS_ADDRESS:
1949
          nibs += SIZE_ADDRESS;
1950
          break;
1951
        case CLASS_IMM:
1952
          switch (*p & ~CLASS_MASK)
1953
            {
1954
            case ARG_IMM16:
1955
              nibs += 4;
1956
              break;
1957
            case ARG_IMM32:
1958
              nibs += 8;
1959
              break;
1960
            case ARG_IMM2:
1961
            case ARG_IMM4:
1962
            case ARG_IMM4M1:
1963
            case ARG_IMM_1:
1964
            case ARG_IMM_2:
1965
            case ARG_IMMNMINUS1:
1966
              nibs++;
1967
              break;
1968
            case ARG_NIM8:
1969
 
1970
            case ARG_IMM8:
1971
              nibs += 2;
1972
              break;
1973
            default:
1974
              abort ();
1975
            }
1976
          break;
1977
        case CLASS_DISP:
1978
          switch (*p & ~CLASS_MASK)
1979
            {
1980
            case ARG_DISP16:
1981
              nibs += 4;
1982
              break;
1983
            case ARG_DISP12:
1984
              nibs += 3;
1985
              break;
1986
            case ARG_DISP8:
1987
              nibs += 2;
1988
              break;
1989
            default:
1990
              abort ();
1991
            }
1992
          break;
1993
        case CLASS_0DISP7:
1994
        case CLASS_1DISP7:
1995
        case CLASS_DISP8:
1996
          nibs += 2;
1997
          break;
1998
        case CLASS_BIT_1OR2:
1999
        case CLASS_0CCC:
2000
        case CLASS_1CCC:
2001
        case CLASS_CC:
2002
          nibs++;
2003
          break;
2004
        default:
2005
          emit ("don't know %x\n", *p);
2006
        }
2007
      p++;
2008
    }
2009
 
2010
  return nibs / 4;              /* return umber of words */
2011
}

powered by: WebSVN 2.1.0

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