Home | History | Annotate | Download | only in codeflinger
      1 /*  $NetBSD: mips_opcode.h,v 1.12 2005/12/11 12:18:09 christos Exp $    */
      2 
      3 /*-
      4  * Copyright (c) 1992, 1993
      5  *  The Regents of the University of California.  All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * Ralph Campbell.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. Neither the name of the University nor the names of its contributors
     19  *    may be used to endorse or promote products derived from this software
     20  *    without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32  * SUCH DAMAGE.
     33  *
     34  *  @(#)mips_opcode.h   8.1 (Berkeley) 6/10/93
     35  */
     36 
     37 /*
     38  * Define the instruction formats and opcode values for the
     39  * MIPS instruction set.
     40  */
     41 
     42 #include <endian.h>
     43 
     44 /*
     45  * Define the instruction formats.
     46  */
     47 typedef union {
     48     unsigned word;
     49 
     50 #if BYTE_ORDER == LITTLE_ENDIAN
     51     struct {
     52         unsigned imm: 16;
     53         unsigned rt: 5;
     54         unsigned rs: 5;
     55         unsigned op: 6;
     56     } IType;
     57 
     58     struct {
     59         unsigned target: 26;
     60         unsigned op: 6;
     61     } JType;
     62 
     63     struct {
     64         unsigned func: 6;
     65         unsigned shamt: 5;
     66         unsigned rd: 5;
     67         unsigned rt: 5;
     68         unsigned rs: 5;
     69         unsigned op: 6;
     70     } RType;
     71 
     72     struct {
     73         unsigned func: 6;
     74         unsigned fd: 5;
     75         unsigned fs: 5;
     76         unsigned ft: 5;
     77         unsigned fmt: 4;
     78         unsigned : 1;       /* always '1' */
     79         unsigned op: 6;     /* always '0x11' */
     80     } FRType;
     81 #endif
     82 #if BYTE_ORDER == BIG_ENDIAN
     83     struct {
     84         unsigned op: 6;
     85         unsigned rs: 5;
     86         unsigned rt: 5;
     87         unsigned imm: 16;
     88     } IType;
     89 
     90     struct {
     91         unsigned op: 6;
     92         unsigned target: 26;
     93     } JType;
     94 
     95     struct {
     96         unsigned op: 6;
     97         unsigned rs: 5;
     98         unsigned rt: 5;
     99         unsigned rd: 5;
    100         unsigned shamt: 5;
    101         unsigned func: 6;
    102     } RType;
    103 
    104     struct {
    105         unsigned op: 6;     /* always '0x11' */
    106         unsigned : 1;       /* always '1' */
    107         unsigned fmt: 4;
    108         unsigned ft: 5;
    109         unsigned fs: 5;
    110         unsigned fd: 5;
    111         unsigned func: 6;
    112     } FRType;
    113 #endif
    114 } InstFmt;
    115 
    116 /*
    117  * Values for the 'op' field.
    118  */
    119 #define OP_SPECIAL  000
    120 #define OP_BCOND    001
    121 #define OP_J        002
    122 #define OP_JAL      003
    123 #define OP_BEQ      004
    124 #define OP_BNE      005
    125 #define OP_BLEZ     006
    126 #define OP_BGTZ     007
    127 
    128 #if __mips_isa_rev < 6
    129 #define OP_ADDI     010
    130 #else
    131 #define OP_POP10    010
    132 #endif
    133 
    134 #define OP_ADDIU    011
    135 #define OP_SLTI     012
    136 #define OP_SLTIU    013
    137 #define OP_ANDI     014
    138 #define OP_ORI      015
    139 #define OP_XORI     016
    140 
    141 #if __mips_isa_rev < 6
    142 #define OP_LUI      017
    143 #else
    144 #define OP_AUI      017
    145 #endif
    146 
    147 #define OP_COP0     020
    148 #define OP_COP1     021
    149 #define OP_COP2     022
    150 
    151 #if __mips_isa_rev < 6
    152 #define OP_COP3     023
    153 #define OP_BEQL     024
    154 #define OP_BNEL     025
    155 #define OP_BLEZL    026
    156 #define OP_BGTZL    027
    157 #define OP_DADDI    030
    158 #else
    159 #define OP_POP26    026
    160 #define OP_POP27    027
    161 #define OP_POP30    030
    162 #endif
    163 
    164 #define OP_DADDIU   031
    165 
    166 #if __mips_isa_rev < 6
    167 #define OP_LDL      032
    168 #define OP_LDR      033
    169 #define OP_SPECIAL2 034
    170 #else
    171 #define OP_DAUI     035
    172 #endif
    173 
    174 #define OP_SPECIAL3 037
    175 
    176 #define OP_LB       040
    177 #define OP_LH       041
    178 
    179 #if __mips_isa_rev < 6
    180 #define OP_LWL      042
    181 #endif
    182 
    183 #define OP_LW       043
    184 #define OP_LBU      044
    185 #define OP_LHU      045
    186 #define OP_LWR      046
    187 #define OP_LHU      045
    188 
    189 #if __mips_isa_rev < 6
    190 #define OP_LWR      046
    191 #endif
    192 
    193 #define OP_LWU      047
    194 
    195 #define OP_SB       050
    196 #define OP_SH       051
    197 
    198 #if __mips_isa_rev < 6
    199 #define OP_SWL      052
    200 #endif
    201 
    202 #define OP_SW       053
    203 
    204 #if __mips_isa_rev < 6
    205 #define OP_SDL      054
    206 #define OP_SDR      055
    207 #define OP_SWR      056
    208 #define OP_CACHE    057
    209 #define OP_LL       060
    210 #define OP_LWC0     OP_LL
    211 #define OP_LWC1     061
    212 #define OP_LWC2     062
    213 #define OP_LWC3     063
    214 #define OP_LLD      064
    215 #else
    216 #define OP_LWC1     061
    217 #define OP_BC       062
    218 #endif
    219 
    220 #define OP_LDC1     065
    221 #define OP_LD       067
    222 
    223 #if __mips_isa_rev < 6
    224 #define OP_SC       070
    225 #define OP_SWC0     OP_SC
    226 #endif
    227 
    228 #define OP_SWC1     071
    229 
    230 #if __mips_isa_rev < 6
    231 #define OP_SWC2     072
    232 #define OP_SWC3     073
    233 #define OP_SCD      074
    234 #else
    235 #define OP_BALC     072
    236 #endif
    237 
    238 #define OP_SDC1     075
    239 #define OP_SD       077
    240 
    241 /*
    242  * Values for the 'func' field when 'op' == OP_SPECIAL.
    243  */
    244 #define OP_SLL      000
    245 #define OP_SRL      002
    246 #define OP_SRA      003
    247 #define OP_SLLV     004
    248 #define OP_SRLV     006
    249 #define OP_SRAV     007
    250 
    251 #if __mips_isa_rev < 6
    252 #define OP_JR       010
    253 #endif
    254 
    255 #define OP_JALR     011
    256 #define OP_SYSCALL  014
    257 #define OP_BREAK    015
    258 #define OP_SYNC     017
    259 
    260 #if __mips_isa_rev < 6
    261 #define OP_MFHI     020
    262 #define OP_MTHI     021
    263 #define OP_MFLO     022
    264 #define OP_MTLO     023
    265 #else
    266 #define OP_CLZ      020
    267 #define OP_CLO      021
    268 #define OP_DCLZ     022
    269 #define OP_DCLO     023
    270 #endif
    271 
    272 #define OP_DSLLV    024
    273 #define OP_DSRLV    026
    274 #define OP_DSRAV    027
    275 
    276 #if __mips_isa_rev < 6
    277 #define OP_MULT     030
    278 #define OP_MULTU    031
    279 #define OP_DIV      032
    280 #define OP_DIVU     033
    281 #define OP_DMULT    034
    282 #define OP_DMULTU   035
    283 #define OP_DDIV     036
    284 #define OP_DDIVU    037
    285 #else
    286 #define OP_SOP30    030
    287 #define OP_SOP31    031
    288 #define OP_SOP32    032
    289 #define OP_SOP33    033
    290 #define OP_SOP34    034
    291 #define OP_SOP35    035
    292 #define OP_SOP36    036
    293 #define OP_SOP37    037
    294 #endif
    295 
    296 #define OP_ADD      040
    297 #define OP_ADDU     041
    298 #define OP_SUB      042
    299 #define OP_SUBU     043
    300 #define OP_AND      044
    301 #define OP_OR       045
    302 #define OP_XOR      046
    303 #define OP_NOR      047
    304 
    305 #define OP_SLT      052
    306 #define OP_SLTU     053
    307 #define OP_DADD     054
    308 #define OP_DADDU    055
    309 #define OP_DSUB     056
    310 #define OP_DSUBU    057
    311 
    312 #define OP_TGE      060
    313 #define OP_TGEU     061
    314 #define OP_TLT      062
    315 #define OP_TLTU     063
    316 #define OP_TEQ      064
    317 #define OP_TNE      066
    318 
    319 #define OP_DSLL     070
    320 #define OP_DSRL     072
    321 #define OP_DSRA     073
    322 #define OP_DSLL32   074
    323 #define OP_DSRL32   076
    324 #define OP_DSRA32   077
    325 
    326 #if __mips_isa_rev < 6
    327 /*
    328  * Values for the 'func' field when 'op' == OP_SPECIAL2.
    329  * OP_SPECIAL2 opcodes are removed in mips32r6
    330  */
    331 #define OP_MAD      000     /* QED */
    332 #define OP_MADU     001     /* QED */
    333 #define OP_MUL      002     /* QED */
    334 #endif
    335 
    336 /*
    337  * Values for the 'func' field when 'op' == OP_SPECIAL3.
    338  */
    339 #define OP_EXT      000
    340 #define OP_DEXTM    001
    341 #define OP_DEXTU    002
    342 #define OP_DEXT     003
    343 #define OP_INS      004
    344 #define OP_DINSM    005
    345 #define OP_DINSU    006
    346 #define OP_DINS     007
    347 #define OP_BSHFL    040
    348 #define OP_RDHWR    073
    349 
    350 /*
    351  * Values for the 'shamt' field when OP_SPECIAL3 && func OP_BSHFL.
    352  */
    353 
    354 #define OP_WSBH     002
    355 #define OP_SEB      020
    356 #define OP_SEH      030
    357 
    358 #if __mips_isa_rev == 6
    359 /*
    360  * Values for the 'shamt' field when OP_SOP30.
    361  */
    362 #define OP_MUL      002
    363 #define OP_MUH      003
    364 #endif
    365 
    366 /*
    367  * Values for the 'func' field when 'op' == OP_BCOND.
    368  */
    369 #define OP_BLTZ     000
    370 #define OP_BGEZ     001
    371 
    372 #if __mips_isa_rev < 6
    373 #define OP_BLTZL    002
    374 #define OP_BGEZL    003
    375 #define OP_TGEI     010
    376 #define OP_TGEIU    011
    377 #define OP_TLTI     012
    378 #define OP_TLTIU    013
    379 #define OP_TEQI     014
    380 #define OP_TNEI     016
    381 #define OP_BLTZAL   020
    382 #define OP_BGEZAL   021
    383 #define OP_BLTZALL  022
    384 #define OP_BGEZALL  023
    385 #else
    386 #define OP_NAL      020
    387 #define OP_BAL      021
    388 #endif
    389 
    390 /*
    391  * Values for the 'rs' field when 'op' == OP_COPz.
    392  */
    393 #define OP_MF       000
    394 #define OP_DMF      001
    395 #define OP_MT       004
    396 #define OP_DMT      005
    397 #define OP_BCx      010
    398 #define OP_BCy      014
    399 #define OP_CF       002
    400 #define OP_CT       006
    401 
    402 /*
    403  * Values for the 'rt' field when 'op' == OP_COPz.
    404  */
    405 #define COPz_BC_TF_MASK 0x01
    406 #define COPz_BC_TRUE    0x01
    407 #define COPz_BC_FALSE   0x00
    408 #define COPz_BCL_TF_MASK    0x02
    409 #define COPz_BCL_TRUE   0x02
    410 #define COPz_BCL_FALSE  0x00
    411