| 1 | /*
|
---|
| 2 | * File: MOperator.h
|
---|
| 3 | * Author: rick
|
---|
| 4 | *
|
---|
| 5 | * Created on November 19, 2008, 1:24 AM
|
---|
| 6 | */
|
---|
| 7 |
|
---|
| 8 | #ifndef _MOPERATOR_H
|
---|
| 9 | #define _MOPERATOR_H
|
---|
| 10 |
|
---|
| 11 | /* Needs including all available instruction types */
|
---|
| 12 | typedef enum __moperator {
|
---|
| 13 | /* ASM directives */
|
---|
| 14 | MOP_ENT,
|
---|
| 15 | MOP_END,
|
---|
| 16 | MOP_ALIGN,
|
---|
| 17 | MOP_ASCII,
|
---|
| 18 | MOP_ASCIIZ,
|
---|
| 19 | MOP_BYTE,
|
---|
| 20 | MOP_DATA,
|
---|
| 21 | MOP_DOUBLE,
|
---|
| 22 | MOP_EXTERN,
|
---|
| 23 | MOP_FLOAT,
|
---|
| 24 | MOP_GLOBL,
|
---|
| 25 | MOP_HALF,
|
---|
| 26 | MOP_KDATA,
|
---|
| 27 | MOP_KTEXT,
|
---|
| 28 | MOP_SPACE,
|
---|
| 29 | MOP_TEXT,
|
---|
| 30 | MOP_WORD,
|
---|
| 31 |
|
---|
| 32 | /* Arithmetic operators */
|
---|
| 33 |
|
---|
| 34 | /* Absolute value - abs Rdest, Rsrc
|
---|
| 35 | Put the absolute value of the integer from register Rsrc in register Rdest. */
|
---|
| 36 | MOP_ABS,
|
---|
| 37 | /* Addition with overflow - add Rdest, Rsrc1, Src2
|
---|
| 38 | Addition Immediate with overflow - addi Rdest, Rsrc1, Imm
|
---|
| 39 | Addition with overflow - add Rdest, Rsrc1, Src2
|
---|
| 40 | Addition Immediate without overflow - addi Rdest, Rsrc1, Imm
|
---|
| 41 | Put the sum of the integers from register Rscr1 and Src2 (or Imm) into register Rdest. */
|
---|
| 42 | MOP_ADD,
|
---|
| 43 | MOP_ADDI,
|
---|
| 44 | MOP_ADDU,
|
---|
| 45 | MOP_ADDIU,
|
---|
| 46 | /* and - and Rdest, Rsrc1, Src2
|
---|
| 47 | and immediate - andi Rdest, Rsrc1, Imm
|
---|
| 48 | Put the logical AND of the integers from register Rscr1and Sr2( or Imm) into register Rdest. */
|
---|
| 49 | MOP_AND,
|
---|
| 50 | MOP_ANDI,
|
---|
| 51 | /* Divide signed - div Rsrc1, Rscr2
|
---|
| 52 | Divide unsigned - divu Rscr1, Rscr2
|
---|
| 53 | Divide the contents of the two registers. Leave quotient in register lo and the remainder in register hi. */
|
---|
| 54 | MOP_DIV2,
|
---|
| 55 | MOP_DIV2U,
|
---|
| 56 | /* Divide signed - div Rdest, Rsrc1, Rscr2
|
---|
| 57 | Divide unsigned - divu Rdest, Rscr1, Rscr2
|
---|
| 58 | Divide the contents of the two registers. Leave quotient in register Rdest. */
|
---|
| 59 | MOP_DIV,
|
---|
| 60 | MOP_DIVU,
|
---|
| 61 | /* Multiply without overflow - mul Rdest, Rsrc1, Rsrc2
|
---|
| 62 | Multiply with overflow - mulo Rdest, Rsrc1, Rsrc2
|
---|
| 63 | Unsigned multiply with overflow - mulou Rdest, Rsrc1, Rsrc2
|
---|
| 64 | Put the product of the integers from register Rscr1 and Rscr2 into register Rdest. */
|
---|
| 65 | MOP_MUL,
|
---|
| 66 | MOP_MULO,
|
---|
| 67 | MOP_MULOU,
|
---|
| 68 | /* Multiply - mult Rsrc1, Rsrc2
|
---|
| 69 | Unsigned multiply - multu Rsrc1, Rsrc2
|
---|
| 70 | Multiply the contents of the two registers. Leave the low-order word of the product in register lo an the high-word in register hi. */
|
---|
| 71 | MOP_MULT,
|
---|
| 72 | MOP_MULTU,
|
---|
| 73 | /* Negate value with overflow - neg Rdest, Rsrc
|
---|
| 74 | Negate value without overflow - negu Rdest, Rsrc
|
---|
| 75 | Put the negative of the integer from register Rsrc into Rdest. */
|
---|
| 76 | MOP_NEG,
|
---|
| 77 | MOP_NEGU,
|
---|
| 78 | /* NOR - nor Rdest, Rsrc1, Rsrc2
|
---|
| 79 | Put the logical NOR of the integers from register Rsrc1 and Rscr2 into register Rdes. */
|
---|
| 80 | MOP_NOR,
|
---|
| 81 | /* NOT - not Rdest, Rsrc
|
---|
| 82 | Put the bitwise logical negation of the integer from register Rscr into register Rdest. */
|
---|
| 83 | MOP_NOT,
|
---|
| 84 | /* OR - or Rdest, Rsrc1, Rsrc2
|
---|
| 85 | OR Immediate - ori Rdest, Rsrc1, Imm
|
---|
| 86 | Put the logical OR of the integer from registe rRsrc1 and Rsrc2(or Imm) into register Rdest. */
|
---|
| 87 | MOP_OR,
|
---|
| 88 | MOP_ORI,
|
---|
| 89 | /* Remainder - rem Rdest, Rsrc1, Rsrc2
|
---|
| 90 | Unsigned remainder - remu Rdest, Rsrc1, Rsrc2
|
---|
| 91 | Put the remainder from dividing Rsrc1 with the integer Rsrc2 into Rdest.
|
---|
| 92 | If an operand is negative the remainder is unspecified. */
|
---|
| 93 | MOP_REM,
|
---|
| 94 | MOP_REMU,
|
---|
| 95 | /* Rotate left - rol Rdest, Rscr1, Src2
|
---|
| 96 | Rotate right - ror Rdest, Rsrc1, Src2
|
---|
| 97 | Rotate the contents of register Rsrc by the distance indicated by Src2 and store in Rdest. */
|
---|
| 98 | MOP_ROL,
|
---|
| 99 | MOP_ROR,
|
---|
| 100 | /* Shift left logical - sll Rdest, Rsrc1, Src2
|
---|
| 101 | Shift left logical variable - sllv Rdest, Rsrc1, Rsrc2
|
---|
| 102 | Shift right arithmetic - sra Rdest, Rsrc1, src2
|
---|
| 103 | Shift right logical - srl Rdest, Rsrc1, src2
|
---|
| 104 | Shift right variable - srlv Rdest, Rsrc1, Rsrc2
|
---|
| 105 | Shift the contents of Rsrc1 by the distance in Src2 and put the result in Rdest. */
|
---|
| 106 | MOP_SLL,
|
---|
| 107 | MOP_SLLV,
|
---|
| 108 | MOP_SRA,
|
---|
| 109 | MOP_SRL,
|
---|
| 110 | MOP_SRLV,
|
---|
| 111 | /* Subtract with overflow - sub Rdest Rsrc, Src2
|
---|
| 112 | Subtract without overflow - subu Rdest, Rsrc, Src2
|
---|
| 113 | Put the difference of the integers from register Rssrc1 and Src2 into Rdest */
|
---|
| 114 | MOP_SUB,
|
---|
| 115 | MOP_SUBU,
|
---|
| 116 | /* XOR - xor Rdest, Rsrc1, Src2
|
---|
| 117 | XOR immediate - xori Rdest, Rsrc1, Imm
|
---|
| 118 | Put the logiacal xor of the integer from register Rscr1 and Src2 (or Imm) into register Rdest. */
|
---|
| 119 | MOP_XOR,
|
---|
| 120 | MOP_XORI,
|
---|
| 121 | /* Load immediate - li Rdest, imm
|
---|
| 122 | Move the immediate imm into register Rdest. */
|
---|
| 123 | MOP_LI,
|
---|
| 124 | /* Load upper immediate -lui Rdest, imm
|
---|
| 125 | Load the lower halfword of the immediate imm into the upper halfword of register Rdest . The lower bits of the resgister are set to 0. */
|
---|
| 126 | MOP_LUI,
|
---|
| 127 |
|
---|
| 128 | /* Comparison operators */
|
---|
| 129 | /* Set equal - seq Rdest, Rsrc1, Src2
|
---|
| 130 | Set register Rdest to 1 if register Rsrc1 equals Src2 and to 0 otherwise. */
|
---|
| 131 | MOP_SEQ,
|
---|
| 132 | MOP_SGE,
|
---|
| 133 | MOP_SGEU,
|
---|
| 134 | MOP_SGT,
|
---|
| 135 | MOP_SGTU,
|
---|
| 136 | MOP_SLE,
|
---|
| 137 | MOP_SLEU,
|
---|
| 138 | MOP_SLT,
|
---|
| 139 | MOP_SLTI,
|
---|
| 140 | MOP_SLTU,
|
---|
| 141 | MOP_SLTIU,
|
---|
| 142 | MOP_SNE,
|
---|
| 143 |
|
---|
| 144 | /* Branching operators */
|
---|
| 145 | MOP_B,
|
---|
| 146 | MOP_BCZT,
|
---|
| 147 | MOP_BCZF,
|
---|
| 148 | MOP_BEQ,
|
---|
| 149 | MOP_BEQZ,
|
---|
| 150 | MOP_BGE,
|
---|
| 151 | MOP_BGEU,
|
---|
| 152 | MOP_BGEZ,
|
---|
| 153 | MOP_BGEZAL,
|
---|
| 154 | MOP_BGT,
|
---|
| 155 | MOP_BGTU,
|
---|
| 156 | MOP_BGTZ,
|
---|
| 157 | MOP_BLE,
|
---|
| 158 | MOP_BLEU,
|
---|
| 159 | MOP_BLEZ,
|
---|
| 160 | MOP_BLTZAL,
|
---|
| 161 | MOP_BLT,
|
---|
| 162 | MOP_BLTU,
|
---|
| 163 | MOP_BLTZ,
|
---|
| 164 | MOP_BNE,
|
---|
| 165 | MOP_BNEZ,
|
---|
| 166 |
|
---|
| 167 | /* Jump operators */
|
---|
| 168 | MOP_J,
|
---|
| 169 | MOP_JAL,
|
---|
| 170 | MOP_JR,
|
---|
| 171 |
|
---|
| 172 | /* Load operators */
|
---|
| 173 | MOP_LA,
|
---|
| 174 | MOP_LB,
|
---|
| 175 | MOP_LBU,
|
---|
| 176 | MOP_LD,
|
---|
| 177 | MOP_LH,
|
---|
| 178 | MOP_LHU,
|
---|
| 179 | MOP_LW,
|
---|
| 180 | MOP_LWCZ,
|
---|
| 181 | MOP_LWL,
|
---|
| 182 | MOP_LWR,
|
---|
| 183 | MOP_ULH,
|
---|
| 184 | MOP_ULHU,
|
---|
| 185 | MOP_ULW,
|
---|
| 186 |
|
---|
| 187 | /* Store operators */
|
---|
| 188 | MOP_SB,
|
---|
| 189 | MOP_SD,
|
---|
| 190 | MOP_SH,
|
---|
| 191 | MOP_SW,
|
---|
| 192 | MOP_SWCZ,
|
---|
| 193 | MOP_SWL,
|
---|
| 194 | MOP_SWR,
|
---|
| 195 | MOP_USH,
|
---|
| 196 | MOP_USW,
|
---|
| 197 |
|
---|
| 198 | /* Copy operators */
|
---|
| 199 | MOP_MOVE,
|
---|
| 200 | MOP_MFHI,
|
---|
| 201 | MOP_MTLO,
|
---|
| 202 | MOP_MFC1,
|
---|
| 203 | MOP_MFC1_D,
|
---|
| 204 | MOP_MTC1,
|
---|
| 205 |
|
---|
| 206 | /* Floating point operators */
|
---|
| 207 | MOP_ABS_D,
|
---|
| 208 | MOP_ABS_S,
|
---|
| 209 | MOP_ADD_D,
|
---|
| 210 | MOP_ADD_S,
|
---|
| 211 | MOP_C_EQ_D,
|
---|
| 212 | MOP_C_EQ_S,
|
---|
| 213 | MOP_C_LE_D,
|
---|
| 214 | MOP_C_LE_S,
|
---|
| 215 | MOP_C_LT_D,
|
---|
| 216 | MOP_C_LT_S,
|
---|
| 217 | MOP_CVT_D_S,
|
---|
| 218 | MOP_CVT_D_W,
|
---|
| 219 | MOP_CVT_S_D,
|
---|
| 220 | MOP_CVT_S_W,
|
---|
| 221 | MOP_CVT_W_D,
|
---|
| 222 | MOP_CVT_W_S,
|
---|
| 223 | MOP_DIV_D,
|
---|
| 224 | MOP_DIV_S,
|
---|
| 225 | MOP_L_D,
|
---|
| 226 | MOP_L_S,
|
---|
| 227 | MOP_MOV_D,
|
---|
| 228 | MOP_MOV_S,
|
---|
| 229 | MOP_MUL_D,
|
---|
| 230 | MOP_MUL_S,
|
---|
| 231 | MOP_NEG_D,
|
---|
| 232 | MOP_NEG_S,
|
---|
| 233 | MOP_S_D,
|
---|
| 234 | MOP_S_S,
|
---|
| 235 | MOP_SUB_D,
|
---|
| 236 | MOP_SUB_S,
|
---|
| 237 | /* Hidden features, pseudo instructions ;-) */
|
---|
| 238 | MOP_LI_S,
|
---|
| 239 |
|
---|
| 240 | /* Exceptions and trap instructions */
|
---|
| 241 | MOP_RFE,
|
---|
| 242 | MOP_SYSCALL,
|
---|
| 243 | MOP_BREAK,
|
---|
| 244 | MOP_NOP,
|
---|
| 245 |
|
---|
| 246 | /* Special labels, for processing only */
|
---|
| 247 | MOP_LABEL,
|
---|
| 248 | MOP_NOPERATORS
|
---|
| 249 | } MOperator;
|
---|
| 250 |
|
---|
| 251 |
|
---|
| 252 | const char *MOperatorToString(MOperator op);
|
---|
| 253 |
|
---|
| 254 |
|
---|
| 255 | #endif /* _MOPERATOR_H */
|
---|
| 256 |
|
---|