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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [opcodes/] [i386-opc.h] - Blame information for rev 136

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

Line No. Rev Author Line
1 18 khays
/* Declarations for Intel 80386 opcode table
2
   Copyright 2007, 2008, 2009, 2010
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of the GNU opcodes library.
6
 
7
   This library 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 3, or (at your option)
10
   any later version.
11
 
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with GAS; see the file COPYING.  If not, write to the Free
19
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20
   02110-1301, USA.  */
21
 
22
#include "opcode/i386.h"
23
#ifdef HAVE_LIMITS_H
24
#include <limits.h>
25
#endif
26
 
27
#ifndef CHAR_BIT
28
#define CHAR_BIT 8
29
#endif
30
 
31
/* Position of cpu flags bitfiled.  */
32
 
33
enum
34
{
35
  /* i186 or better required */
36
  Cpu186 = 0,
37
  /* i286 or better required */
38
  Cpu286,
39
  /* i386 or better required */
40
  Cpu386,
41
  /* i486 or better required */
42
  Cpu486,
43
  /* i585 or better required */
44
  Cpu586,
45
  /* i686 or better required */
46
  Cpu686,
47
  /* CLFLUSH Instruction support required */
48
  CpuClflush,
49
  /* NOP Instruction support required */
50
  CpuNop,
51
  /* SYSCALL Instructions support required */
52
  CpuSYSCALL,
53
  /* Floating point support required */
54
  Cpu8087,
55
  /* i287 support required */
56
  Cpu287,
57
  /* i387 support required */
58
  Cpu387,
59
  /* i686 and floating point support required */
60
  Cpu687,
61
  /* SSE3 and floating point support required */
62
  CpuFISTTP,
63
  /* MMX support required */
64
  CpuMMX,
65
  /* SSE support required */
66
  CpuSSE,
67
  /* SSE2 support required */
68
  CpuSSE2,
69
  /* 3dnow! support required */
70
  Cpu3dnow,
71
  /* 3dnow! Extensions support required */
72
  Cpu3dnowA,
73
  /* SSE3 support required */
74
  CpuSSE3,
75
  /* VIA PadLock required */
76
  CpuPadLock,
77
  /* AMD Secure Virtual Machine Ext-s required */
78
  CpuSVME,
79
  /* VMX Instructions required */
80
  CpuVMX,
81
  /* SMX Instructions required */
82
  CpuSMX,
83
  /* SSSE3 support required */
84
  CpuSSSE3,
85
  /* SSE4a support required */
86
  CpuSSE4a,
87
  /* ABM New Instructions required */
88
  CpuABM,
89
  /* SSE4.1 support required */
90
  CpuSSE4_1,
91
  /* SSE4.2 support required */
92
  CpuSSE4_2,
93
  /* AVX support required */
94
  CpuAVX,
95
  /* Intel L1OM support required */
96
  CpuL1OM,
97
  /* Xsave/xrstor New Instructions support required */
98
  CpuXsave,
99
  /* Xsaveopt New Instructions support required */
100
  CpuXsaveopt,
101
  /* AES support required */
102
  CpuAES,
103
  /* PCLMUL support required */
104
  CpuPCLMUL,
105
  /* FMA support required */
106
  CpuFMA,
107
  /* FMA4 support required */
108
  CpuFMA4,
109
  /* XOP support required */
110
  CpuXOP,
111
  /* LWP support required */
112
  CpuLWP,
113
  /* BMI support required */
114
  CpuBMI,
115
  /* TBM support required */
116
  CpuTBM,
117
  /* MOVBE Instruction support required */
118
  CpuMovbe,
119
  /* EPT Instructions required */
120
  CpuEPT,
121
  /* RDTSCP Instruction support required */
122
  CpuRdtscp,
123
  /* FSGSBASE Instructions required */
124
  CpuFSGSBase,
125
  /* RDRND Instructions required */
126
  CpuRdRnd,
127
  /* F16C Instructions required */
128
  CpuF16C,
129
  /* 64bit support available, used by -march= in assembler.  */
130
  CpuLM,
131
  /* 64bit support required  */
132
  Cpu64,
133
  /* Not supported in the 64bit mode  */
134
  CpuNo64,
135
  /* The last bitfield in i386_cpu_flags.  */
136
  CpuMax = CpuNo64
137
};
138
 
139
#define CpuNumOfUints \
140
  (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1)
141
#define CpuNumOfBits \
142
  (CpuNumOfUints * sizeof (unsigned int) * CHAR_BIT)
143
 
144
/* If you get a compiler error for zero width of the unused field,
145
   comment it out.  */
146
#define CpuUnused       (CpuMax + 1)
147
 
148
/* We can check if an instruction is available with array instead
149
   of bitfield. */
150
typedef union i386_cpu_flags
151
{
152
  struct
153
    {
154
      unsigned int cpui186:1;
155
      unsigned int cpui286:1;
156
      unsigned int cpui386:1;
157
      unsigned int cpui486:1;
158
      unsigned int cpui586:1;
159
      unsigned int cpui686:1;
160
      unsigned int cpuclflush:1;
161
      unsigned int cpunop:1;
162
      unsigned int cpusyscall:1;
163
      unsigned int cpu8087:1;
164
      unsigned int cpu287:1;
165
      unsigned int cpu387:1;
166
      unsigned int cpu687:1;
167
      unsigned int cpufisttp:1;
168
      unsigned int cpummx:1;
169
      unsigned int cpusse:1;
170
      unsigned int cpusse2:1;
171
      unsigned int cpua3dnow:1;
172
      unsigned int cpua3dnowa:1;
173
      unsigned int cpusse3:1;
174
      unsigned int cpupadlock:1;
175
      unsigned int cpusvme:1;
176
      unsigned int cpuvmx:1;
177
      unsigned int cpusmx:1;
178
      unsigned int cpussse3:1;
179
      unsigned int cpusse4a:1;
180
      unsigned int cpuabm:1;
181
      unsigned int cpusse4_1:1;
182
      unsigned int cpusse4_2:1;
183
      unsigned int cpuavx:1;
184
      unsigned int cpul1om:1;
185
      unsigned int cpuxsave:1;
186
      unsigned int cpuxsaveopt:1;
187
      unsigned int cpuaes:1;
188
      unsigned int cpupclmul:1;
189
      unsigned int cpufma:1;
190
      unsigned int cpufma4:1;
191
      unsigned int cpuxop:1;
192
      unsigned int cpulwp:1;
193
      unsigned int cpubmi:1;
194
      unsigned int cputbm:1;
195
      unsigned int cpumovbe:1;
196
      unsigned int cpuept:1;
197
      unsigned int cpurdtscp:1;
198
      unsigned int cpufsgsbase:1;
199
      unsigned int cpurdrnd:1;
200
      unsigned int cpuf16c:1;
201
      unsigned int cpulm:1;
202
      unsigned int cpu64:1;
203
      unsigned int cpuno64:1;
204
#ifdef CpuUnused
205
      unsigned int unused:(CpuNumOfBits - CpuUnused);
206
#endif
207
    } bitfield;
208
  unsigned int array[CpuNumOfUints];
209
} i386_cpu_flags;
210
 
211
/* Position of opcode_modifier bits.  */
212
 
213
enum
214
{
215
  /* has direction bit. */
216
  D = 0,
217
  /* set if operands can be words or dwords encoded the canonical way */
218
  W,
219
  /* Skip the current insn and use the next insn in i386-opc.tbl to swap
220
     operand in encoding.  */
221
  S,
222
  /* insn has a modrm byte. */
223
  Modrm,
224
  /* register is in low 3 bits of opcode */
225
  ShortForm,
226
  /* special case for jump insns.  */
227
  Jump,
228
  /* call and jump */
229
  JumpDword,
230
  /* loop and jecxz */
231
  JumpByte,
232
  /* special case for intersegment leaps/calls */
233
  JumpInterSegment,
234
  /* FP insn memory format bit, sized by 0x4 */
235
  FloatMF,
236
  /* src/dest swap for floats. */
237
  FloatR,
238
  /* has float insn direction bit. */
239
  FloatD,
240
  /* needs size prefix if in 32-bit mode */
241
  Size16,
242
  /* needs size prefix if in 16-bit mode */
243
  Size32,
244
  /* needs size prefix if in 64-bit mode */
245
  Size64,
246
  /* check register size.  */
247
  CheckRegSize,
248
  /* instruction ignores operand size prefix and in Intel mode ignores
249
     mnemonic size suffix check.  */
250
  IgnoreSize,
251
  /* default insn size depends on mode */
252
  DefaultSize,
253
  /* b suffix on instruction illegal */
254
  No_bSuf,
255
  /* w suffix on instruction illegal */
256
  No_wSuf,
257
  /* l suffix on instruction illegal */
258
  No_lSuf,
259
  /* s suffix on instruction illegal */
260
  No_sSuf,
261
  /* q suffix on instruction illegal */
262
  No_qSuf,
263
  /* long double suffix on instruction illegal */
264
  No_ldSuf,
265
  /* instruction needs FWAIT */
266
  FWait,
267
  /* quick test for string instructions */
268
  IsString,
269
  /* quick test for lockable instructions */
270
  IsLockable,
271
  /* fake an extra reg operand for clr, imul and special register
272
     processing for some instructions.  */
273
  RegKludge,
274
  /* The first operand must be xmm0 */
275
  FirstXmm0,
276
  /* An implicit xmm0 as the first operand */
277
  Implicit1stXmm0,
278
  /* Convert to DWORD */
279
  ToDword,
280
  /* Convert to QWORD */
281
  ToQword,
282
  /* Address prefix changes operand 0 */
283
  AddrPrefixOp0,
284
  /* opcode is a prefix */
285
  IsPrefix,
286
  /* instruction has extension in 8 bit imm */
287
  ImmExt,
288
  /* instruction don't need Rex64 prefix.  */
289
  NoRex64,
290
  /* instruction require Rex64 prefix.  */
291
  Rex64,
292
  /* deprecated fp insn, gets a warning */
293
  Ugh,
294
  /* insn has VEX prefix:
295
        1: 128bit VEX prefix.
296
        2: 256bit VEX prefix.
297
        3: Scalar VEX prefix.
298
   */
299
#define VEX128          1
300
#define VEX256          2
301
#define VEXScalar       3
302
  Vex,
303
  /* How to encode VEX.vvvv:
304
     0: VEX.vvvv must be 1111b.
305
     1: VEX.NDS.  Register-only source is encoded in VEX.vvvv where
306
        the content of source registers will be preserved.
307
        VEX.DDS.  The second register operand is encoded in VEX.vvvv
308
        where the content of first source register will be overwritten
309
        by the result.
310
        For assembler, there are no difference between VEX.NDS and
311
        VEX.DDS.
312
     2. VEX.NDD.  Register destination is encoded in VEX.vvvv.
313
     3. VEX.LWP.  Register destination is encoded in VEX.vvvv and one
314
        of the operands can access a memory location.
315
   */
316
#define VEXXDS  1
317
#define VEXNDD  2
318
#define VEXLWP  3
319
  VexVVVV,
320
  /* How the VEX.W bit is used:
321
     0: Set by the REX.W bit.
322
     1: VEX.W0.  Should always be 0.
323
     2: VEX.W1.  Should always be 1.
324
   */
325
#define VEXW0   1
326
#define VEXW1   2
327
  VexW,
328
  /* VEX opcode prefix:
329
     0: VEX 0x0F opcode prefix.
330
     1: VEX 0x0F38 opcode prefix.
331
     2: VEX 0x0F3A opcode prefix
332
     3: XOP 0x08 opcode prefix.
333
     4: XOP 0x09 opcode prefix
334
     5: XOP 0x0A opcode prefix.
335
   */
336
#define VEX0F           0
337
#define VEX0F38         1
338
#define VEX0F3A         2
339
#define XOP08           3
340
#define XOP09           4
341
#define XOP0A           5
342
  VexOpcode,
343
  /* number of VEX source operands:
344
     0: <= 2 source operands.
345
     1: 2 XOP source operands.
346
     2: 3 source operands.
347
   */
348
#define XOP2SOURCES     1
349
#define VEX3SOURCES     2
350
  VexSources,
351
  /* instruction has VEX 8 bit imm */
352
  VexImmExt,
353
  /* SSE to AVX support required */
354
  SSE2AVX,
355
  /* No AVX equivalent */
356
  NoAVX,
357
  /* Compatible with old (<= 2.8.1) versions of gcc  */
358
  OldGcc,
359
  /* AT&T mnemonic.  */
360
  ATTMnemonic,
361
  /* AT&T syntax.  */
362
  ATTSyntax,
363
  /* Intel syntax.  */
364
  IntelSyntax,
365
  /* The last bitfield in i386_opcode_modifier.  */
366
  Opcode_Modifier_Max
367
};
368
 
369
typedef struct i386_opcode_modifier
370
{
371
  unsigned int d:1;
372
  unsigned int w:1;
373
  unsigned int s:1;
374
  unsigned int modrm:1;
375
  unsigned int shortform:1;
376
  unsigned int jump:1;
377
  unsigned int jumpdword:1;
378
  unsigned int jumpbyte:1;
379
  unsigned int jumpintersegment:1;
380
  unsigned int floatmf:1;
381
  unsigned int floatr:1;
382
  unsigned int floatd:1;
383
  unsigned int size16:1;
384
  unsigned int size32:1;
385
  unsigned int size64:1;
386
  unsigned int checkregsize:1;
387
  unsigned int ignoresize:1;
388
  unsigned int defaultsize:1;
389
  unsigned int no_bsuf:1;
390
  unsigned int no_wsuf:1;
391
  unsigned int no_lsuf:1;
392
  unsigned int no_ssuf:1;
393
  unsigned int no_qsuf:1;
394
  unsigned int no_ldsuf:1;
395
  unsigned int fwait:1;
396
  unsigned int isstring:1;
397
  unsigned int islockable:1;
398
  unsigned int regkludge:1;
399
  unsigned int firstxmm0:1;
400
  unsigned int implicit1stxmm0:1;
401
  unsigned int todword:1;
402
  unsigned int toqword:1;
403
  unsigned int addrprefixop0:1;
404
  unsigned int isprefix:1;
405
  unsigned int immext:1;
406
  unsigned int norex64:1;
407
  unsigned int rex64:1;
408
  unsigned int ugh:1;
409
  unsigned int vex:2;
410
  unsigned int vexvvvv:2;
411
  unsigned int vexw:2;
412
  unsigned int vexopcode:3;
413
  unsigned int vexsources:2;
414
  unsigned int veximmext:1;
415
  unsigned int sse2avx:1;
416
  unsigned int noavx:1;
417
  unsigned int oldgcc:1;
418
  unsigned int attmnemonic:1;
419
  unsigned int attsyntax:1;
420
  unsigned int intelsyntax:1;
421
} i386_opcode_modifier;
422
 
423
/* Position of operand_type bits.  */
424
 
425
enum
426
{
427
  /* 8bit register */
428
  Reg8 = 0,
429
  /* 16bit register */
430
  Reg16,
431
  /* 32bit register */
432
  Reg32,
433
  /* 64bit register */
434
  Reg64,
435
  /* Floating pointer stack register */
436
  FloatReg,
437
  /* MMX register */
438
  RegMMX,
439
  /* SSE register */
440
  RegXMM,
441
  /* AVX registers */
442
  RegYMM,
443
  /* Control register */
444
  Control,
445
  /* Debug register */
446
  Debug,
447
  /* Test register */
448
  Test,
449
  /* 2 bit segment register */
450
  SReg2,
451
  /* 3 bit segment register */
452
  SReg3,
453
  /* 1 bit immediate */
454
  Imm1,
455
  /* 8 bit immediate */
456
  Imm8,
457
  /* 8 bit immediate sign extended */
458
  Imm8S,
459
  /* 16 bit immediate */
460
  Imm16,
461
  /* 32 bit immediate */
462
  Imm32,
463
  /* 32 bit immediate sign extended */
464
  Imm32S,
465
  /* 64 bit immediate */
466
  Imm64,
467
  /* 8bit/16bit/32bit displacements are used in different ways,
468
     depending on the instruction.  For jumps, they specify the
469
     size of the PC relative displacement, for instructions with
470
     memory operand, they specify the size of the offset relative
471
     to the base register, and for instructions with memory offset
472
     such as `mov 1234,%al' they specify the size of the offset
473
     relative to the segment base.  */
474
  /* 8 bit displacement */
475
  Disp8,
476
  /* 16 bit displacement */
477
  Disp16,
478
  /* 32 bit displacement */
479
  Disp32,
480
  /* 32 bit signed displacement */
481
  Disp32S,
482
  /* 64 bit displacement */
483
  Disp64,
484
  /* Accumulator %al/%ax/%eax/%rax */
485
  Acc,
486
  /* Floating pointer top stack register %st(0) */
487
  FloatAcc,
488
  /* Register which can be used for base or index in memory operand.  */
489
  BaseIndex,
490
  /* Register to hold in/out port addr = dx */
491
  InOutPortReg,
492
  /* Register to hold shift count = cl */
493
  ShiftCount,
494
  /* Absolute address for jump.  */
495
  JumpAbsolute,
496
  /* String insn operand with fixed es segment */
497
  EsSeg,
498
  /* RegMem is for instructions with a modrm byte where the register
499
     destination operand should be encoded in the mod and regmem fields.
500
     Normally, it will be encoded in the reg field. We add a RegMem
501
     flag to the destination register operand to indicate that it should
502
     be encoded in the regmem field.  */
503
  RegMem,
504
  /* Memory.  */
505
  Mem,
506
  /* BYTE memory. */
507
  Byte,
508
  /* WORD memory. 2 byte */
509
  Word,
510
  /* DWORD memory. 4 byte */
511
  Dword,
512
  /* FWORD memory. 6 byte */
513
  Fword,
514
  /* QWORD memory. 8 byte */
515
  Qword,
516
  /* TBYTE memory. 10 byte */
517
  Tbyte,
518
  /* XMMWORD memory. */
519
  Xmmword,
520
  /* YMMWORD memory. */
521
  Ymmword,
522
  /* Unspecified memory size.  */
523
  Unspecified,
524
  /* Any memory size.  */
525
  Anysize,
526
 
527
  /* Vector 4 bit immediate.  */
528
  Vec_Imm4,
529
 
530
  /* The last bitfield in i386_operand_type.  */
531
  OTMax
532
};
533
 
534
#define OTNumOfUints \
535
  (OTMax / sizeof (unsigned int) / CHAR_BIT + 1)
536
#define OTNumOfBits \
537
  (OTNumOfUints * sizeof (unsigned int) * CHAR_BIT)
538
 
539
/* If you get a compiler error for zero width of the unused field,
540
   comment it out.  */
541
#define OTUnused                (OTMax + 1)
542
 
543
typedef union i386_operand_type
544
{
545
  struct
546
    {
547
      unsigned int reg8:1;
548
      unsigned int reg16:1;
549
      unsigned int reg32:1;
550
      unsigned int reg64:1;
551
      unsigned int floatreg:1;
552
      unsigned int regmmx:1;
553
      unsigned int regxmm:1;
554
      unsigned int regymm:1;
555
      unsigned int control:1;
556
      unsigned int debug:1;
557
      unsigned int test:1;
558
      unsigned int sreg2:1;
559
      unsigned int sreg3:1;
560
      unsigned int imm1:1;
561
      unsigned int imm8:1;
562
      unsigned int imm8s:1;
563
      unsigned int imm16:1;
564
      unsigned int imm32:1;
565
      unsigned int imm32s:1;
566
      unsigned int imm64:1;
567
      unsigned int disp8:1;
568
      unsigned int disp16:1;
569
      unsigned int disp32:1;
570
      unsigned int disp32s:1;
571
      unsigned int disp64:1;
572
      unsigned int acc:1;
573
      unsigned int floatacc:1;
574
      unsigned int baseindex:1;
575
      unsigned int inoutportreg:1;
576
      unsigned int shiftcount:1;
577
      unsigned int jumpabsolute:1;
578
      unsigned int esseg:1;
579
      unsigned int regmem:1;
580
      unsigned int mem:1;
581
      unsigned int byte:1;
582
      unsigned int word:1;
583
      unsigned int dword:1;
584
      unsigned int fword:1;
585
      unsigned int qword:1;
586
      unsigned int tbyte:1;
587
      unsigned int xmmword:1;
588
      unsigned int ymmword:1;
589
      unsigned int unspecified:1;
590
      unsigned int anysize:1;
591
      unsigned int vec_imm4:1;
592
#ifdef OTUnused
593
      unsigned int unused:(OTNumOfBits - OTUnused);
594
#endif
595
    } bitfield;
596
  unsigned int array[OTNumOfUints];
597
} i386_operand_type;
598
 
599
typedef struct insn_template
600
{
601
  /* instruction name sans width suffix ("mov" for movl insns) */
602
  char *name;
603
 
604
  /* how many operands */
605
  unsigned int operands;
606
 
607
  /* base_opcode is the fundamental opcode byte without optional
608
     prefix(es).  */
609
  unsigned int base_opcode;
610
#define Opcode_D        0x2 /* Direction bit:
611
                               set if Reg --> Regmem;
612
                               unset if Regmem --> Reg. */
613
#define Opcode_FloatR   0x8 /* Bit to swap src/dest for float insns. */
614
#define Opcode_FloatD 0x400 /* Direction bit for float insns. */
615
 
616
  /* extension_opcode is the 3 bit extension for group <n> insns.
617
     This field is also used to store the 8-bit opcode suffix for the
618
     AMD 3DNow! instructions.
619
     If this template has no extension opcode (the usual case) use None
620
     Instructions */
621
  unsigned int extension_opcode;
622
#define None 0xffff             /* If no extension_opcode is possible.  */
623
 
624
  /* Opcode length.  */
625
  unsigned char opcode_length;
626
 
627
  /* cpu feature flags */
628
  i386_cpu_flags cpu_flags;
629
 
630
  /* the bits in opcode_modifier are used to generate the final opcode from
631
     the base_opcode.  These bits also are used to detect alternate forms of
632
     the same instruction */
633
  i386_opcode_modifier opcode_modifier;
634
 
635
  /* operand_types[i] describes the type of operand i.  This is made
636
     by OR'ing together all of the possible type masks.  (e.g.
637
     'operand_types[i] = Reg|Imm' specifies that operand i can be
638
     either a register or an immediate operand.  */
639
  i386_operand_type operand_types[MAX_OPERANDS];
640
}
641
insn_template;
642
 
643
extern const insn_template i386_optab[];
644
 
645
/* these are for register name --> number & type hash lookup */
646
typedef struct
647
{
648
  char *reg_name;
649
  i386_operand_type reg_type;
650
  unsigned char reg_flags;
651
#define RegRex      0x1  /* Extended register.  */
652
#define RegRex64    0x2  /* Extended 8 bit register.  */
653
  unsigned char reg_num;
654
#define RegRip  ((unsigned char ) ~0)
655
#define RegEip  (RegRip - 1)
656
/* EIZ and RIZ are fake index registers.  */
657
#define RegEiz  (RegEip - 1)
658
#define RegRiz  (RegEiz - 1)
659
/* FLAT is a fake segment register (Intel mode).  */
660
#define RegFlat     ((unsigned char) ~0)
661
  signed char dw2_regnum[2];
662
#define Dw2Inval (-1)
663
}
664
reg_entry;
665
 
666
/* Entries in i386_regtab.  */
667
#define REGNAM_AL 1
668
#define REGNAM_AX 25
669
#define REGNAM_EAX 41
670
 
671
extern const reg_entry i386_regtab[];
672
extern const unsigned int i386_regtab_size;
673
 
674
typedef struct
675
{
676
  char *seg_name;
677
  unsigned int seg_prefix;
678
}
679
seg_entry;
680
 
681
extern const seg_entry cs;
682
extern const seg_entry ds;
683
extern const seg_entry ss;
684
extern const seg_entry es;
685
extern const seg_entry fs;
686
extern const seg_entry gs;

powered by: WebSVN 2.1.0

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