• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*---------------------------------------------------------------*/
3 /*--- begin                                  host_mips_defs.h ---*/
4 /*---------------------------------------------------------------*/
5 
6 /*
7    This file is part of Valgrind, a dynamic binary instrumentation
8    framework.
9 
10    Copyright (C) 2010-2013 RT-RK
11       mips-valgrind@rt-rk.com
12 
13    This program is free software; you can redistribute it and/or
14    modify it under the terms of the GNU General Public License as
15    published by the Free Software Foundation; either version 2 of the
16    License, or (at your option) any later version.
17 
18    This program is distributed in the hope that it will be useful, but
19    WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    General Public License for more details.
22 
23    You should have received a copy of the GNU General Public License
24    along with this program; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26    02111-1307, USA.
27 
28    The GNU General Public License is contained in the file COPYING.
29 */
30 
31 #ifndef __VEX_HOST_MIPS_DEFS_H
32 #define __VEX_HOST_MIPS_DEFS_H
33 
34 #include "libvex_basictypes.h"
35 #include "libvex.h"             /* VexArch */
36 #include "host_generic_regs.h"  /* HReg */
37 
38 /* Num registers used for function calls */
39 #if defined(VGP_mips32_linux)
40 /* a0, a1, a2, a3 */
41 #define MIPS_N_REGPARMS 4
42 #else
43 /* a0, a1, a2, a3, a4, a5, a6, a7 */
44 #define MIPS_N_REGPARMS 8
45 #endif
46 /* --------- Registers. --------- */
47 
48 /* The usual HReg abstraction.
49    There are 32 general purpose regs.
50 */
51 
52 extern void ppHRegMIPS(HReg, Bool);
53 
54 extern HReg hregMIPS_GPR0(Bool mode64);  /* scratch reg / zero reg */
55 extern HReg hregMIPS_GPR1(Bool mode64);
56 extern HReg hregMIPS_GPR2(Bool mode64);
57 extern HReg hregMIPS_GPR3(Bool mode64);
58 extern HReg hregMIPS_GPR4(Bool mode64);
59 extern HReg hregMIPS_GPR5(Bool mode64);
60 extern HReg hregMIPS_GPR6(Bool mode64);
61 extern HReg hregMIPS_GPR7(Bool mode64);
62 extern HReg hregMIPS_GPR8(Bool mode64);
63 extern HReg hregMIPS_GPR9(Bool mode64);
64 extern HReg hregMIPS_GPR10(Bool mode64);
65 extern HReg hregMIPS_GPR11(Bool mode64);
66 extern HReg hregMIPS_GPR12(Bool mode64);
67 extern HReg hregMIPS_GPR13(Bool mode64);
68 extern HReg hregMIPS_GPR14(Bool mode64);
69 extern HReg hregMIPS_GPR15(Bool mode64);
70 extern HReg hregMIPS_GPR16(Bool mode64);
71 extern HReg hregMIPS_GPR17(Bool mode64);
72 extern HReg hregMIPS_GPR18(Bool mode64);
73 extern HReg hregMIPS_GPR19(Bool mode64);
74 extern HReg hregMIPS_GPR20(Bool mode64);
75 extern HReg hregMIPS_GPR21(Bool mode64);
76 extern HReg hregMIPS_GPR22(Bool mode64);
77 extern HReg hregMIPS_GPR23(Bool mode64);  /* GuestStatePtr */
78 extern HReg hregMIPS_GPR24(Bool mode64);
79 extern HReg hregMIPS_GPR25(Bool mode64);
80 extern HReg hregMIPS_GPR26(Bool mode64);
81 extern HReg hregMIPS_GPR27(Bool mode64);
82 extern HReg hregMIPS_GPR28(Bool mode64);
83 extern HReg hregMIPS_GPR29(Bool mode64);
84 extern HReg hregMIPS_GPR30(Bool mode64);
85 extern HReg hregMIPS_GPR31(Bool mode64);
86 extern HReg hregMIPS_PC(Bool mode64);
87 
88 extern HReg hregMIPS_HI(Bool mode64);
89 extern HReg hregMIPS_LO(Bool mode64);
90 
91 extern HReg hregMIPS_F0(Bool mode64);
92 extern HReg hregMIPS_F1(Bool mode64);
93 extern HReg hregMIPS_F2(Bool mode64);
94 extern HReg hregMIPS_F3(Bool mode64);
95 extern HReg hregMIPS_F4(Bool mode64);
96 extern HReg hregMIPS_F5(Bool mode64);
97 extern HReg hregMIPS_F6(Bool mode64);
98 extern HReg hregMIPS_F7(Bool mode64);
99 extern HReg hregMIPS_F8(Bool mode64);
100 extern HReg hregMIPS_F9(Bool mode64);
101 extern HReg hregMIPS_F10(Bool mode64);
102 extern HReg hregMIPS_F11(Bool mode64);
103 extern HReg hregMIPS_F12(Bool mode64);
104 extern HReg hregMIPS_F13(Bool mode64);
105 extern HReg hregMIPS_F14(Bool mode64);
106 extern HReg hregMIPS_F15(Bool mode64);
107 extern HReg hregMIPS_F16(Bool mode64);
108 extern HReg hregMIPS_F17(Bool mode64);
109 extern HReg hregMIPS_F18(Bool mode64);
110 extern HReg hregMIPS_F19(Bool mode64);
111 extern HReg hregMIPS_F20(Bool mode64);
112 extern HReg hregMIPS_F21(Bool mode64);
113 extern HReg hregMIPS_F22(Bool mode64);
114 extern HReg hregMIPS_F23(Bool mode64);
115 extern HReg hregMIPS_F24(Bool mode64);
116 extern HReg hregMIPS_F25(Bool mode64);
117 extern HReg hregMIPS_F26(Bool mode64);
118 extern HReg hregMIPS_F27(Bool mode64);
119 extern HReg hregMIPS_F28(Bool mode64);
120 extern HReg hregMIPS_F29(Bool mode64);
121 extern HReg hregMIPS_F30(Bool mode64);
122 extern HReg hregMIPS_F31(Bool mode64);
123 extern HReg hregMIPS_FIR(void);
124 extern HReg hregMIPS_FCCR(void);
125 extern HReg hregMIPS_FEXR(void);
126 extern HReg hregMIPS_FENR(void);
127 extern HReg hregMIPS_FCSR(void);
128 extern HReg hregMIPS_COND(void);
129 
130 extern HReg hregMIPS_D0(void);
131 extern HReg hregMIPS_D1(void);
132 extern HReg hregMIPS_D2(void);
133 extern HReg hregMIPS_D3(void);
134 extern HReg hregMIPS_D4(void);
135 extern HReg hregMIPS_D5(void);
136 extern HReg hregMIPS_D6(void);
137 extern HReg hregMIPS_D7(void);
138 extern HReg hregMIPS_D8(void);
139 extern HReg hregMIPS_D9(void);
140 extern HReg hregMIPS_D10(void);
141 extern HReg hregMIPS_D11(void);
142 extern HReg hregMIPS_D12(void);
143 extern HReg hregMIPS_D13(void);
144 extern HReg hregMIPS_D14(void);
145 extern HReg hregMIPS_D15(void);
146 
147 #define GuestStatePointer(_mode64)     hregMIPS_GPR23(_mode64)
148 
149 #define StackFramePointer(_mode64)     hregMIPS_GPR30(_mode64)
150 #define LinkRegister(_mode64)          hregMIPS_GPR31(_mode64)
151 #define StackPointer(_mode64)          hregMIPS_GPR29(_mode64)
152 #define FCSR()                         hregMIPS_FCSR()
153 #define COND()                         hregMIPS_COND()
154 
155 #define HIRegister(_mode64)        hregMIPS_HI(_mode64)
156 #define LORegister(_mode64)        hregMIPS_LO(_mode64)
157 
158 #if defined(VGP_mips64_linux)
159 /* a0, a1, a2, a3, a4, a5, a6, a7 */
160 #define MIPS_N_ARGREGS 8
161 #elif defined(VGP_mips32_linux)
162 /* a0, a1, a2, a3 */
163 #define MIPS_N_ARGREGS 4
164 #endif
165 
166 /* --------- Condition codes, Intel encoding. --------- */
167 typedef enum {
168    MIPScc_EQ = 0,   /* equal */
169    MIPScc_NE = 1,   /* not equal */
170 
171    MIPScc_HS = 2,   /* >=u (higher or same) */
172    MIPScc_LO = 3,   /* <u  (lower) */
173 
174    MIPScc_MI = 4,   /* minus (negative) */
175    MIPScc_PL = 5,   /* plus (zero or +ve) */
176 
177    MIPScc_VS = 6,   /* overflow */
178    MIPScc_VC = 7,   /* no overflow */
179 
180    MIPScc_HI = 8,   /* >u   (higher) */
181    MIPScc_LS = 9,   /* <=u  (lower or same) */
182 
183    MIPScc_GE = 10,  /* >=s (signed greater or equal) */
184    MIPScc_LT = 11,  /* <s  (signed less than) */
185 
186    MIPScc_GT = 12,  /* >s  (signed greater) */
187    MIPScc_LE = 13,  /* <=s (signed less or equal) */
188 
189    MIPScc_AL = 14,  /* always (unconditional) */
190    MIPScc_NV = 15   /* never (unconditional): */
191 } MIPSCondCode;
192 
193 extern const HChar *showMIPSCondCode(MIPSCondCode);
194 
195 /* --------- Memory address expressions (amodes). --------- */
196 typedef enum {
197    Mam_IR,        /* Immediate (signed 16-bit) + Reg */
198    Mam_RR         /* Reg1 + Reg2 */
199 } MIPSAModeTag;
200 
201 typedef struct {
202    MIPSAModeTag tag;
203    union {
204       struct {
205          HReg base;
206          Int index;
207       } IR;
208       struct {
209          HReg base;
210          HReg index;
211       } RR;
212    } Mam;
213 } MIPSAMode;
214 
215 extern MIPSAMode *MIPSAMode_IR(Int, HReg);
216 extern MIPSAMode *MIPSAMode_RR(HReg, HReg);
217 
218 extern MIPSAMode *dopyMIPSAMode(MIPSAMode *);
219 extern MIPSAMode *nextMIPSAModeFloat(MIPSAMode *);
220 extern MIPSAMode *nextMIPSAModeInt(MIPSAMode *);
221 
222 extern void ppMIPSAMode(MIPSAMode *, Bool);
223 
224 /* --------- Operand, which can be a reg or a u16/s16. --------- */
225 /* ("RH" == "Register or Halfword immediate") */
226 typedef enum {
227    Mrh_Imm,
228    Mrh_Reg
229 } MIPSRHTag;
230 
231 typedef struct {
232    MIPSRHTag tag;
233    union {
234       struct {
235          Bool syned;
236          UShort imm16;
237       } Imm;
238       struct {
239          HReg reg;
240       } Reg;
241    } Mrh;
242 } MIPSRH;
243 
244 extern void ppMIPSRH(MIPSRH *, Bool);
245 
246 extern MIPSRH *MIPSRH_Imm(Bool, UShort);
247 extern MIPSRH *MIPSRH_Reg(HReg);
248 
249 /* --------- Instructions. --------- */
250 
251 /*Tags for operations*/
252 
253 /* --------- */
254 typedef enum {
255    Mun_CLO,
256    Mun_CLZ,
257    Mun_DCLO,
258    Mun_DCLZ,
259    Mun_NOP,
260 } MIPSUnaryOp;
261 
262 extern const HChar *showMIPSUnaryOp(MIPSUnaryOp);
263 /* --------- */
264 
265 /* --------- */
266 
267 typedef enum {
268    Malu_INVALID,
269    Malu_ADD, Malu_SUB,
270    Malu_AND, Malu_OR, Malu_NOR, Malu_XOR,
271    Malu_DADD, Malu_DSUB,
272    Malu_SLT
273 } MIPSAluOp;
274 
275 extern const HChar *showMIPSAluOp(MIPSAluOp,
276                             Bool /* is the 2nd operand an immediate? */ );
277 
278 /* --------- */
279 typedef enum {
280    Mshft_INVALID,
281    Mshft_SLL, Mshft_SRL,
282    Mshft_SRA
283 } MIPSShftOp;
284 
285 extern const HChar *showMIPSShftOp(MIPSShftOp,
286                              Bool /* is the 2nd operand an immediate? */ ,
287                              Bool /* is this a 32bit or 64bit op? */ );
288 
289 /* --------- */
290 typedef enum {
291    Macc_ADD,
292    Macc_SUB
293 } MIPSMaccOp;
294 
295 extern const HChar *showMIPSMaccOp(MIPSMaccOp, Bool);
296 /* --------- */
297 
298 /* ----- Instruction tags ----- */
299 typedef enum {
300    Min_LI,         /* load word (32/64-bit) immediate (fake insn) */
301    Min_Alu,        /* word add/sub/and/or/xor/nor/others? */
302    Min_Shft,       /* word sll/srl/sra */
303    Min_Unary,      /* clo, clz, nop, neg */
304 
305    Min_Cmp,        /* word compare (fake insn) */
306 
307    Min_Mul,        /* widening/non-widening multiply */
308    Min_Div,        /* div */
309 
310    Min_Call,       /* call to address in register */
311 
312    /* The following 5 insns are mandated by translation chaining */
313    Min_XDirect,    /* direct transfer to GA */
314    Min_XIndir,     /* indirect transfer to GA */
315    Min_XAssisted,  /* assisted transfer to GA */
316    Min_EvCheck,    /* Event check */
317    Min_ProfInc,    /* 64-bit profile counter increment */
318 
319    Min_RdWrLR,     /* Read/Write Link Register */
320    Min_Mthi,       /* Move to HI from GP register */
321    Min_Mtlo,       /* Move to LO from GP register */
322    Min_Mfhi,       /* Move from HI to GP register */
323    Min_Mflo,       /* Move from LO to GP register */
324    Min_Macc,       /* Multiply and accumulate */
325 
326    Min_Load,       /* zero-extending load a 8|16|32 bit value from mem */
327    Min_Store,      /* store a 8|16|32 bit value to mem */
328    Min_LoadL,      /* mips Load Linked Word - LL */
329    Min_StoreC,     /* mips Store Conditional Word - SC */
330 
331    Min_FpUnary,    /* FP unary op */
332    Min_FpBinary,   /* FP binary op */
333    Min_FpTernary,  /* FP ternary op */
334    Min_FpConvert,  /* FP conversion op */
335    Min_FpMulAcc,   /* FP multipy-accumulate style op */
336    Min_FpLdSt,     /* FP load/store */
337    Min_FpSTFIW,    /* stfiwx */
338    Min_FpRSP,      /* FP round IEEE754 double to IEEE754 single */
339    Min_FpCftI,     /* fcfid/fctid/fctiw */
340    Min_FpCMov,     /* FP floating point conditional move */
341    Min_MtFCSR,     /* set FCSR register */
342    Min_MfFCSR,     /* get FCSR register */
343    Min_FpCompare,  /* FP compare, generating value into int reg */
344 
345    Min_FpGpMove,   /* Move from/to fpr to/from gpr */
346    Min_MoveCond    /* Move Conditional */
347 } MIPSInstrTag;
348 
349 /* --------- */
350 typedef enum {
351    Mfp_INVALID,
352 
353    /* Ternary */
354    Mfp_MADDD, Mfp_MSUBD,
355    Mfp_MADDS, Mfp_MSUBS,
356 
357    /* Binary */
358    Mfp_ADDD, Mfp_SUBD, Mfp_MULD, Mfp_DIVD,
359    Mfp_ADDS, Mfp_SUBS, Mfp_MULS, Mfp_DIVS,
360 
361    /* Unary */
362    Mfp_SQRTS, Mfp_SQRTD,
363    Mfp_ABSS, Mfp_ABSD, Mfp_NEGS, Mfp_NEGD, Mfp_MOVS, Mfp_MOVD,
364 
365    /* FP convert */
366    Mfp_CVTSD, Mfp_CVTSW, Mfp_CVTWD,
367    Mfp_CVTWS, Mfp_CVTDL, Mfp_CVTSL, Mfp_CVTLS, Mfp_CVTLD, Mfp_TRULS, Mfp_TRULD,
368    Mfp_TRUWS, Mfp_TRUWD, Mfp_FLOORWS, Mfp_FLOORWD, Mfp_ROUNDWS, Mfp_ROUNDWD,
369    Mfp_CVTDW, Mfp_CEILWS, Mfp_CEILWD, Mfp_CEILLS, Mfp_CEILLD, Mfp_CVTDS,
370    Mfp_ROUNDLD, Mfp_FLOORLD,
371 
372    /* FP compare */
373    Mfp_CMP_UN, Mfp_CMP_EQ, Mfp_CMP_LT, Mfp_CMP_NGT
374 
375 } MIPSFpOp;
376 
377 extern const HChar *showMIPSFpOp(MIPSFpOp);
378 
379 /* Move from/to fpr to/from gpr */
380 typedef enum {
381    MFpGpMove_mfc1,   /* Move Word From Floating Point - MIPS32 */
382    MFpGpMove_dmfc1,  /* Doubleword Move from Floating Point - MIPS64 */
383    MFpGpMove_mtc1,   /* Move Word to Floating Point - MIPS32 */
384    MFpGpMove_dmtc1   /* Doubleword Move to Floating Point - MIPS64 */
385 } MIPSFpGpMoveOp;
386 
387 extern const HChar *showMIPSFpGpMoveOp ( MIPSFpGpMoveOp );
388 
389 /* Move Conditional */
390 typedef enum {
391    MFpMoveCond_movns,  /* FP Move Conditional on Not Zero - MIPS32 */
392    MFpMoveCond_movnd,
393    MMoveCond_movn      /* Move Conditional on Not Zero */
394 } MIPSMoveCondOp;
395 
396 extern const HChar *showMIPSMoveCondOp ( MIPSMoveCondOp );
397 
398 /*--------- Structure for instructions ----------*/
399 /* Destinations are on the LEFT (first operand) */
400 
401 typedef struct {
402    MIPSInstrTag tag;
403    union {
404       /* Get a 32/64-bit literal into a register.
405          May turn into a number of real insns. */
406       struct {
407          HReg dst;
408          ULong imm;
409       } LI;
410       /* Integer add/sub/and/or/xor.  Limitations:
411          - For add, the immediate, if it exists, is a signed 16.
412          - For sub, the immediate, if it exists, is a signed 16
413          which may not be -32768, since no such instruction
414          exists, and so we have to emit addi with +32768, but
415          that is not possible.
416          - For and/or/xor,  the immediate, if it exists,
417          is an unsigned 16.
418        */
419       struct {
420          MIPSAluOp op;
421          HReg dst;
422          HReg srcL;
423          MIPSRH *srcR;
424       } Alu;
425       /* Integer shl/shr/sar.
426          Limitations: the immediate, if it exists,
427          is a signed 5-bit value between 1 and 31 inclusive.
428        */
429       struct {
430          MIPSShftOp op;
431          Bool sz32;  /* mode64 has both 32 and 64bit shft */
432          HReg dst;
433          HReg srcL;
434          MIPSRH *srcR;
435       } Shft;
436       /* Clz, Clo, nop */
437       struct {
438          MIPSUnaryOp op;
439          HReg dst;
440          HReg src;
441       } Unary;
442       /* Word compare. Fake instruction, used for basic block ending */
443       struct {
444          Bool syned;
445          Bool sz32;
446          HReg dst;
447          HReg srcL;
448          HReg srcR;
449 
450          MIPSCondCode cond;
451       } Cmp;
452       struct {
453          Bool widening;  /* True => widening, False => non-widening */
454          Bool syned;     /* signed/unsigned - meaningless if widenind = False */
455          Bool sz32;
456          HReg dst;
457          HReg srcL;
458          HReg srcR;
459       } Mul;
460       struct {
461          Bool syned;  /* signed/unsigned - meaningless if widenind = False */
462          Bool sz32;
463          HReg srcL;
464          HReg srcR;
465       } Div;
466       /* Pseudo-insn.  Call target (an absolute address), on given
467          condition (which could be Mcc_ALWAYS).  argiregs indicates
468          which of $4 .. $7 (mips32) or $4 .. $11 (mips64)
469          carries argument values for this call,
470          using a bit mask (1<<N is set if $N holds an arg, for N in
471          $4 .. $7 or $4 .. $11 inclusive).
472          If cond is != Mcc_ALWAYS, src is checked.
473          Otherwise, unconditional call */
474       struct {
475          MIPSCondCode cond;
476          Addr64 target;
477          UInt argiregs;
478          HReg src;
479          RetLoc rloc;     /* where the return value will be */
480       } Call;
481       /* Update the guest EIP value, then exit requesting to chain
482          to it.  May be conditional.  Urr, use of Addr32 implicitly
483          assumes that wordsize(guest) == wordsize(host). */
484       struct {
485          Addr64       dstGA;     /* next guest address */
486          MIPSAMode*   amPC;      /* amode in guest state for PC */
487          MIPSCondCode cond;      /* can be MIPScc_AL */
488          Bool         toFastEP;  /* chain to the slow or fast point? */
489       } XDirect;
490       /* Boring transfer to a guest address not known at JIT time.
491          Not chainable.  May be conditional. */
492       struct {
493          HReg        dstGA;
494          MIPSAMode*   amPC;
495          MIPSCondCode cond; /* can be MIPScc_AL */
496       } XIndir;
497       /* Assisted transfer to a guest address, most general case.
498          Not chainable.  May be conditional. */
499       struct {
500          HReg        dstGA;
501          MIPSAMode*   amPC;
502          MIPSCondCode cond; /* can be MIPScc_AL */
503          IRJumpKind  jk;
504       } XAssisted;
505       /* Zero extending loads.  Dst size is host word size */
506       struct {
507          UChar sz;   /* 1|2|4|8 */
508          HReg dst;
509          MIPSAMode *src;
510       } Load;
511       /* 64/32/16/8 bit stores */
512       struct {
513          UChar sz;   /* 1|2|4|8 */
514          MIPSAMode *dst;
515          HReg src;
516       } Store;
517       struct {
518          UChar sz;   /* 4|8 */
519          HReg dst;
520          MIPSAMode *src;
521       } LoadL;
522       struct {
523          UChar sz;   /* 4|8 */
524          MIPSAMode *dst;
525          HReg src;
526       } StoreC;
527       /* Move from HI/LO register to GP register. */
528       struct {
529          HReg dst;
530       } MfHL;
531 
532       /* Move to HI/LO register from GP register. */
533       struct {
534          HReg src;
535       } MtHL;
536 
537       /* Read/Write Link Register */
538       struct {
539          Bool wrLR;
540          HReg gpr;
541       } RdWrLR;
542 
543       /* MIPS Multiply and accumulate instructions. */
544       struct {
545          MIPSMaccOp op;
546          Bool syned;
547 
548          HReg srcL;
549          HReg srcR;
550       } Macc;
551 
552       /* MIPS Floating point */
553       struct {
554          MIPSFpOp op;
555          HReg dst;
556          HReg src;
557       } FpUnary;
558       struct {
559          MIPSFpOp op;
560          HReg dst;
561          HReg srcL;
562          HReg srcR;
563       } FpBinary;
564       struct {
565          MIPSFpOp op;
566          HReg dst;
567          HReg src1;
568          HReg src2;
569          HReg src3;
570       } FpTernary;
571       struct {
572          MIPSFpOp op;
573          HReg dst;
574          HReg srcML;
575          HReg srcMR;
576          HReg srcAcc;
577       } FpMulAcc;
578       struct {
579          Bool isLoad;
580          UChar sz;   /* only 4 (IEEE single) or 8 (IEEE double) */
581          HReg reg;
582          MIPSAMode *addr;
583       } FpLdSt;
584 
585       struct {
586          MIPSFpOp op;
587          HReg dst;
588          HReg src;
589       } FpConvert;
590       struct {
591          MIPSFpOp op;
592          HReg dst;
593          HReg srcL;
594          HReg srcR;
595          UChar cond1;
596       } FpCompare;
597       /* Move from GP register to FCSR register. */
598       struct {
599          HReg src;
600       } MtFCSR;
601       /* Move from FCSR register to GP register. */
602       struct {
603          HReg dst;
604       } MfFCSR;
605       struct {
606          MIPSAMode* amCounter;
607          MIPSAMode* amFailAddr;
608       } EvCheck;
609       struct {
610          /* No fields.  The address of the counter to inc is
611             installed later, post-translation, by patching it in,
612             as it is not known at translation time. */
613       } ProfInc;
614 
615       /* Move from/to fpr to/from gpr */
616       struct {
617          MIPSFpGpMoveOp op;
618          HReg dst;
619          HReg src;
620       } FpGpMove;
621       struct {
622          MIPSMoveCondOp op;
623          HReg dst;
624          HReg src;
625          HReg cond;
626       } MoveCond;
627 
628    } Min;
629 } MIPSInstr;
630 
631 extern MIPSInstr *MIPSInstr_LI(HReg, ULong);
632 extern MIPSInstr *MIPSInstr_Alu(MIPSAluOp, HReg, HReg, MIPSRH *);
633 extern MIPSInstr *MIPSInstr_Shft(MIPSShftOp, Bool sz32, HReg, HReg, MIPSRH *);
634 extern MIPSInstr *MIPSInstr_Unary(MIPSUnaryOp op, HReg dst, HReg src);
635 extern MIPSInstr *MIPSInstr_Cmp(Bool, Bool, HReg, HReg, HReg, MIPSCondCode);
636 
637 extern MIPSInstr *MIPSInstr_Mul(Bool syned, Bool hi32, Bool sz32, HReg,
638                                 HReg, HReg);
639 extern MIPSInstr *MIPSInstr_Div(Bool syned, Bool sz32, HReg, HReg);
640 extern MIPSInstr *MIPSInstr_Madd(Bool, HReg, HReg);
641 extern MIPSInstr *MIPSInstr_Msub(Bool, HReg, HReg);
642 
643 extern MIPSInstr *MIPSInstr_Load(UChar sz, HReg dst, MIPSAMode * src,
644                                  Bool mode64);
645 extern MIPSInstr *MIPSInstr_Store(UChar sz, MIPSAMode * dst, HReg src,
646                                   Bool mode64);
647 
648 extern MIPSInstr *MIPSInstr_LoadL(UChar sz, HReg dst, MIPSAMode * src,
649                                   Bool mode64);
650 extern MIPSInstr *MIPSInstr_StoreC(UChar sz, MIPSAMode * dst, HReg src,
651                                    Bool mode64);
652 
653 extern MIPSInstr *MIPSInstr_Call ( MIPSCondCode, Addr64, UInt, HReg, RetLoc );
654 extern MIPSInstr *MIPSInstr_CallAlways ( MIPSCondCode, Addr64, UInt, RetLoc );
655 
656 extern MIPSInstr *MIPSInstr_XDirect ( Addr64 dstGA, MIPSAMode* amPC,
657                                       MIPSCondCode cond, Bool toFastEP );
658 extern MIPSInstr *MIPSInstr_XIndir(HReg dstGA, MIPSAMode* amPC,
659                                      MIPSCondCode cond);
660 extern MIPSInstr *MIPSInstr_XAssisted(HReg dstGA, MIPSAMode* amPC,
661                                       MIPSCondCode cond, IRJumpKind jk);
662 
663 extern MIPSInstr *MIPSInstr_FpUnary(MIPSFpOp op, HReg dst, HReg src);
664 extern MIPSInstr *MIPSInstr_FpBinary(MIPSFpOp op, HReg dst, HReg srcL,
665                                      HReg srcR);
666 extern MIPSInstr *MIPSInstr_FpTernary ( MIPSFpOp op, HReg dst, HReg src1,
667                                         HReg src2, HReg src3 );
668 extern MIPSInstr *MIPSInstr_FpConvert(MIPSFpOp op, HReg dst, HReg src);
669 extern MIPSInstr *MIPSInstr_FpCompare(MIPSFpOp op, HReg dst, HReg srcL,
670                                       HReg srcR);
671 extern MIPSInstr *MIPSInstr_FpMulAcc(MIPSFpOp op, HReg dst, HReg srcML,
672                                      HReg srcMR, HReg srcAcc);
673 extern MIPSInstr *MIPSInstr_FpLdSt(Bool isLoad, UChar sz, HReg, MIPSAMode *);
674 extern MIPSInstr *MIPSInstr_FpSTFIW(HReg addr, HReg data);
675 extern MIPSInstr *MIPSInstr_FpRSP(HReg dst, HReg src);
676 extern MIPSInstr *MIPSInstr_FpCftI(Bool fromI, Bool int32, HReg dst, HReg src);
677 extern MIPSInstr *MIPSInstr_FpCMov(MIPSCondCode, HReg dst, HReg src);
678 extern MIPSInstr *MIPSInstr_MtFCSR(HReg src);
679 extern MIPSInstr *MIPSInstr_MfFCSR(HReg dst);
680 extern MIPSInstr *MIPSInstr_FpCmp(HReg dst, HReg srcL, HReg srcR);
681 
682 extern MIPSInstr *MIPSInstr_Mfhi(HReg dst);
683 extern MIPSInstr *MIPSInstr_Mflo(HReg dst);
684 extern MIPSInstr *MIPSInstr_Mthi(HReg src);
685 extern MIPSInstr *MIPSInstr_Mtlo(HReg src);
686 
687 extern MIPSInstr *MIPSInstr_RdWrLR(Bool wrLR, HReg gpr);
688 
689 extern MIPSInstr *MIPSInstr_MoveCond ( MIPSMoveCondOp op, HReg dst,
690                                        HReg src, HReg cond );
691 
692 extern MIPSInstr *MIPSInstr_FpGpMove ( MIPSFpGpMoveOp op, HReg dst, HReg src );
693 
694 extern MIPSInstr *MIPSInstr_EvCheck(MIPSAMode* amCounter,
695                                     MIPSAMode* amFailAddr );
696 extern MIPSInstr *MIPSInstr_ProfInc( void );
697 
698 extern void ppMIPSInstr(MIPSInstr *, Bool mode64);
699 
700 /* Some functions that insulate the register allocator from details
701    of the underlying instruction set. */
702 extern void       getRegUsage_MIPSInstr (HRegUsage *, MIPSInstr *, Bool);
703 extern void       mapRegs_MIPSInstr     (HRegRemap *, MIPSInstr *, Bool mode64);
704 extern Bool       isMove_MIPSInstr      (MIPSInstr *, HReg *, HReg *);
705 extern Int        emit_MIPSInstr        (/*MB_MOD*/Bool* is_profInc,
706                                          UChar* buf, Int nbuf, MIPSInstr* i,
707                                          Bool mode64,
708                                          void* disp_cp_chain_me_to_slowEP,
709                                          void* disp_cp_chain_me_to_fastEP,
710                                          void* disp_cp_xindir,
711                                          void* disp_cp_xassisted );
712 
713 extern void genSpill_MIPS ( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2,
714                             HReg rreg, Int offset, Bool);
715 extern void genReload_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2,
716                             HReg rreg, Int offset, Bool);
717 
718 extern void        getAllocableRegs_MIPS (Int *, HReg **, Bool mode64);
719 extern HInstrArray *iselSB_MIPS          ( IRSB*,
720                                            VexArch,
721                                            VexArchInfo*,
722                                            VexAbiInfo*,
723                                            Int offs_Host_EvC_Counter,
724                                            Int offs_Host_EvC_FailAddr,
725                                            Bool chainingAllowed,
726                                            Bool addProfInc,
727                                            Addr64 max_ga );
728 
729 /* How big is an event check?  This is kind of a kludge because it
730    depends on the offsets of host_EvC_FAILADDR and host_EvC_COUNTER,
731    and so assumes that they are both <= 128, and so can use the short
732    offset encoding.  This is all checked with assertions, so in the
733    worst case we will merely assert at startup. */
734 extern Int evCheckSzB_MIPS ( void );
735 
736 /* Perform a chaining and unchaining of an XDirect jump. */
737 extern VexInvalRange chainXDirect_MIPS ( void* place_to_chain,
738                                          void* disp_cp_chain_me_EXPECTED,
739                                          void* place_to_jump_to,
740                                          Bool  mode64 );
741 
742 extern VexInvalRange unchainXDirect_MIPS ( void* place_to_unchain,
743                                            void* place_to_jump_to_EXPECTED,
744                                            void* disp_cp_chain_me,
745                                            Bool  mode64 );
746 
747 /* Patch the counter location into an existing ProfInc point. */
748 extern VexInvalRange patchProfInc_MIPS ( void*  place_to_patch,
749                                          ULong* location_of_counter,
750                                          Bool  mode64 );
751 
752 #endif            /* ndef __LIBVEX_HOST_MIPS_HDEFS_H */
753 
754 /*---------------------------------------------------------------*/
755 /*--- end                                    host-mips_defs.h ---*/
756 /*---------------------------------------------------------------*/
757