/*---------------------------------------------------------------*/
/*--- begin                                 guest_mips_defs.h ---*/
/*---------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2010-2012 RT-RK
      mips-valgrind@rt-rk.com

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file COPYING.
*/

/* Only to be used within the guest-mips directory. */

#ifndef __VEX_GUEST_MIPS_DEFS_H
#define __VEX_GUEST_MIPS_DEFS_H

/*---------------------------------------------------------*/
/*--- mips to IR conversion                             ---*/
/*---------------------------------------------------------*/

/* Convert one MIPS insn to IR.  See the type DisOneInstrFn in
   bb_to_IR.h. */
extern DisResult disInstr_MIPS ( IRSB*        irbb,
                                 Bool         (*resteerOkFn) (void *, Addr64),
                                 Bool         resteerCisOk,
                                 void*        callback_opaque,
                                 UChar*       guest_code,
                                 Long         delta,
                                 Addr64       guest_IP,
                                 VexArch      guest_arch,
                                 VexArchInfo* archinfo,
                                 VexAbiInfo*  abiinfo,
                                 Bool         host_bigendian );

/* Used by the optimiser to specialise calls to helpers. */
extern IRExpr *guest_mips32_spechelper(HChar * function_name, IRExpr ** args,
                                       IRStmt ** precedingStmts,
                                       Int n_precedingStmts);

/* Describes to the optimser which part of the guest state require
   precise memory exceptions.  This is logically part of the guest
   state description. */
extern Bool guest_mips32_state_requires_precise_mem_exns(Int, Int);

extern VexGuestLayout mips32Guest_layout;

/*---------------------------------------------------------*/
/*--- mips guest helpers                                 ---*/
/*---------------------------------------------------------*/

extern UInt mips32_dirtyhelper_mfc0(UInt rd, UInt sel);

extern void mips32_dirtyhelper_sync(UInt sync);

/*---------------------------------------------------------*/
/*--- Condition code stuff                              ---*/
/*---------------------------------------------------------*/

/* Defines conditions which we can ask for (MIPS MIPS 2e page A3-6) */

typedef enum {
   MIPSCondEQ = 0,      /* equal                         : Z=1 */
   MIPSCondNE = 1,      /* not equal                     : Z=0 */

   MIPSCondHS = 2,      /* >=u (higher or same)          : C=1 */
   MIPSCondLO = 3,      /* <u  (lower)                   : C=0 */

   MIPSCondMI = 4,      /* minus (negative)              : N=1 */
   MIPSCondPL = 5,      /* plus (zero or +ve)            : N=0 */

   MIPSCondVS = 6,      /* overflow                      : V=1 */
   MIPSCondVC = 7,      /* no overflow                   : V=0 */

   MIPSCondHI = 8,      /* >u   (higher)                 : C=1 && Z=0 */
   MIPSCondLS = 9,      /* <=u  (lower or same)          : C=0 || Z=1 */

   MIPSCondGE = 10,  /* >=s (signed greater or equal) : N=V */
   MIPSCondLT = 11,  /* <s  (signed less than)        : N!=V */

   MIPSCondGT = 12,  /* >s  (signed greater)          : Z=0 && N=V */
   MIPSCondLE = 13,  /* <=s (signed less or equal)    : Z=1 || N!=V */

   MIPSCondAL = 14,  /* always (unconditional)        : 1 */
   MIPSCondNV = 15      /* never (unconditional):        : 0 */
       /* NB: MIPS have deprecated the use of the NV condition code.
          You are now supposed to use MOV R0,R0 as a noop rather than
          MOVNV R0,R0 as was previously recommended.  Future processors
          may have the NV condition code reused to do other things.  */
} MIPSCondcode;

#endif            /* __VEX_GUEST_MIPS_DEFS_H */

/*---------------------------------------------------------------*/
/*--- end                                   guest_mips_defs.h ---*/
/*---------------------------------------------------------------*/