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

Subversion Repositories or2k

[/] [or2k/] [trunk/] [analysis-bin/] [insnanalysis/] [or1k-32-insn.c] - Blame information for rev 18

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

Line No. Rev Author Line
1 17 julius
/*
2
  Or1K instruction set-specific decoding and analysis functions.
3
 
4
  Julius Baxter, julius.baxter@orsoc.se
5
 
6
*/
7
 
8
 
9 16 julius
#include "stdio.h"
10
#include "stdint.h"
11
#include "stdlib.h"
12
#include "string.h"
13
#include "or1k-32-insn.h"
14
 
15
// These should also be in insnanalysis.h insnanalysis.h
16
typedef uint32_t instruction;
17
typedef struct or1k_32_instruction_properties instruction_properties ;
18
 
19
#include "insn-lists.h"
20
 
21
 
22
int or1k_32_analyse_insn(uint32_t insn,
23
                         struct or1k_32_instruction_properties  * insn_props)
24
{
25
 
26
  switch(insn_or1k_opcode(insn))
27
    {
28
    case 0x00:
29
      insn_props->insn_string="l.j";
30 18 julius
      insn_props->insn_index=0;
31 16 julius
      insn_props->has_jumptarg = 1;
32
      break;
33
 
34
    case 0x01:
35
      insn_props->insn_string="l.jal";
36 18 julius
      insn_props->insn_index=1;
37 16 julius
      insn_props->has_jumptarg = 1;
38
      break;
39
 
40
     case 0x03:
41
      insn_props->insn_string="l.bnf";
42 18 julius
      insn_props->insn_index=2;
43 16 julius
      insn_props->has_branchtarg = 1;
44
      break;
45
 
46
    case 0x04:
47
      insn_props->insn_string="l.bf";
48 18 julius
      insn_props->insn_index=3;
49 16 julius
      insn_props->has_branchtarg = 1;
50
      break;
51
 
52
    case 0x05:
53
      insn_props->insn_string="l.nop";
54 18 julius
      insn_props->insn_index=4;
55 16 julius
      break;
56
 
57
    case 0x06:
58
      if((insn_or1k_opcode_0x06_get_id(insn)))
59 18 julius
        {
60
          insn_props->insn_string="l.macrc";
61
          insn_props->insn_index=5;
62
        }
63 16 julius
      else
64
        {
65
          insn_props->insn_string="l.movhi";
66 18 julius
          insn_props->insn_index=6;
67 16 julius
          insn_props->has_rD = 1;
68
          insn_props->has_imm = 1;
69
        }
70
 
71
      break;
72
 
73
    case 0x08:
74
 
75
      switch(insn_or1k_opcode_0x08_get_id(insn))
76
        {
77
        case 0x0:
78
          insn_props->insn_string="l.sys";
79 18 julius
          insn_props->insn_index=7;
80 16 julius
          break;
81
        case 0x2:
82
          insn_props->insn_string="l.trap";
83 18 julius
          insn_props->insn_index=8;
84 16 julius
          break;
85
        case 0x4:
86
          insn_props->insn_string="l.msync";
87 18 julius
          insn_props->insn_index=9;
88 16 julius
          break;
89
        case 0x5:
90
          insn_props->insn_string="l.psync";
91 18 julius
          insn_props->insn_index=10;
92 16 julius
          break;
93
        case 0x6:
94
          insn_props->insn_string="l.csync";
95 18 julius
          insn_props->insn_index=11;
96 16 julius
          break;
97
        default:
98
          printf("Unknown id (0x%x) in opcode 0x8",
99
                 insn_or1k_opcode_0x08_get_id(insn) );
100
          return 1;
101
          break;
102
        }
103
      break;
104
 
105
    case 0x09:
106
      insn_props->insn_string="l.rfe";
107 18 julius
      insn_props->insn_index=12;
108 16 julius
      break;
109
 
110
    case 0x0a:
111
      switch(insn_or1k_opcode_0x0a_get_op_hi(insn))
112
        {
113
        case 0x1:
114
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
115
            {
116
            case 0x0:
117
              break;
118
            case 0x1:
119
              break;
120
            case 0x2:
121
              break;
122
            case 0x3:
123
              break;
124
            case 0x4:
125
              break;
126
            case 0x5:
127
              break;
128
            case 0x6:
129
              break;
130
            case 0x7:
131
              break;
132
            case 0x8:
133
              break;
134
            case 0x9:
135
              break;
136
            case 0xa:
137
              break;
138
            case 0xb:
139
              break;
140
            default:
141
              printf("Unknown lv.all_xx insn");
142 17 julius
              return 1;
143 16 julius
            }
144
        case 0x2:
145
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
146
            {
147
            case 0x0:
148
              break;
149
            case 0x1:
150
              break;
151
            case 0x2:
152
              break;
153
            case 0x3:
154
              break;
155
            case 0x4:
156
              break;
157
            case 0x5:
158
              break;
159
            case 0x6:
160
              break;
161
            case 0x7:
162
              break;
163
            case 0x8:
164
              break;
165
            case 0x9:
166
              break;
167
            case 0xa:
168
              break;
169
            case 0xb:
170
              break;
171
            default:
172
              printf("Unknown lv.any_xx insn");
173 17 julius
              return 1;
174 16 julius
            }
175
          break;
176
        case 0x3:
177
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
178
            {
179
            case 0x0:
180
              break;
181
            case 0x1:
182
              break;
183
            case 0x2:
184
              break;
185
            case 0x3:
186
              break;
187
            case 0x4:
188
              break;
189
            case 0x5:
190
              break;
191
            case 0x6:
192
              break;
193
            case 0x7:
194
              break;
195
            case 0x8:
196
              break;
197
            case 0x9:
198
              break;
199
            case 0xa:
200
              break;
201
            default:
202
              printf("Unknown lv.add/and/avg_xx insn");
203 17 julius
              return 1;
204 16 julius
            }
205
          break;
206
        case 0x4:
207
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
208
            {
209
            case 0x0:
210
              break;
211
            case 0x1:
212
              break;
213
            case 0x2:
214
              break;
215
            case 0x3:
216
              break;
217
            case 0x4:
218
              break;
219
            case 0x5:
220
              break;
221
            case 0x6:
222
              break;
223
            case 0x7:
224
              break;
225
            case 0x8:
226
              break;
227
            case 0x9:
228
              break;
229
            case 0xa:
230
              break;
231
            case 0xb:
232
              break;
233
            default:
234
              printf("Unknown lv.cmp_xx insn");
235 17 julius
              return 1;
236 16 julius
            }
237
          break;
238
        case 0x5:
239
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
240
            {
241
            case 0x4:
242
              break;
243
            case 0x5:
244
              break;
245
            case 0x6:
246
              break;
247
            case 0x7:
248
              break;
249
            case 0x8:
250
              break;
251
            case 0x9:
252
              break;
253
            case 0xa:
254
              break;
255
            case 0xb:
256
              break;
257
            case 0xc:
258
              break;
259
            case 0xd:
260
              break;
261
            case 0xe:
262
              break;
263
            case 0xf:
264
              break;
265
            default:
266
              printf("Unknown lv.alu_xx insn");
267 17 julius
              return 1;
268 16 julius
            }
269
          break;
270
        case 0x6:
271
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
272
            {
273
            case 0x0:
274
              break;
275
            case 0x1:
276
              break;
277
            case 0x2:
278
              break;
279
            case 0x3:
280
              break;
281
            case 0x4:
282
              break;
283
            case 0x5:
284
              break;
285
            case 0x6:
286
              break;
287
            case 0x7:
288
              break;
289
            case 0x8:
290
              break;
291
            case 0x9:
292
              break;
293
            case 0xa:
294
              break;
295
            case 0xb:
296
              break;
297
            case 0xc:
298
              break;
299
            case 0xd:
300
              break;
301
            case 0xe:
302
              break;
303
            case 0xf:
304
              break;
305
            default:
306
              printf("Unknown lv.pack_xx insn");
307 17 julius
              return 1;
308 16 julius
            }
309
          break;
310
        case 0x7:
311
          switch(insn_or1k_opcode_0x0a_get_op_lo(insn))
312
            {
313
            case 0x0:
314
              break;
315
            case 0x1:
316
              break;
317
            case 0x2:
318
              break;
319
            case 0x3:
320
              break;
321
            case 0x4:
322
              break;
323
            case 0x5:
324
              break;
325
            case 0x6:
326
              break;
327
            case 0x7:
328
              break;
329
            case 0x8:
330
              break;
331
            case 0x9:
332
              break;
333
            case 0xa:
334
              break;
335
            case 0xb:
336
              break;
337
            default:
338
              printf("Unknown lv.sub/unpack/xor_xx insn");
339 17 julius
              return 1;
340 16 julius
            }
341
          break;
342
        case 0xc:
343
          break;
344
        case 0xd:
345
          break;
346
        case 0xe:
347
          break;
348
        case 0xf:
349
          break;
350
        default:
351
          printf("Unknown lv.xxx insn hi op");
352 17 julius
          return 1;
353 16 julius
          break;
354
        }
355
      break;
356
 
357
    case 0x11:
358
      insn_props->insn_string="l.jr";
359 18 julius
      insn_props->insn_index=13;
360 16 julius
      insn_props->has_rB = 1;
361
      break;
362
 
363
    case 0x12:
364
      insn_props->insn_string="l.jalr";
365 18 julius
      insn_props->insn_index=14;
366 16 julius
      insn_props->has_rB = 1;
367
      break;
368
 
369
    case 0x13:
370
      insn_props->insn_string="l.maci";
371 18 julius
      insn_props->insn_index=15;
372 16 julius
      break;
373
 
374
    case 0x1c:
375
      insn_props->insn_string="l.cust1";
376 18 julius
      insn_props->insn_index=16;
377 16 julius
      break;
378
 
379
    case 0x1d:
380
      insn_props->insn_string="l.cust2";
381 18 julius
      insn_props->insn_index=17;
382 16 julius
      break;
383
 
384
    case 0x1e:
385
      insn_props->insn_string="l.cust3";
386 18 julius
      insn_props->insn_index=18;
387 16 julius
      break;
388
 
389
    case 0x1f:
390
      insn_props->insn_string="l.cust4";
391 18 julius
      insn_props->insn_index=19;
392 16 julius
      break;
393
 
394
    case 0x20:
395
      insn_props->insn_string="l.ld";
396 18 julius
      insn_props->insn_index=20;
397 16 julius
      insn_props->has_rD = 1;
398
      insn_props->has_rA = 1;
399
      insn_props->has_imm = 1;
400
      break;
401
 
402
    case 0x21:
403
      insn_props->insn_string="l.lwz";
404 18 julius
      insn_props->insn_index=21;
405 16 julius
      insn_props->has_rD = 1;
406
      insn_props->has_rA = 1;
407
      insn_props->has_imm = 1;
408
      break;
409
 
410
    case 0x22:
411
      insn_props->insn_string="l.lws";
412 18 julius
      insn_props->insn_index=22;
413 16 julius
      insn_props->has_rD = 1;
414
      insn_props->has_rA = 1;
415
      insn_props->has_imm = 1;
416
      break;
417
 
418
    case 0x23:
419
      insn_props->insn_string="l.lbz";
420 18 julius
      insn_props->insn_index=23;
421 16 julius
      insn_props->has_rD = 1;
422
      insn_props->has_rA = 1;
423
      insn_props->has_imm = 1;
424
      break;
425
 
426
    case 0x24:
427
      insn_props->insn_string="l.lbs";
428 18 julius
      insn_props->insn_index=24;
429 16 julius
      insn_props->has_rD = 1;
430
      insn_props->has_rA = 1;
431
      insn_props->has_imm = 1;
432
      break;
433
 
434
    case 0x25:
435
      insn_props->insn_string="l.lhz";
436 18 julius
      insn_props->insn_index=25;
437 16 julius
      insn_props->has_rD = 1;
438
      insn_props->has_rA = 1;
439
      insn_props->has_imm = 1;
440
      break;
441
 
442
    case 0x26:
443
      insn_props->insn_string="l.lhs";
444 18 julius
      insn_props->insn_index=26;
445 16 julius
      insn_props->has_rD = 1;
446
      insn_props->has_rA = 1;
447
      insn_props->has_imm = 1;
448
      break;
449
 
450
 
451
    case 0x27:
452
      insn_props->insn_string="l.addi";
453 18 julius
      insn_props->insn_index=27;
454 16 julius
      insn_props->has_rD = 1;
455
      insn_props->has_rA = 1;
456
      insn_props->has_imm = 1;
457
      break;
458
 
459
    case 0x28:
460
      insn_props->insn_string="l.addic";
461 18 julius
      insn_props->insn_index=28;
462 16 julius
      insn_props->has_rD = 1;
463
      insn_props->has_rA = 1;
464
      insn_props->has_imm = 1;
465
      break;
466
 
467
    case 0x29:
468
      insn_props->insn_string="l.andi";
469 18 julius
      insn_props->insn_index=29;
470 16 julius
      insn_props->has_rD = 1;
471
      insn_props->has_rA = 1;
472
      insn_props->has_imm = 1;
473
      break;
474
 
475
    case 0x2a:
476
      insn_props->insn_string="l.ori";
477 18 julius
      insn_props->insn_index=30;
478 16 julius
      insn_props->has_rD = 1;
479
      insn_props->has_rA = 1;
480
      insn_props->has_imm = 1;
481
      break;
482
 
483
    case 0x2b:
484
      insn_props->insn_string="l.xori";
485 18 julius
      insn_props->insn_index=31;
486 16 julius
      insn_props->has_rD = 1;
487
      insn_props->has_rA = 1;
488
      insn_props->has_imm = 1;
489
      break;
490
 
491
    case 0x2c:
492
      insn_props->insn_string="l.muli";
493 18 julius
      insn_props->insn_index=32;
494 16 julius
      insn_props->has_rD = 1;
495
      insn_props->has_rA = 1;
496
      insn_props->has_imm = 1;
497
      break;
498
 
499
    case 0x2d:
500
      insn_props->insn_string="l.mfspr";
501 18 julius
      insn_props->insn_index=33;
502 16 julius
      insn_props->has_rD = 1;
503
      insn_props->has_rA = 1;
504
      insn_props->has_imm = 1;
505
      break;
506
 
507
    case 0x2e:
508
      switch(insn_or1k_opcode_0x2e_get_op(insn))
509
        {
510
        case 0x0:
511
          insn_props->insn_string="l.slli";
512 18 julius
          insn_props->insn_index=34;
513 16 julius
          break;
514
        case 0x1:
515
          insn_props->insn_string="l.srli";
516 18 julius
          insn_props->insn_index=35;
517 16 julius
          break;
518
        case 0x2:
519
          insn_props->insn_string="l.srai";
520 18 julius
          insn_props->insn_index=36;
521 16 julius
          break;
522
        case 0x3:
523
          insn_props->insn_string="l.rori";
524 18 julius
          insn_props->insn_index=37;
525 16 julius
          break;
526
        default:
527
          printf("Unknown shift op (0x%x)",
528
                 insn_or1k_opcode_0x2e_get_op(insn));
529 17 julius
          return 1;
530 16 julius
          break;
531
        }
532
      break;
533
 
534
    case 0x2f:
535
      switch(insn_or1k_opcode_0x2f_get_op(insn))
536
        {
537
        case 0x0:
538
          insn_props->insn_string="l.sfeqi";
539 18 julius
          insn_props->insn_index=38;
540 16 julius
          break;
541
        case 0x1:
542
          insn_props->insn_string="l.sfnei";
543 18 julius
          insn_props->insn_index=39;
544 16 julius
          break;
545
        case 0x2:
546
          insn_props->insn_string="l.sfgtui";
547 18 julius
          insn_props->insn_index=40;
548 16 julius
          break;
549
        case 0x3:
550
          insn_props->insn_string="l.sfgeui";
551 18 julius
          insn_props->insn_index=41;
552 16 julius
          break;
553
        case 0x4:
554
          insn_props->insn_string="l.sfltui";
555 18 julius
          insn_props->insn_index=42;
556 16 julius
          break;
557
        case 0x5:
558
          insn_props->insn_string="l.sfleui";
559 18 julius
          insn_props->insn_index=43;
560 16 julius
          break;
561
        case 0xa:
562
          insn_props->insn_string="l.sfgtsi";
563 18 julius
          insn_props->insn_index=44;
564 16 julius
          break;
565
        case 0xb:
566
          insn_props->insn_string="l.sfgesi";
567 18 julius
          insn_props->insn_index=45;
568 16 julius
          break;
569
        case 0xc:
570
          insn_props->insn_string="l.sfltsi";
571 18 julius
          insn_props->insn_index=46;
572 16 julius
          break;
573
        case 0xd:
574
          insn_props->insn_string="l.sflesi";
575 18 julius
          insn_props->insn_index=47;
576 16 julius
          break;
577
 
578
        default:
579
          printf("Unknown set flag op (0x%x)",
580
                 insn_or1k_opcode_0x2f_get_op(insn));
581 17 julius
          return 1;
582 16 julius
          break;
583
        }
584
      insn_props->has_rA = 1;
585
      insn_props->has_imm = 1;
586
      break;
587
 
588
 
589
    case 0x30:
590
      insn_props->insn_string="l.mtspr";
591 18 julius
      insn_props->insn_index=48;
592 16 julius
      break;
593
 
594
    case 0x31:
595
      switch (insn_or1k_opcode_0x31_get_op(insn))
596
        {
597
        case 0x1:
598
          insn_props->insn_string="l.mac";
599 18 julius
          insn_props->insn_index=49;
600 16 julius
          break;
601
        case 0x2:
602
          insn_props->insn_string="l.msb";
603 18 julius
          insn_props->insn_index=50;
604 16 julius
          break;
605
        default:
606
          printf("Unknown mac op (0x%x)",
607
                 insn_or1k_opcode_0x31_get_op(insn));
608 17 julius
          return 1;
609 16 julius
        }
610
      break;
611
 
612
    case 0x32:
613
      switch(insn_or1k_opcode_0x32_get_op_hi(insn))
614
        {
615
        case 0x0:
616
          switch(insn_or1k_opcode_0x32_get_op_lo(insn))
617
            {
618
            case 0x0:
619
              insn_props->insn_string="lf.add.s";
620 18 julius
              insn_props->insn_index=51;
621 16 julius
              break;
622
            case 0x1:
623
              insn_props->insn_string="lf.sub.s";
624 18 julius
              insn_props->insn_index=52;
625 16 julius
              break;
626
            case 0x2:
627
              insn_props->insn_string="lf.mul.s";
628 18 julius
              insn_props->insn_index=53;
629 16 julius
              break;
630
            case 0x3:
631
              insn_props->insn_string="lf.div.s";
632 18 julius
              insn_props->insn_index=54;
633 16 julius
              break;
634
            case 0x4:
635
              insn_props->insn_string="lf.itof.s";
636 18 julius
              insn_props->insn_index=55;
637 16 julius
              break;
638
            case 0x5:
639
              insn_props->insn_string="lf.ftoi.s";
640 18 julius
              insn_props->insn_index=56;
641 16 julius
              break;
642
            case 0x6:
643
              insn_props->insn_string="lf.rem.s";
644 18 julius
              insn_props->insn_index=57;
645 16 julius
              break;
646
            case 0x7:
647
              insn_props->insn_string="lf.madd.s";
648 18 julius
              insn_props->insn_index=58;
649 16 julius
              break;
650
            case 0x8:
651
              insn_props->insn_string="lf.sfeq.s";
652 18 julius
              insn_props->insn_index=59;
653 16 julius
              break;
654
            case 0x9:
655
              insn_props->insn_string="lf.sfne.s";
656 18 julius
              insn_props->insn_index=60;
657 16 julius
              break;
658
            case 0xa:
659
              insn_props->insn_string="lf.sfgt.s";
660 18 julius
              insn_props->insn_index=61;
661 16 julius
              break;
662
            case 0xb:
663
              insn_props->insn_string="lf.sfge.s";
664 18 julius
              insn_props->insn_index=62;
665 16 julius
              break;
666
            case 0xc:
667
              insn_props->insn_string="lf.sflt.s";
668 18 julius
              insn_props->insn_index=63;
669 16 julius
              break;
670
            case 0xd:
671
              insn_props->insn_string="lf.sfle.s";
672 18 julius
              insn_props->insn_index=64;
673 16 julius
              break;
674
            default:
675
              printf("Unknown lf.xxx.s op (0x%x)",
676
                     insn_or1k_opcode_0x32_get_op_lo(insn));
677
              break;
678
            }
679
          break;
680
 
681
        case 0x1:
682
          switch(insn_or1k_opcode_0x32_get_op_lo(insn))
683
            {
684
            case 0x0:
685
              insn_props->insn_string="lf.add.d";
686 18 julius
              insn_props->insn_index=65;
687 16 julius
              break;
688
            case 0x1:
689
              insn_props->insn_string="lf.sub.d";
690 18 julius
              insn_props->insn_index=66;
691 16 julius
              break;
692
            case 0x2:
693
              insn_props->insn_string="lf.mul.d";
694 18 julius
              insn_props->insn_index=67;
695 16 julius
              break;
696
            case 0x3:
697
              insn_props->insn_string="lf.div.d";
698 18 julius
              insn_props->insn_index=68;
699 16 julius
              break;
700
            case 0x4:
701
              insn_props->insn_string="lf.itof.d";
702 18 julius
              insn_props->insn_index=69;
703 16 julius
              break;
704
            case 0x5:
705
              insn_props->insn_string="lf.ftoi.d";
706 18 julius
              insn_props->insn_index=70;
707 16 julius
              break;
708
            case 0x6:
709
              insn_props->insn_string="lf.rem.d";
710 18 julius
              insn_props->insn_index=71;
711 16 julius
              break;
712
            case 0x7:
713
              insn_props->insn_string="lf.madd.d";
714 18 julius
              insn_props->insn_index=72;
715 16 julius
              break;
716
            case 0x8:
717
              insn_props->insn_string="lf.sfeq.d";
718 18 julius
              insn_props->insn_index=73;
719 16 julius
              break;
720
            case 0x9:
721
              insn_props->insn_string="lf.sfne.d";
722 18 julius
              insn_props->insn_index=74;
723 16 julius
              break;
724
            case 0xa:
725
              insn_props->insn_string="lf.sfgt.d";
726 18 julius
              insn_props->insn_index=75;
727 16 julius
              break;
728
            case 0xb:
729
              insn_props->insn_string="lf.sfge.d";
730 18 julius
              insn_props->insn_index=76;
731 16 julius
              break;
732
            case 0xc:
733
              insn_props->insn_string="lf.sflt.d";
734 18 julius
              insn_props->insn_index=77;
735 16 julius
              break;
736
            case 0xd:
737
              insn_props->insn_string="lf.sfle.d";
738 18 julius
              insn_props->insn_index=78;
739 16 julius
              break;
740
            default:
741
              printf("Unknown lf.xxx.d op (0x%x)",
742
                     insn_or1k_opcode_0x32_get_op_lo(insn));
743
              break;
744
            }
745
          break;
746
 
747
        case 0xd:
748
          insn_props->insn_string="lf.cust1.s";
749 18 julius
          insn_props->insn_index=79;
750 16 julius
          break;
751
 
752
        case 0xe:
753
          insn_props->insn_string="lf.cust1.d";
754 18 julius
          insn_props->insn_index=80;
755 16 julius
          break;
756
 
757
        default:
758
          printf("Unknown lf.xxx opcode hi (0x%x)",
759
                 insn_or1k_opcode_0x32_get_op_hi(insn));
760 17 julius
          return 1;
761 16 julius
          break;
762
        }
763
      break;
764
 
765
    case 0x34:
766
      insn_props->insn_string="l.sd";
767 18 julius
      insn_props->insn_index=81;
768 16 julius
      break;
769
 
770
    case 0x35:
771
      insn_props->insn_string="l.sw";
772 18 julius
      insn_props->insn_index=82;
773 16 julius
      break;
774
 
775
    case 0x36:
776
      insn_props->insn_string="l.sb";
777 18 julius
      insn_props->insn_index=83;
778 16 julius
      break;
779
 
780
    case 0x37:
781
      insn_props->insn_string="l.sh";
782 18 julius
      insn_props->insn_index=84;
783 16 julius
      break;
784
 
785
    case 0x38:
786 17 julius
       insn_props->has_rD = 1;
787
       insn_props->has_rA = 1;
788
       insn_props->has_rB = 1;
789
       switch(insn_or1k_opcode_0x38_get_op_lo(insn))
790
         {
791
         case 0x0:
792 16 julius
          insn_props->insn_string="l.add";
793 18 julius
          insn_props->insn_index=85;
794 16 julius
          break;
795
        case 0x1:
796
          insn_props->insn_string="l.addc";
797 18 julius
          insn_props->insn_index=86;
798 16 julius
          break;
799
        case 0x2:
800
          insn_props->insn_string="l.sub";
801 18 julius
          insn_props->insn_index=87;
802 16 julius
          break;
803
        case 0x3:
804
          insn_props->insn_string="l.and";
805 18 julius
          insn_props->insn_index=88;
806 16 julius
          break;
807
        case 0x4:
808
          insn_props->insn_string="l.or";
809 18 julius
          insn_props->insn_index=89;
810 16 julius
          break;
811
        case 0x5:
812
          insn_props->insn_string="l.xor";
813 18 julius
          insn_props->insn_index=90;
814 16 julius
          break;
815
        case 0x6:
816
          insn_props->insn_string="l.mul";
817 18 julius
          insn_props->insn_index=91;
818 16 julius
          break;
819
        case 0x8:
820
          switch (insn_or1k_opcode_0x38_get_op_hi_4bit(insn))
821
            {
822
            case 0x0:
823
              insn_props->insn_string="l.sll";
824 18 julius
              insn_props->insn_index=92;
825 16 julius
              break;
826
            case 0x1:
827
              insn_props->insn_string="l.srl";
828 18 julius
              insn_props->insn_index=93;
829 16 julius
              break;
830
            case 0x2:
831
              insn_props->insn_string="l.sra";
832 18 julius
              insn_props->insn_index=94;
833 16 julius
              break;
834
            case 0x3:
835
              insn_props->insn_string="l.ror";
836 18 julius
              insn_props->insn_index=95;
837 16 julius
              break;
838
            default:
839
              printf("Unknown ALU op 0x8 hi op (0x%x)",
840
                     insn_or1k_opcode_0x38_get_op_hi_4bit(insn));
841 17 julius
              return 1;
842 16 julius
              break;
843
            }
844
          break;
845
        case 0x9:
846
          insn_props->insn_string="l.div";
847 18 julius
          insn_props->insn_index=96;
848 16 julius
          break;
849
        case 0xa:
850
          insn_props->insn_string="l.divu";
851 18 julius
          insn_props->insn_index=97;
852 16 julius
          break;
853
        case 0xb:
854
          insn_props->insn_string="l.mulu";
855 18 julius
          insn_props->insn_index=98;
856 16 julius
          break;
857
        case 0xc:
858
          switch(insn_or1k_opcode_0x38_get_op_hi_4bit(insn))
859
            {
860
            case 0x0:
861
              insn_props->insn_string="l.exths";
862 18 julius
              insn_props->insn_index=99;
863 16 julius
              break;
864
            case 0x1:
865
              insn_props->insn_string="l.extbs";
866 18 julius
              insn_props->insn_index=100;
867 16 julius
              break;
868
            case 0x2:
869
              insn_props->insn_string="l.exthz";
870 18 julius
              insn_props->insn_index=101;
871 16 julius
              break;
872
            case 0x3:
873
              insn_props->insn_string="l.extbz";
874 18 julius
              insn_props->insn_index=102;
875 16 julius
              break;
876
            }
877
          insn_props->has_rB = 0;
878
          break;
879
 
880
        case 0xd:
881
          insn_props->insn_string="l.extws";
882 18 julius
          insn_props->insn_index=103;
883 16 julius
          insn_props->has_rB = 0;
884
          break;
885
 
886
        case 0xe:
887
          insn_props->insn_string="l.cmov";
888 18 julius
          insn_props->insn_index=104;
889 16 julius
          break;
890
 
891
        case 0xf:
892
          if (insn_or1k_opcode_0x38_get_op_hi_2bit(insn) & 0x1)
893 18 julius
            {
894
              insn_props->insn_string="l.fl1";
895
              insn_props->insn_index=105;
896
            }
897 16 julius
          else
898 18 julius
            {
899
              insn_props->insn_string="l.ff1";
900
              insn_props->insn_index=106;
901
            }
902 16 julius
          insn_props->has_rB = 0;
903
          break;
904
 
905
        default:
906
          printf("Unknown ALU lo op (0x%x)",
907
                 insn_or1k_opcode_0x38_get_op_lo(insn));
908 17 julius
          return 1;
909 16 julius
          break;
910
        }
911
      break;
912
 
913
    case 0x39:
914 17 julius
      insn_props->has_rA = 1;
915
      insn_props->has_rB = 1;
916 16 julius
      switch (insn_or1k_opcode_0x39_get_op(insn))
917
        {
918
        case 0x0:
919
          insn_props->insn_string="l.sfeq";
920 18 julius
          insn_props->insn_index=107;
921 16 julius
          break;
922
        case 0x1:
923
          insn_props->insn_string="l.sfne";
924 18 julius
          insn_props->insn_index=108;
925 16 julius
          break;
926
        case 0x2:
927
          insn_props->insn_string="l.sfgtu";
928 18 julius
          insn_props->insn_index=109;
929 16 julius
          break;
930
        case 0x3:
931
          insn_props->insn_string="l.sfgeu";
932 18 julius
          insn_props->insn_index=110;
933 16 julius
          break;
934
        case 0x4:
935
          insn_props->insn_string="l.sfltu";
936 18 julius
          insn_props->insn_index=111;
937 16 julius
          break;
938
        case 0x5:
939
          insn_props->insn_string="l.sfleu";
940 18 julius
          insn_props->insn_index=112;
941 16 julius
          break;
942
        case 0xa:
943
          insn_props->insn_string="l.sfgts";
944 18 julius
          insn_props->insn_index=113;
945 16 julius
          break;
946
        case 0xb:
947
          insn_props->insn_string="l.sfges";
948 18 julius
          insn_props->insn_index=114;
949 16 julius
          break;
950
        case 0xc:
951
          insn_props->insn_string="l.sflts";
952 18 julius
          insn_props->insn_index=115;
953 16 julius
          break;
954
        case 0xd:
955
          insn_props->insn_string="l.sfles";
956 18 julius
          insn_props->insn_index=116;
957 16 julius
          break;
958
        default:
959
          printf("Unknown opcode for l.sfxxx opcode (0x%x)",
960
                 insn_or1k_opcode_0x39_get_op(insn));
961 17 julius
          return 1;
962 16 julius
          break;
963
        }
964
      break;
965
 
966
    default:
967
      printf("Unknown opcode 0x%x",insn_or1k_opcode(insn));
968
      return 1;
969
      break;
970
    }
971
 
972
  return 0;
973
}
974
 
975
 
976
 
977
void or1k_32_collect_stats(uint32_t insn,
978
                         struct or1k_32_instruction_properties  * insn_props)
979
{
980 18 julius
  // Add this instruction's occurance to our data
981
  insn_lists_add(insn, insn_props);
982 16 julius
 
983
}
984
 
985
 
986
 
987
struct or1k_value_list
988
{
989
 
990
#define OR1K_VALUE_MAX_ENTRIES 64
991
  int count;
992
  // [value][occurances_of_value]
993 17 julius
  int32_t values[OR1K_VALUE_MAX_ENTRIES][2];
994 16 julius
 
995
};
996
 
997 18 julius
 
998
// Function to add entry to, or increment incidences of, value in the value list
999
void or1k_add_in_list(struct or1k_value_list * list, int32_t value)
1000
{
1001
  int i;
1002
  // See if it's already in the list
1003
  i=list->count;
1004
 
1005
  while(i)
1006
    {
1007
      i--;
1008
      if(list->values[i][0] == value)
1009
        {
1010
          (list->values[i][1])++;
1011
          return;
1012
        }
1013
    }
1014
 
1015
  if (list->count < OR1K_VALUE_MAX_ENTRIES)
1016
    {
1017
      // Not found, add it to the list
1018
      list->values[(list->count)][0] = value;
1019
      list->values[(list->count)][1] = 1;
1020
      list->count++;
1021
    }
1022
 
1023
}
1024
 
1025 16 julius
struct or1k_insn_info
1026
{
1027
  char* insn_string;
1028
 
1029
  int count;
1030
 
1031
  int has_branchtarg;
1032
  struct or1k_value_list branch_info;
1033
 
1034
  int has_imm;
1035
  struct or1k_value_list imm_info;
1036
 
1037
  int has_rD;
1038
  int rD_use_freq[32];
1039
  int has_rA;
1040
  int rA_use_freq[32];
1041
  int has_rB;
1042
  int rB_use_freq[32];
1043
 
1044 18 julius
  // Set maximum instructions in a row we'll keep track of, starting at pairs
1045
#define OR1K_MAX_GROUPINGS_ANALYSIS 4
1046
#define OR1K_MAX_ENTRIES_PER_GROUP 1000
1047
  // Format of grouping data:
1048
  //
1049
  // 1st dimension: A list for each n-tuple group we're keeping track of 
1050
  // (starting at pairs of instructions)
1051
  //
1052
  // 2nd dimension: Stores the list entries for the 1st dimension-tuple 
1053
  // grouping. The number in [x][0][0] is the number of entries in the list so 
1054
  // far, beginning at 0. The actual entries with data for grouping x start at 
1055
  // [x][1][], where that entry holds the 1st x+2-tuple grouping information 
1056
  // (eg. at x=0, [0][1][] is the first entry for/ pair instruction 
1057
  // information, x=1, is for triples, x=2 quadruples, etc)
1058
  //
1059
  // 3rd dimension: Store up to x+2 instruction indexes (where x is the first 
1060
  // dimension index, meaning this particular data is for a (x+2)-tuple set) 
1061
  // and then a frequency count for this set (in index (x+2) of the third 
1062
  // dimension array). Note we will have the index for the instruction this 
1063
  // struct corresponds to in [x][n][(x+2)-1], which seems redundant, but can 
1064
  // help processing later on.  
1065
  // 
1066
  // Note that we will have empty entries in the third dimension arrays for all
1067
  // but the last in the list of n-tuples. This is to save doing tricky naming
1068
  // defines and, in the future, if we would like to analyse sets that are 
1069
  // bigger or smaller, hopefully all we need to do is change a single define.
1070
  //
1071
  int groupings[OR1K_MAX_GROUPINGS_ANALYSIS][OR1K_MAX_ENTRIES_PER_GROUP+1][OR1K_MAX_GROUPINGS_ANALYSIS+1];
1072
 
1073 16 julius
};
1074
 
1075 18 julius
// This number should correspond to the maximum insn_index we assign in the 
1076
// analyse function
1077
#define OR1K_32_MAX_INSNS 117
1078 16 julius
struct or1k_insn_info * or1k_32_insns[OR1K_32_MAX_INSNS];
1079
 
1080
 
1081
// List management/analysis functions - accessed through insn_lists() set of
1082
// functions
1083
 
1084
// Variable to keep track of unique instructions we have
1085 18 julius
int num_setup_insns;
1086 16 julius
int num_seen_insns;
1087
 
1088
 
1089
void or1k_32_insn_lists_init(void)
1090
{
1091 18 julius
  num_setup_insns = 0;
1092 16 julius
  num_seen_insns = 0;
1093 18 julius
  // Clear the pointer array so we can tell if things are used or not
1094
  memset(or1k_32_insns, '\0',
1095
         sizeof(struct or1k_insn_info *)*OR1K_32_MAX_INSNS);
1096 16 julius
}
1097
 
1098 18 julius
// Alloc struct and put it into the list
1099
void or1k_32_insn_lists_init_insn(uint32_t insn,
1100
                        struct or1k_32_instruction_properties *insn_props)
1101 16 julius
{
1102
  // Add an instruction in or1k_32_insns[num_unique_instructions];
1103
  // use calloc() so it clears it all first (hopefully!).. assumption!
1104
  struct or1k_insn_info * new_insn
1105
    = (struct or1k_insn_info *) calloc (sizeof(struct or1k_insn_info), 1);
1106
 
1107 18 julius
  // Copy the string pointer
1108
  new_insn->insn_string = insn_props->insn_string,
1109 16 julius
 
1110 18 julius
  // Install the pointer for this newly allocated struct in its corresponding
1111
  // index, as set when we decode the instruction
1112
  or1k_32_insns[insn_props->insn_index] = new_insn;
1113 16 julius
 
1114 18 julius
  // Increment number of instructions we have set up
1115
  num_setup_insns++;
1116 17 julius
 
1117
  // Debugging:
1118
  //printf("Adding %dth instruction - %s\n",
1119 18 julius
  //num_setup_insns, new_insn->insn_string);
1120 16 julius
 
1121
}
1122
 
1123
 
1124 17 julius
 
1125 16 julius
// Add stats for this instruction
1126 18 julius
void or1k_32_insn_lists_add(uint32_t insn,
1127 16 julius
                            struct or1k_32_instruction_properties *insn_props)
1128
{
1129 18 julius
  // Check if the entry for this instruction has been setup yet
1130
  if (or1k_32_insns[insn_props->insn_index] == NULL)
1131
    {
1132
      // Here we allocate space for the instruction's stats
1133
      or1k_32_insn_lists_init_insn(insn, insn_props);
1134
    }
1135 16 julius
 
1136 18 julius
  // Increment occurance count
1137
  ((or1k_32_insns[insn_props->insn_index])->count)++;
1138 16 julius
 
1139
  // Add branch target value information, if instruction has it
1140
  if (insn_props->has_branchtarg)
1141
    {
1142 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_branchtarg = 1;
1143
      or1k_add_in_list(&((or1k_32_insns[insn_props->insn_index])->branch_info),
1144 17 julius
                       (int32_t)insn_or1k_opcode_0x03_get_branchoff(insn));
1145 16 julius
    }
1146
 
1147
  // Add immediate value if it's got one
1148
  if (insn_props->has_imm)
1149
    {
1150 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_imm = 1;
1151
      or1k_add_in_list(&((or1k_32_insns[insn_props->insn_index])->imm_info),
1152 17 julius
                       (int32_t)insn_or1k_32_imm(insn));
1153 16 julius
    }
1154
 
1155
  // Add split immediate value if it's got one
1156
  if (insn_props->has_split_imm)
1157 17 julius
    {
1158 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_imm = 1;
1159
      or1k_add_in_list(&((or1k_32_insns[insn_props->insn_index])->imm_info),
1160 17 julius
                       (int32_t)insn_or1k_32_split_imm(insn));
1161 16 julius
    }
1162
 
1163
 
1164
  // Increment count of use for particular rD
1165
  if (insn_props->has_rD)
1166
    {
1167 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_rD = 1;
1168
      ((or1k_32_insns[insn_props->insn_index])->rD_use_freq[insn_or1k_32_rD(insn)])++;
1169 16 julius
    }
1170
 
1171
  // Increment count of use for particular rA
1172
  if (insn_props->has_rA)
1173
    {
1174 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_rA = 1;
1175
      ((or1k_32_insns[insn_props->insn_index])->rA_use_freq[insn_or1k_32_rA(insn)])++;
1176 16 julius
    }
1177
 
1178
  // Increment count of use for particular rB
1179
  if (insn_props->has_rB)
1180
    {
1181 18 julius
      (or1k_32_insns[insn_props->insn_index])->has_rB = 1;
1182
      ((or1k_32_insns[insn_props->insn_index])->rB_use_freq[insn_or1k_32_rB(insn)])++;
1183 16 julius
    }
1184
 
1185 18 julius
 
1186
  // TODO: n-tuple groupings stats recording here!
1187
 
1188 16 julius
  // Finished adding to stats for this instruction
1189
 
1190
  // Increment overall instructions "seen" counter
1191
  num_seen_insns++;
1192
 
1193
}
1194
 
1195
 
1196
// Free up all added instruction statistic tracking structs
1197
void or1k_32_insn_lists_free(void)
1198
{
1199 18 julius
  // Free all entries we m/calloc()'d
1200
  int insn_index;
1201
  for(insn_index=0;insn_index<OR1K_32_MAX_INSNS;insn_index++)
1202 16 julius
    {
1203 18 julius
      if (or1k_32_insns[insn_index] != NULL)
1204
        free(or1k_32_insns[insn_index]);
1205 16 julius
    }
1206
}
1207 17 julius
 
1208
 
1209
#define DISPLAY_STRING
1210
//#define DISPLAY_CSV
1211
 
1212
void or1k_32_most_freq_insn(FILE * stream)
1213
{
1214
  // Print out most frequent instruction
1215
  int i, largest, largest_index;
1216 18 julius
  int instructions_to_print = num_setup_insns;
1217 17 julius
  while (instructions_to_print)
1218
    {
1219
      --instructions_to_print;
1220
      largest=0;
1221
      // Go through the list, find the largest, print it, eliminate it
1222 18 julius
      for(i=0;i<OR1K_32_MAX_INSNS;i++)
1223
        if (or1k_32_insns[i]!=NULL){
1224
          if(((or1k_32_insns[i])->count) > largest)
1225
            {
1226
              largest = ((or1k_32_insns[i])->count);
1227
              largest_index = i;
1228
            }
1229
        }
1230 17 julius
      fprintf(stream,
1231
#ifdef DISPLAY_STRING      
1232
             "Insn:\t%s\t\tCount:\t\t%d\t(%f%%)\n",
1233
#endif
1234
#ifdef DISPLAY_CSV
1235
             // CSV format - "opcode string",frequency,percentage
1236
             "\"%s\",%d,%f\n",
1237
#endif
1238
             ((or1k_32_insns[largest_index])->insn_string),
1239
             ((or1k_32_insns[largest_index])->count),
1240
             (float)(((float)((or1k_32_insns[largest_index])->count))/
1241
                     ((float)num_seen_insns))*100.f);
1242
 
1243
 
1244
      ((or1k_32_insns[largest_index])->count) = -1; // Eliminate this one
1245
 
1246
    }
1247
}
1248
 
1249
 
1250
// Print out top x of each kept statistic for the requested instruction
1251 18 julius
void or1k_32_insn_top_x(struct or1k_insn_info *insn_info, FILE * stream,
1252
                        int max_stats)
1253 17 julius
{
1254
  int i, j, largest, largest_i;
1255
 
1256 18 julius
  fprintf(stream,
1257
          "Insn: \"%s\" statistics (%d times (%f%%)):\n",
1258
          insn_info->insn_string,
1259
          insn_info->count,
1260
          (float)(((float)((insn_info)->count))/
1261
                  ((float)num_seen_insns))*100.f
1262
          );
1263 17 julius
 
1264
 
1265
 
1266 18 julius
  // Start dumping applicable stats
1267 17 julius
 
1268
  // Print out top max_stats branch targets
1269 18 julius
  if (insn_info->has_branchtarg)
1270 17 julius
    {
1271
      fprintf(stream,"Branch values:\n");
1272
      i = 0;
1273 18 julius
      while(i<insn_info->branch_info.count && i < max_stats)
1274 17 julius
        {
1275
          largest_i=0;
1276 18 julius
          for(j=0;j<insn_info->branch_info.count;j++)
1277
            largest_i = (insn_info->branch_info.values[j][1] >
1278
                         insn_info->branch_info.values[largest_i][1]) ?
1279 17 julius
              j : largest_i;
1280
 
1281
          // largest_i has index of most frequent value
1282
          fprintf(stream,
1283
                  "value:\t0x%x\tcount:\t%d\n",
1284 18 julius
                  insn_info->branch_info.values[largest_i][0],
1285
                  insn_info->branch_info.values[largest_i][1]);
1286
          insn_info->branch_info.values[largest_i][1] = -1; // clear this one
1287 17 julius
          i++;
1288
        }
1289
    }
1290 18 julius
  if (insn_info->has_imm)
1291 17 julius
    {
1292
      fprintf(stream,"Immediate values:\n");
1293
      i = 0;
1294 18 julius
      while(i<insn_info->imm_info.count && i < max_stats)
1295 17 julius
        {
1296
          largest_i=0;
1297 18 julius
          for(j=0;j<insn_info->imm_info.count;j++)
1298
            largest_i = (insn_info->imm_info.values[j][1] >
1299
                         insn_info->imm_info.values[largest_i][1]) ?
1300 17 julius
              j : largest_i;
1301
 
1302
          // largest_i has index of most frequent value
1303
          fprintf(stream,
1304
                  "value:\t0x%x\tcount:\t%d\n",
1305 18 julius
                  insn_info->imm_info.values[largest_i][0],
1306
                  insn_info->imm_info.values[largest_i][1]);
1307
          insn_info->imm_info.values[largest_i][1] = -1; // clear this one
1308 17 julius
          i++;
1309
        }
1310
    }
1311 18 julius
  if (insn_info->has_rD)
1312 17 julius
    {
1313
      fprintf(stream,"rD usage:\n");
1314
      i = 0;
1315
      while(i<32 && i < max_stats)
1316
        {
1317
          largest_i=0;
1318
          for(j=0;j<32;j++)
1319 18 julius
            largest_i = (insn_info->rD_use_freq[j] >
1320
                         insn_info->rD_use_freq[largest_i]) ?
1321 17 julius
              j : largest_i;
1322
 
1323
          // No more interesting numbers
1324 18 julius
          if (insn_info->rD_use_freq[largest_i] == 0)
1325 17 julius
            break;
1326
 
1327
          // largest_i has index of most frequent value
1328
          fprintf(stream,
1329
                  "r%d\tcount:\t%d\n",
1330
                  largest_i,
1331 18 julius
                  insn_info->rD_use_freq[largest_i]);
1332
          insn_info->rD_use_freq[largest_i] = -1; // clear this one
1333 17 julius
          i++;
1334
        }
1335
    }
1336
 
1337 18 julius
  if (insn_info->has_rA)
1338 17 julius
    {
1339
      fprintf(stream,"rA usage:\n");
1340
      i = 0;
1341
      while(i<32 && i < max_stats)
1342
        {
1343
          largest_i=0;
1344
          for(j=0;j<32;j++)
1345 18 julius
            largest_i = (insn_info->rA_use_freq[j] >
1346
                         insn_info->rA_use_freq[largest_i]) ?
1347 17 julius
              j : largest_i;
1348
 
1349
          // No more interesting numbers
1350 18 julius
          if (insn_info->rA_use_freq[largest_i] == 0)
1351 17 julius
            break;
1352
 
1353
 
1354
          // largest_i has index of most frequent value
1355
          fprintf(stream,
1356
                  "r%d\tcount:\t%d\n",
1357
                  largest_i,
1358 18 julius
                  insn_info->rA_use_freq[largest_i]);
1359
          insn_info->rA_use_freq[largest_i] = -1; // clear this one
1360 17 julius
          i++;
1361
        }
1362
    }
1363
 
1364 18 julius
  if (insn_info->has_rB)
1365 17 julius
    {
1366
      fprintf(stream,"rB usage:\n");
1367
      i = 0;
1368
      while(i<32 && i < max_stats)
1369
        {
1370
          largest_i=0;
1371
          for(j=0;j<32;j++)
1372 18 julius
            largest_i = (insn_info->rB_use_freq[j] >
1373
                         insn_info->rB_use_freq[largest_i]) ?
1374 17 julius
              j : largest_i;
1375
 
1376
          // No more interesting numbers
1377 18 julius
          if (insn_info->rB_use_freq[largest_i] == 0)
1378 17 julius
            break;
1379
 
1380
 
1381
          // largest_i has index of most frequent value
1382
          fprintf(stream,
1383
                  "r%d\tcount:\t%d\n",
1384
                  largest_i,
1385 18 julius
                  insn_info->rB_use_freq[largest_i]);
1386
          insn_info->rB_use_freq[largest_i] = -1; // clear this one
1387 17 julius
          i++;
1388
        }
1389
    }
1390
}
1391 16 julius
 
1392 17 julius
void or1k_32_generate_stats(FILE * stream)
1393
{
1394
  // Generate some useful things
1395
  fprintf(stream, "Analysis output:\n");
1396
 
1397
  // 
1398
 
1399
  // Print out all stats for every instruction we saw!
1400 18 julius
  int insn_index;
1401
  for(insn_index=0;insn_index<OR1K_32_MAX_INSNS;insn_index++)
1402 17 julius
    {
1403 18 julius
      if (or1k_32_insns[insn_index] != NULL)
1404
        or1k_32_insn_top_x(or1k_32_insns[insn_index],stream,10);
1405 17 julius
    }
1406
 
1407
 
1408
  // Do most frequent instruction analysis -- note this trashes instruction
1409
  // frequency count - should be fixed
1410
  or1k_32_most_freq_insn(stream);
1411
 
1412
}

powered by: WebSVN 2.1.0

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