Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Table of opcodes for the DLX microprocess.
  2.    Copyright 2002, 2010 Free Software Foundation, Inc.
  3.  
  4.    This file is part of GDB and GAS.
  5.  
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 3 of the License, or
  9.    (at your option) any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software
  18.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  19.    MA 02110-1301, USA.
  20.  
  21.    Initially created by Kuang Hwa Lin, 2002.   */
  22.  
  23. /* Following are the function codes for the Special OP (ALU).  */
  24. #define  ALUOP       0x00000000
  25. #define  SPECIALOP   0x00000000
  26.  
  27. #define  NOPF        0x00000000
  28. #define  SLLF        0x00000004
  29. #define  SRLF        0x00000006
  30. #define  SRAF        0x00000007
  31.  
  32. #define  SEQUF       0x00000010
  33. #define  SNEUF       0x00000011
  34. #define  SLTUF       0x00000012
  35. #define  SGTUF       0x00000013
  36. #define  SLEUF       0x00000014
  37. #define  SGEUF       0x00000015
  38.  
  39. #define  ADDF        0x00000020
  40. #define  ADDUF       0x00000021
  41. #define  SUBF        0x00000022
  42. #define  SUBUF       0x00000023
  43. #define  ANDF        0x00000024
  44. #define  ORF         0x00000025
  45. #define  XORF        0x00000026
  46.  
  47. #define  SEQF        0x00000028
  48. #define  SNEF        0x00000029
  49. #define  SLTF        0x0000002A
  50. #define  SGTF        0x0000002B
  51. #define  SLEF        0x0000002C
  52. #define  SGEF        0x0000002D
  53.   /* Following special functions was not mentioned in the
  54.      Hennessy's book but was implemented in the RTL.  */
  55. #define  MVTSF       0x00000030
  56. #define  MVFSF       0x00000031
  57. #define  BSWAPF      0x00000032
  58. #define  LUTF        0x00000033
  59. /* Following special functions was mentioned in the
  60.    Hennessy's book but was not implemented in the RTL.  */
  61. #define  MULTF       0x00000005
  62. #define  MULTUF      0x00000006
  63. #define  DIVF        0x00000007
  64. #define  DIVUF       0x00000008
  65.  
  66.  
  67. /* Following are the rest of the OPcodes:
  68.    JOP    = (0x002 << 26), JALOP  = (0x003 << 26), BEQOP = (0x004 << 26),   BNEOP  = (0x005 << 26)
  69.    ADDIOP = (0x008 << 26), ADDUIOP= (0x009 << 26), SUBIOP       = (0x00A << 26), SUBUIOP= (0x00B << 26)
  70.    ANDIOP = (0x00C << 26), ORIOP  = (0x00D << 26), XORIOP = (0x00E << 26),  LHIOP  = (0x00F << 26)
  71.    RFEOP  = (0x010 << 26), TRAPOP = (0x011 << 26), JROP = (0x012 << 26), JALROP = (0x013 << 26)
  72.    BREAKOP= (0x014 << 26)
  73.    SEQIOP = (0x018 << 26), SNEIOP = (0x019 << 26), SLTIOP = (0x01A << 26),  SGTIOP = (0x01B << 26)
  74.    SLEIOP = (0x01C << 26), SGEIOP = (0x01D << 26)
  75.    LBOP   = (0x020 << 26), LHOP   = (0x021 << 26), LWOP   = (0x023 << 26),  LBUOP  = (0x024 << 26)
  76.    LHUOP  = (0x025 << 26), SBOP   = (0x028 << 26), SHOP   = (0x029 << 26),  SWOP   = (0x02B << 26)
  77.    LSBUOP = (0x026 << 26), LSHU   = (0x027 << 26), LSW    = (0x02C << 26),
  78.    SEQUIOP= (0x030 << 26), SNEUIOP= (0x031 << 26), SLTUIOP= (0x032 << 26),  SGTUIOP= (0x033 << 26)
  79.    SLEUIOP= (0x034 << 26), SGEUIOP= (0x035 << 26)
  80.    SLLIOP = (0x036 << 26), SRLIOP = (0x037 << 26), SRAIOP = (0x038 << 26).  */
  81. #define  JOP         0x08000000
  82. #define  JALOP       0x0c000000
  83. #define  BEQOP       0x10000000
  84. #define  BNEOP       0x14000000
  85.  
  86. #define  ADDIOP      0x20000000
  87. #define  ADDUIOP     0x24000000
  88. #define  SUBIOP      0x28000000
  89. #define  SUBUIOP     0x2c000000
  90. #define  ANDIOP      0x30000000
  91. #define  ORIOP       0x34000000
  92. #define  XORIOP      0x38000000
  93. #define  LHIOP       0x3c000000
  94. #define  RFEOP       0x40000000
  95. #define  TRAPOP      0x44000000
  96. #define  JROP        0x48000000
  97. #define  JALROP      0x4c000000
  98. #define  BREAKOP     0x50000000
  99.  
  100. #define  SEQIOP      0x60000000
  101. #define  SNEIOP      0x64000000
  102. #define  SLTIOP      0x68000000
  103. #define  SGTIOP      0x6c000000
  104. #define  SLEIOP      0x70000000
  105. #define  SGEIOP      0x74000000
  106.  
  107. #define  LBOP        0x80000000
  108. #define  LHOP        0x84000000
  109. #define  LWOP        0x8c000000
  110. #define  LBUOP       0x90000000
  111. #define  LHUOP       0x94000000
  112. #define  LDSTBU
  113. #define  LDSTHU
  114. #define  SBOP        0xa0000000
  115. #define  SHOP        0xa4000000
  116. #define  SWOP        0xac000000
  117. #define  LDST
  118.  
  119. #define  SEQUIOP     0xc0000000
  120. #define  SNEUIOP     0xc4000000
  121. #define  SLTUIOP     0xc8000000
  122. #define  SGTUIOP     0xcc000000
  123. #define  SLEUIOP     0xd0000000
  124. #define  SGEUIOP     0xd4000000
  125.  
  126. #define  SLLIOP      0xd8000000
  127. #define  SRLIOP      0xdc000000
  128. #define  SRAIOP      0xe0000000
  129.  
  130. /* Following 3 ops was added to provide the MP atonmic operation.  */
  131. #define  LSBUOP      0x98000000
  132. #define  LSHUOP      0x9c000000
  133. #define  LSWOP       0xb0000000
  134.  
  135. /* Following opcode was defined in the Hennessy's book as
  136.    "normal" opcode but was implemented in the RTL as special
  137.    functions.  */
  138. #if 0
  139. #define  MVTSOP      0x50000000
  140. #define  MVFSOP      0x54000000
  141. #endif
  142.  
  143. struct dlx_opcode
  144. {
  145.   /* Name of the instruction.  */
  146.   char *name;
  147.  
  148.   /* Opcode word.  */
  149.   unsigned long opcode;
  150.  
  151.   /* A string of characters which describe the operands.
  152.      Valid characters are:
  153.      ,        Itself.  The character appears in the assembly code.
  154.      a        rs1      The register number is in bits 21-25 of the instruction.
  155.      b        rs2/rd   The register number is in bits 16-20 of the instruction.
  156.      c        rd.      The register number is in bits 11-15 of the instruction.
  157.      f        FUNC bits 0-10 of the instruction.
  158.      i        An immediate operand is in bits 0-16 of the instruction. 0 extended
  159.      I        An immediate operand is in bits 0-16 of the instruction. sign extended
  160.      d        An 16 bit PC relative displacement.
  161.      D        An immediate operand is in bits 0-25 of the instruction.
  162.      N        No opperands needed, for nops.
  163.      P        it can be a register or a 16 bit operand.  */
  164.   char *args;
  165. };
  166.  
  167. static const struct dlx_opcode dlx_opcodes[] =
  168.   {
  169.   /* Arithmetic and Logic R-TYPE instructions.  */
  170.     { "nop",      (ALUOP|NOPF),   "N"     },  /* NOP                          */
  171.     { "add",      (ALUOP|ADDF),   "c,a,b" },  /* Add                          */
  172.     { "addu",     (ALUOP|ADDUF),  "c,a,b" },  /* Add Unsigned                 */
  173.     { "sub",      (ALUOP|SUBF),   "c,a,b" },  /* SUB                          */
  174.     { "subu",     (ALUOP|SUBUF),  "c,a,b" },  /* Sub Unsigned                 */
  175.     { "mult",     (ALUOP|MULTF),  "c,a,b" },  /* MULTIPLY                     */
  176.     { "multu",    (ALUOP|MULTUF), "c,a,b" },  /* MULTIPLY Unsigned            */
  177.     { "div",      (ALUOP|DIVF),   "c,a,b" },  /* DIVIDE                       */
  178.     { "divu",     (ALUOP|DIVUF),  "c,a,b" },  /* DIVIDE Unsigned              */
  179.     { "and",      (ALUOP|ANDF),   "c,a,b" },  /* AND                          */
  180.     { "or",       (ALUOP|ORF),    "c,a,b" },  /* OR                           */
  181.     { "xor",      (ALUOP|XORF),   "c,a,b" },  /* Exclusive OR                 */
  182.     { "sll",      (ALUOP|SLLF),   "c,a,b" },  /* SHIFT LEFT LOGICAL           */
  183.     { "sra",      (ALUOP|SRAF),   "c,a,b" },  /* SHIFT RIGHT ARITHMETIC       */
  184.     { "srl",      (ALUOP|SRLF),   "c,a,b" },  /* SHIFT RIGHT LOGICAL          */
  185.     { "seq",      (ALUOP|SEQF),   "c,a,b" },  /* Set if equal                 */
  186.     { "sne",      (ALUOP|SNEF),   "c,a,b" },  /* Set if not equal             */
  187.     { "slt",      (ALUOP|SLTF),   "c,a,b" },  /* Set if less                  */
  188.     { "sgt",      (ALUOP|SGTF),   "c,a,b" },  /* Set if greater               */
  189.     { "sle",      (ALUOP|SLEF),   "c,a,b" },  /* Set if less or equal         */
  190.     { "sge",      (ALUOP|SGEF),   "c,a,b" },  /* Set if greater or equal      */
  191.     { "sequ",     (ALUOP|SEQUF),  "c,a,b" },  /* Set if equal unsigned        */
  192.     { "sneu",     (ALUOP|SNEUF),  "c,a,b" },  /* Set if not equal unsigned    */
  193.     { "sltu",     (ALUOP|SLTUF),  "c,a,b" },  /* Set if less unsigned         */
  194.     { "sgtu",     (ALUOP|SGTUF),  "c,a,b" },  /* Set if greater unsigned      */
  195.     { "sleu",     (ALUOP|SLEUF),  "c,a,b" },  /* Set if less or equal unsigned*/
  196.     { "sgeu",     (ALUOP|SGEUF),  "c,a,b" },  /* Set if greater or equal      */
  197.     { "mvts",     (ALUOP|MVTSF),  "c,a"   },  /* Move to special register     */
  198.     { "mvfs",     (ALUOP|MVFSF),  "c,a"   },  /* Move from special register   */
  199.     { "bswap",    (ALUOP|BSWAPF), "c,a,b" },  /* ??? Was not documented       */
  200.     { "lut",      (ALUOP|LUTF),   "c,a,b" },  /* ????? same as above          */
  201.  
  202.     /* Arithmetic and Logical Immediate I-TYPE instructions.  */
  203.     { "addi",     ADDIOP,         "b,a,I" },  /* Add Immediate                */
  204.     { "addui",    ADDUIOP,        "b,a,i" },  /* Add Usigned Immediate        */
  205.     { "subi",     SUBIOP,         "b,a,I" },  /* Sub Immediate                */
  206.     { "subui",    SUBUIOP,        "b,a,i" },  /* Sub Unsigned Immedated       */
  207.     { "andi",     ANDIOP,         "b,a,i" },  /* AND Immediate                */
  208.     { "ori",      ORIOP,          "b,a,i" },  /* OR  Immediate                */
  209.     { "xori",     XORIOP,         "b,a,i" },  /* Exclusive OR  Immediate      */
  210.     { "slli",     SLLIOP,         "b,a,i" },  /* SHIFT LEFT LOCICAL Immediate */
  211.     { "srai",     SRAIOP,         "b,a,i" },  /* SHIFT RIGHT ARITH. Immediate */
  212.     { "srli",     SRLIOP,         "b,a,i" },  /* SHIFT RIGHT LOGICAL Immediate*/
  213.     { "seqi",     SEQIOP,         "b,a,i" },  /* Set if equal                 */
  214.     { "snei",     SNEIOP,         "b,a,i" },  /* Set if not equal             */
  215.     { "slti",     SLTIOP,         "b,a,i" },  /* Set if less                  */
  216.     { "sgti",     SGTIOP,         "b,a,i" },  /* Set if greater               */
  217.     { "slei",     SLEIOP,         "b,a,i" },  /* Set if less or equal         */
  218.     { "sgei",     SGEIOP,         "b,a,i" },  /* Set if greater or equal      */
  219.     { "sequi",    SEQUIOP,        "b,a,i" },  /* Set if equal                 */
  220.     { "sneui",    SNEUIOP,        "b,a,i" },  /* Set if not equal             */
  221.     { "sltui",    SLTUIOP,        "b,a,i" },  /* Set if less                  */
  222.     { "sgtui",    SGTUIOP,        "b,a,i" },  /* Set if greater               */
  223.     { "sleui",    SLEUIOP,        "b,a,i" },  /* Set if less or equal         */
  224.     { "sgeui",    SGEUIOP,        "b,a,i" },  /* Set if greater or equal      */
  225.     /* Macros for I type instructions.  */
  226.     { "mov",      ADDIOP,         "b,P"   },  /* a move macro                 */
  227.     { "movu",     ADDUIOP,        "b,P"   },  /* a move macro, unsigned       */
  228.  
  229. #if 0
  230.     /* Move special.  */
  231.     { "mvts",     MVTSOP,         "b,a"   },  /* Move From Integer to Special */
  232.     { "mvfs",     MVFSOP,         "b,a"   },  /* Move From Special to Integer */
  233. #endif
  234.  
  235.     /* Load high Immediate I-TYPE instruction.  */
  236.     { "lhi",      LHIOP,          "b,i"   },  /* Load High Immediate          */
  237.     { "lui",      LHIOP,          "b,i"   },  /* Load High Immediate          */
  238.     { "sethi",    LHIOP,          "b,i"   },  /* Load High Immediate          */
  239.  
  240.   /* LOAD/STORE BYTE 8 bits I-TYPE.  */
  241.     { "lb",       LBOP,           "b,a,I" },  /* Load Byte                    */
  242.     { "lbu",      LBUOP,          "b,a,I" },  /* Load Byte Unsigned           */
  243.     { "ldstbu",   LSBUOP,         "b,a,I" },  /* Load store Byte Unsigned     */
  244.     { "sb",       SBOP,           "b,a,I" },  /* Store Byte                   */
  245.  
  246.     /* LOAD/STORE HALFWORD 16 bits.  */
  247.     { "lh",       LHOP,           "b,a,I" },  /* Load Halfword                */
  248.     { "lhu",      LHUOP,          "b,a,I" },  /* Load Halfword Unsigned       */
  249.     { "ldsthu",   LSHUOP,         "b,a,I" },  /* Load Store Halfword Unsigned */
  250.     { "sh",       SHOP,           "b,a,I" },  /* Store Halfword               */
  251.  
  252.   /* LOAD/STORE WORD 32 bits.  */
  253.     { "lw",       LWOP,           "b,a,I" },  /* Load Word                    */
  254.     { "sw",       SWOP,           "b,a,I" },  /* Store Word                   */
  255.     { "ldstw",    LSWOP,          "b,a,I" },  /* Load Store Word              */
  256.  
  257.   /* Branch PC-relative, 16 bits offset.  */
  258.     { "beqz",     BEQOP,          "a,d" },    /* Branch if a == 0             */
  259.     { "bnez",     BNEOP,          "a,d" },    /* Branch if a != 0             */
  260.     { "beq",      BEQOP,          "a,d" },    /* Branch if a == 0             */
  261.     { "bne",      BNEOP,          "a,d" },    /* Branch if a != 0             */
  262.  
  263.     /* Jumps Trap and RFE J-TYPE.  */
  264.     { "j",        JOP,            "D" },      /* Jump, PC-relative 26 bits    */
  265.     { "jal",      JALOP,          "D" },      /* JAL, PC-relative 26 bits     */
  266.     { "break",    BREAKOP,        "D" },      /* break to OS                  */
  267.     { "trap" ,    TRAPOP,         "D" },      /* TRAP to OS                   */
  268.     { "rfe",      RFEOP,          "N" },      /* Return From Exception        */
  269.     /* Macros.  */
  270.     { "call",     JOP,            "D" },      /* Jump, PC-relative 26 bits    */
  271.  
  272.     /* Jumps Trap and RFE I-TYPE.  */
  273.     { "jr",       JROP,           "a" },      /* Jump Register, Abs (32 bits) */
  274.     { "jalr",     JALROP,         "a" },      /* JALR, Abs (32 bits)          */
  275.     /* Macros.  */
  276.     { "retr",     JROP,           "a" },      /* Jump Register, Abs (32 bits) */
  277.  
  278.     { "", 0x0, "" }             /* Dummy entry, not included in NUM_OPCODES.
  279.                                    This lets code examine entry i + 1 without
  280.                                    checking if we've run off the end of the table.  */
  281.   };
  282.  
  283. const unsigned int num_dlx_opcodes = (((sizeof dlx_opcodes) / (sizeof dlx_opcodes[0])) - 1);
  284.