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 #define OP_ADDI     010
    129 #define OP_ADDIU    011
    130 #define OP_SLTI     012
    131 #define OP_SLTIU    013
    132 #define OP_ANDI     014
    133 #define OP_ORI      015
    134 #define OP_XORI     016
    135 #define OP_LUI      017
    136 
    137 #define OP_COP0     020
    138 #define OP_COP1     021
    139 #define OP_COP2     022
    140 #define OP_COP3     023
    141 #define OP_BEQL     024     /* MIPS-II, for r4000 port */
    142 #define OP_BNEL     025     /* MIPS-II, for r4000 port */
    143 #define OP_BLEZL    026     /* MIPS-II, for r4000 port */
    144 #define OP_BGTZL    027     /* MIPS-II, for r4000 port */
    145 
    146 #define OP_DADDI    030     /* MIPS-II, for r4000 port */
    147 #define OP_DADDIU   031     /* MIPS-II, for r4000 port */
    148 #define OP_LDL      032     /* MIPS-II, for r4000 port */
    149 #define OP_LDR      033     /* MIPS-II, for r4000 port */
    150 
    151 #define OP_SPECIAL2 034     /* QED opcodes */
    152 #define OP_SPECIAL3 037     /* mips32r2 opcodes */
    153 
    154 #define OP_LB       040
    155 #define OP_LH       041
    156 #define OP_LWL      042
    157 #define OP_LW       043
    158 #define OP_LBU      044
    159 #define OP_LHU      045
    160 #define OP_LWR      046
    161 #define OP_LHU      045
    162 #define OP_LWR      046
    163 #define OP_LWU      047     /* MIPS-II, for r4000 port */
    164 
    165 #define OP_SB       050
    166 #define OP_SH       051
    167 #define OP_SWL      052
    168 #define OP_SW       053
    169 #define OP_SDL      054     /* MIPS-II, for r4000 port */
    170 #define OP_SDR      055     /* MIPS-II, for r4000 port */
    171 #define OP_SWR      056
    172 #define OP_CACHE    057     /* MIPS-II, for r4000 port */
    173 
    174 #define OP_LL       060
    175 #define OP_LWC0     OP_LL   /* backwards source compatibility */
    176 #define OP_LWC1     061
    177 #define OP_LWC2     062
    178 #define OP_LWC3     063
    179 #define OP_LLD      064     /* MIPS-II, for r4000 port */
    180 #define OP_LDC1     065
    181 #define OP_LD       067     /* MIPS-II, for r4000 port */
    182 
    183 #define OP_SC       070
    184 #define OP_SWC0     OP_SC   /* backwards source compatibility */
    185 #define OP_SWC1     071
    186 #define OP_SWC2     072
    187 #define OP_SWC3     073
    188 #define OP_SCD      074     /* MIPS-II, for r4000 port */
    189 #define OP_SDC1     075
    190 #define OP_SD       077     /* MIPS-II, for r4000 port */
    191 
    192 /*
    193  * Values for the 'func' field when 'op' == OP_SPECIAL.
    194  */
    195 #define OP_SLL      000
    196 #define OP_SRL      002
    197 #define OP_SRA      003
    198 #define OP_SLLV     004
    199 #define OP_SRLV     006
    200 #define OP_SRAV     007
    201 
    202 #define OP_JR       010
    203 #define OP_JALR     011
    204 #define OP_SYSCALL  014
    205 #define OP_BREAK    015
    206 #define OP_SYNC     017     /* MIPS-II, for r4000 port */
    207 
    208 #define OP_MFHI     020
    209 #define OP_MTHI     021
    210 #define OP_MFLO     022
    211 #define OP_MTLO     023
    212 #define OP_DSLLV    024     /* MIPS-II, for r4000 port */
    213 #define OP_DSRLV    026     /* MIPS-II, for r4000 port */
    214 #define OP_DSRAV    027     /* MIPS-II, for r4000 port */
    215 
    216 #define OP_MULT     030
    217 #define OP_MULTU    031
    218 #define OP_DIV      032
    219 #define OP_DIVU     033
    220 #define OP_DMULT    034     /* MIPS-II, for r4000 port */
    221 #define OP_DMULTU   035     /* MIPS-II, for r4000 port */
    222 #define OP_DDIV     036     /* MIPS-II, for r4000 port */
    223 #define OP_DDIVU    037     /* MIPS-II, for r4000 port */
    224 
    225 #define OP_ADD      040
    226 #define OP_ADDU     041
    227 #define OP_SUB      042
    228 #define OP_SUBU     043
    229 #define OP_AND      044
    230 #define OP_OR       045
    231 #define OP_XOR      046
    232 #define OP_NOR      047
    233 
    234 #define OP_SLT      052
    235 #define OP_SLTU     053
    236 #define OP_DADD     054     /* MIPS-II, for r4000 port */
    237 #define OP_DADDU    055     /* MIPS-II, for r4000 port */
    238 #define OP_DSUB     056     /* MIPS-II, for r4000 port */
    239 #define OP_DSUBU    057     /* MIPS-II, for r4000 port */
    240 
    241 #define OP_TGE      060     /* MIPS-II, for r4000 port */
    242 #define OP_TGEU     061     /* MIPS-II, for r4000 port */
    243 #define OP_TLT      062     /* MIPS-II, for r4000 port */
    244 #define OP_TLTU     063     /* MIPS-II, for r4000 port */
    245 #define OP_TEQ      064     /* MIPS-II, for r4000 port */
    246 #define OP_TNE      066     /* MIPS-II, for r4000 port */
    247 
    248 #define OP_DSLL     070     /* MIPS-II, for r4000 port */
    249 #define OP_DSRL     072     /* MIPS-II, for r4000 port */
    250 #define OP_DSRA     073     /* MIPS-II, for r4000 port */
    251 #define OP_DSLL32   074     /* MIPS-II, for r4000 port */
    252 #define OP_DSRL32   076     /* MIPS-II, for r4000 port */
    253 #define OP_DSRA32   077     /* MIPS-II, for r4000 port */
    254 
    255 /*
    256  * Values for the 'func' field when 'op' == OP_SPECIAL2.
    257  */
    258 #define OP_MAD      000     /* QED */
    259 #define OP_MADU     001     /* QED */
    260 #define OP_MUL      002     /* QED */
    261 
    262 /*
    263  * Values for the 'func' field when 'op' == OP_SPECIAL3.
    264  */
    265 #define OP_EXT      000
    266 #define OP_INS      004
    267 #define OP_BSHFL    040
    268 
    269 /*
    270  * Values for the 'shamt' field when OP_SPECIAL3 && func OP_BSHFL.
    271  */
    272 #define OP_WSBH     002
    273 #define OP_SEB      020
    274 #define OP_SEH      030
    275 
    276 /*
    277  * Values for the 'func' field when 'op' == OP_BCOND.
    278  */
    279 #define OP_BLTZ     000
    280 #define OP_BGEZ     001
    281 #define OP_BLTZL    002     /* MIPS-II, for r4000 port */
    282 #define OP_BGEZL    003     /* MIPS-II, for r4000 port */
    283 
    284 #define OP_TGEI     010     /* MIPS-II, for r4000 port */
    285 #define OP_TGEIU    011     /* MIPS-II, for r4000 port */
    286 #define OP_TLTI     012     /* MIPS-II, for r4000 port */
    287 #define OP_TLTIU    013     /* MIPS-II, for r4000 port */
    288 #define OP_TEQI     014     /* MIPS-II, for r4000 port */
    289 #define OP_TNEI     016     /* MIPS-II, for r4000 port */
    290 
    291 #define OP_BLTZAL   020     /* MIPS-II, for r4000 port */
    292 #define OP_BGEZAL   021
    293 #define OP_BLTZALL  022
    294 #define OP_BGEZALL  023
    295 
    296 /*
    297  * Values for the 'rs' field when 'op' == OP_COPz.
    298  */
    299 #define OP_MF       000
    300 #define OP_DMF      001     /* MIPS-II, for r4000 port */
    301 #define OP_MT       004
    302 #define OP_DMT      005     /* MIPS-II, for r4000 port */
    303 #define OP_BCx      010
    304 #define OP_BCy      014
    305 #define OP_CF       002
    306 #define OP_CT       006
    307 
    308 /*
    309  * Values for the 'rt' field when 'op' == OP_COPz.
    310  */
    311 #define COPz_BC_TF_MASK 0x01
    312 #define COPz_BC_TRUE    0x01
    313 #define COPz_BC_FALSE   0x00
    314 #define COPz_BCL_TF_MASK    0x02        /* MIPS-II, for r4000 port */
    315 #define COPz_BCL_TRUE   0x02        /* MIPS-II, for r4000 port */
    316 #define COPz_BCL_FALSE  0x00        /* MIPS-II, for r4000 port */
    317