1362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
2362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/
3362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- begin                              guest_mips_helpers.c ---*/
4362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/
5362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
6362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*
7362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   framework.
9362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
10b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Copyright (C) 2010-2013 RT-RK
11362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      mips-valgrind@rt-rk.com
12362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
13362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   This program is free software; you can redistribute it and/or
14362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   modify it under the terms of the GNU General Public License as
15362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   published by the Free Software Foundation; either version 2 of the
16362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   License, or (at your option) any later version.
17362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
18362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   This program is distributed in the hope that it will be useful, but
19362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   General Public License for more details.
22362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
23362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   You should have received a copy of the GNU General Public License
24362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   along with this program; if not, write to the Free Software
25362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   02111-1307, USA.
27362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
28362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   The GNU General Public License is contained in the file COPYING.
29362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj*/
30362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
31362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "libvex_basictypes.h"
3233b024301d2311965cc68dc4cc900f3d0fdd8085florian#include "libvex_emnote.h"
33362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "libvex_guest_mips32.h"
34b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#include "libvex_guest_mips64.h"
35362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "libvex_ir.h"
36362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "libvex.h"
37362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
38362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "main_util.h"
396c46befd9eb90c1b6e739926c1fa335cba75bf46philippe#include "main_globals.h"
40362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "guest_generic_bb_to_IR.h"
41362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#include "guest_mips_defs.h"
42362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
43362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* This file contains helper functions for mips guest code.  Calls to
44362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   these functions are generated by the back end.
45362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj*/
46362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
470e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#define ALWAYSDEFD32(field)                            \
48362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj    { offsetof(VexGuestMIPS32State, field),            \
49362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      (sizeof ((VexGuestMIPS32State*)0)->field) }
50362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
51b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#define ALWAYSDEFD64(field)                            \
52b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj    { offsetof(VexGuestMIPS64State, field),            \
53b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      (sizeof ((VexGuestMIPS64State*)0)->field) }
54b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
551ff4756e1731485e6bf3cd96717cd8398daec1f2florianIRExpr *guest_mips32_spechelper(const HChar * function_name, IRExpr ** args,
56362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj                                IRStmt ** precedingStmts, Int n_precedingStmts)
57362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj{
58362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   return NULL;
59362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj}
60362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
61b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjIRExpr *guest_mips64_spechelper ( const HChar * function_name, IRExpr ** args,
62b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                                  IRStmt ** precedingStmts,
63b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                                  Int n_precedingStmts )
64b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
65b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   return NULL;
66b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
67b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
68362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* VISIBLE TO LIBVEX CLIENT */
69362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjvoid LibVEX_GuestMIPS32_initialise( /*OUT*/ VexGuestMIPS32State * vex_state)
70362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj{
71362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r0 = 0;   /* Hardwired to 0 */
72362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r1 = 0;   /* Assembler temporary */
73362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r2 = 0;   /* Values for function returns ... */
74362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r3 = 0;   /* ...and expression evaluation */
75362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r4 = 0;   /* Function arguments */
76362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r5 = 0;
77362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r6 = 0;
78362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r7 = 0;
79362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r8 = 0;   /* Temporaries */
80362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r9 = 0;
81362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r10 = 0;
82362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r11 = 0;
83362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r12 = 0;
84362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r13 = 0;
85362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r14 = 0;
86362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r15 = 0;
87362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r16 = 0;  /* Saved temporaries */
88362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r17 = 0;
89362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r18 = 0;
90362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r19 = 0;
91362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r20 = 0;
92362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r21 = 0;
93362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r22 = 0;
94362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r23 = 0;
95362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r24 = 0;  /* Temporaries */
96362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r25 = 0;
97362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r26 = 0;  /* Reserved for OS kernel */
98362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r27 = 0;
99362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r28 = 0;  /* Global pointer */
100362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r29 = 0;  /* Stack pointer */
101362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r30 = 0;  /* Frame pointer */
102362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_r31 = 0;  /* Return address */
103362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_PC = 0;   /* Program counter */
104362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_HI = 0;   /* Multiply and divide register higher result */
105362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_LO = 0;   /* Multiply and divide register lower result */
106362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
107362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* FPU Registers */
10814360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f0 = 0x7ff800007ff80000ULL; /* Floting point GP registers */
10914360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f1 = 0x7ff800007ff80000ULL;
11014360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f2 = 0x7ff800007ff80000ULL;
11114360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f3 = 0x7ff800007ff80000ULL;
11214360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f4 = 0x7ff800007ff80000ULL;
11314360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f5 = 0x7ff800007ff80000ULL;
11414360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f6 = 0x7ff800007ff80000ULL;
11514360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f7 = 0x7ff800007ff80000ULL;
11614360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f8 = 0x7ff800007ff80000ULL;
11714360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f9 = 0x7ff800007ff80000ULL;
11814360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f10 = 0x7ff800007ff80000ULL;
11914360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f11 = 0x7ff800007ff80000ULL;
12014360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f12 = 0x7ff800007ff80000ULL;
12114360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f13 = 0x7ff800007ff80000ULL;
12214360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f14 = 0x7ff800007ff80000ULL;
12314360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f15 = 0x7ff800007ff80000ULL;
12414360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f16 = 0x7ff800007ff80000ULL;
12514360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f17 = 0x7ff800007ff80000ULL;
12614360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f18 = 0x7ff800007ff80000ULL;
12714360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f19 = 0x7ff800007ff80000ULL;
12814360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f20 = 0x7ff800007ff80000ULL;
12914360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f21 = 0x7ff800007ff80000ULL;
13014360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f22 = 0x7ff800007ff80000ULL;
13114360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f23 = 0x7ff800007ff80000ULL;
13214360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f24 = 0x7ff800007ff80000ULL;
13314360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f25 = 0x7ff800007ff80000ULL;
13414360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f26 = 0x7ff800007ff80000ULL;
13514360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f27 = 0x7ff800007ff80000ULL;
13614360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f28 = 0x7ff800007ff80000ULL;
13714360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f29 = 0x7ff800007ff80000ULL;
13814360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f30 = 0x7ff800007ff80000ULL;
13914360e9a2a3e36ff68266ed8d664072918f44c45dejanj   vex_state->guest_f31 = 0x7ff800007ff80000ULL;
140362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
141362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_FIR = 0;  /* FP implementation and revision register */
142362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_FCCR = 0; /* FP condition codes register */
143362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_FEXR = 0; /* FP exceptions register */
144362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_FENR = 0; /* FP enables register */
145362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_FCSR = 0; /* FP control/status register */
146362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_ULR = 0; /* TLS */
147362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
148362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Various pseudo-regs mandated by Vex or Valgrind. */
1496ef84bed9bb3af22060eb1759788034602bbcc88florian   /* Emulation notes */
1506ef84bed9bb3af22060eb1759788034602bbcc88florian   vex_state->guest_EMNOTE = 0;
151362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
152362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* For clflush: record start and length of area to invalidate */
15305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   vex_state->guest_CMSTART = 0;
15405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   vex_state->guest_CMLEN = 0;
155362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->host_EvC_COUNTER = 0;
156362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->host_EvC_FAILADDR = 0;
157362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
158362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Used to record the unredirected guest address at the start of
159b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      a translation whose start has been redirected. By reading
160b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      this pseudo-register shortly afterwards, the translation can
161b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      find out what the corresponding no-redirection address was.
162b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      Note, this is only set for wrap-style redirects, not for
163b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      replace-style ones. */
164b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_NRADDR = 0;
165b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
166b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_COND = 0;
167c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
168c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   /* MIPS32 DSP ASE(r2) specific registers */
169c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   vex_state->guest_DSPControl = 0;   /* DSPControl register */
170c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   vex_state->guest_ac0 = 0;          /* Accumulator 0 */
171c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   vex_state->guest_ac1 = 0;          /* Accumulator 1 */
172c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   vex_state->guest_ac2 = 0;          /* Accumulator 2 */
173c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   vex_state->guest_ac3 = 0;          /* Accumulator 3 */
174b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
175b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
176b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjvoid LibVEX_GuestMIPS64_initialise ( /*OUT*/ VexGuestMIPS64State * vex_state )
177b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
178b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r0 = 0;  /* Hardwired to 0 */
179b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r1 = 0;  /* Assembler temporary */
180b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r2 = 0;  /* Values for function returns ... */
181b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r3 = 0;
182b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r4 = 0;  /* Function arguments */
183b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r5 = 0;
184b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r6 = 0;
185b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r7 = 0;
186b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r8 = 0;
187b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r9 = 0;
188b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r10 = 0;
189b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r11 = 0;
190b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r12 = 0;  /* Temporaries */
191b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r13 = 0;
192b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r14 = 0;
193b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r15 = 0;
194b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r16 = 0;  /* Saved temporaries */
195b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r17 = 0;
196b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r18 = 0;
197b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r19 = 0;
198b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r20 = 0;
199b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r21 = 0;
200b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r22 = 0;
201b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r23 = 0;
202b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r24 = 0;  /* Temporaries */
203b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r25 = 0;
204b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r26 = 0;  /* Reserved for OS kernel */
205b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r27 = 0;
206b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r28 = 0;  /* Global pointer */
207b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r29 = 0;  /* Stack pointer */
208b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r30 = 0;  /* Frame pointer */
209b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_r31 = 0;  /* Return address */
210b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_PC = 0;   /* Program counter */
211b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_HI = 0;   /* Multiply and divide register higher result */
212b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_LO = 0;   /* Multiply and divide register lower result */
213b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
214b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* FPU Registers */
2151df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f0 =  0x7ff800007ff80000ULL;  /* Floting point registers */
2161df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f1 =  0x7ff800007ff80000ULL;
2171df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f2 =  0x7ff800007ff80000ULL;
2181df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f3 =  0x7ff800007ff80000ULL;
2191df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f4 =  0x7ff800007ff80000ULL;
2201df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f5 =  0x7ff800007ff80000ULL;
2211df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f6 =  0x7ff800007ff80000ULL;
2221df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f7 =  0x7ff800007ff80000ULL;
2231df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f8 =  0x7ff800007ff80000ULL;
2241df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f9 =  0x7ff800007ff80000ULL;
2251df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f10 = 0x7ff800007ff80000ULL;
2261df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f11 = 0x7ff800007ff80000ULL;
2271df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f12 = 0x7ff800007ff80000ULL;
2281df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f13 = 0x7ff800007ff80000ULL;
2291df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f14 = 0x7ff800007ff80000ULL;
2301df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f15 = 0x7ff800007ff80000ULL;
2311df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f16 = 0x7ff800007ff80000ULL;
2321df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f17 = 0x7ff800007ff80000ULL;
2331df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f18 = 0x7ff800007ff80000ULL;
2341df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f19 = 0x7ff800007ff80000ULL;
2351df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f20 = 0x7ff800007ff80000ULL;
2361df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f21 = 0x7ff800007ff80000ULL;
2371df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f22 = 0x7ff800007ff80000ULL;
2381df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f23 = 0x7ff800007ff80000ULL;
2391df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f24 = 0x7ff800007ff80000ULL;
2401df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f25 = 0x7ff800007ff80000ULL;
2411df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f26 = 0x7ff800007ff80000ULL;
2421df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f27 = 0x7ff800007ff80000ULL;
2431df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f28 = 0x7ff800007ff80000ULL;
2441df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f29 = 0x7ff800007ff80000ULL;
2451df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f30 = 0x7ff800007ff80000ULL;
2461df406c132414bf16de6be0fba53855c60b7ef27dejanj   vex_state->guest_f31 = 0x7ff800007ff80000ULL;
247b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
248b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_FIR = 0;   /* FP implementation and revision register */
249b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_FCCR = 0;  /* FP condition codes register */
250b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_FEXR = 0;  /* FP exceptions register */
251b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_FENR = 0;  /* FP enables register */
252b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_FCSR = 0;  /* FP control/status register */
253b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
254b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_ULR = 0;
255b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
256b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Various pseudo-regs mandated by Vex or Valgrind. */
257b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Emulation notes */
258b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->guest_EMNOTE = 0;
259b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
260b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* For clflush: record start and length of area to invalidate */
26105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   vex_state->guest_CMSTART = 0;
26205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj   vex_state->guest_CMLEN = 0;
263b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->host_EvC_COUNTER = 0;
264b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   vex_state->host_EvC_FAILADDR = 0;
265b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
266b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Used to record the unredirected guest address at the start of
267b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      a translation whose start has been redirected. By reading
268362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      this pseudo-register shortly afterwards, the translation can
269362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      find out what the corresponding no-redirection address was.
270362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      Note, this is only set for wrap-style redirects, not for
271362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      replace-style ones. */
272362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_NRADDR = 0;
273362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
274362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   vex_state->guest_COND = 0;
275362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj}
276362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
277362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*-----------------------------------------------------------*/
278362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- Describing the mips guest state, for the benefit    ---*/
279362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- of iropt and instrumenters.                         ---*/
280362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*-----------------------------------------------------------*/
281362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
282362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* Figure out if any part of the guest state contained in minoff
283362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .. maxoff requires precise memory exceptions.  If in doubt return
284c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   True (but this generates significantly slower code).
285362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
286362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   We enforce precise exns for guest SP, PC.
2876c46befd9eb90c1b6e739926c1fa335cba75bf46philippe
288c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj   Only SP is needed in mode VexRegUpdSpAtMemAccess.
289362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj*/
290ca2c3c75784d35d136fc7c952717cdee5063c193sewardjBool guest_mips32_state_requires_precise_mem_exns (
291ca2c3c75784d35d136fc7c952717cdee5063c193sewardj        Int minoff, Int maxoff, VexRegisterUpdates pxControl
292ca2c3c75784d35d136fc7c952717cdee5063c193sewardj     )
293362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj{
294362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int sp_min = offsetof(VexGuestMIPS32State, guest_r29);
295362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int sp_max = sp_min + 4 - 1;
296362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int pc_min = offsetof(VexGuestMIPS32State, guest_PC);
297362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int pc_max = pc_min + 4 - 1;
298362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
299362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   if (maxoff < sp_min || minoff > sp_max) {
300362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      /* no overlap with sp */
301ca2c3c75784d35d136fc7c952717cdee5063c193sewardj      if (pxControl == VexRegUpdSpAtMemAccess)
302b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         return False;  /* We only need to check stack pointer. */
303362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   } else {
304362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      return True;
305362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   }
306362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
307362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   if (maxoff < pc_min || minoff > pc_max) {
308362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      /* no overlap with pc */
309362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   } else {
310362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      return True;
311362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   }
312362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
313362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* We appear to need precise updates of R11 in order to get proper
314362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      stacktraces from non-optimised code. */
315362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int fp_min = offsetof(VexGuestMIPS32State, guest_r30);
316362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   Int fp_max = fp_min + 4 - 1;
317362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
318362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   if (maxoff < fp_min || minoff > fp_max) {
319362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      /* no overlap with fp */
320362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   } else {
321362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      return True;
322362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   }
323362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
324362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   return False;
325362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj}
326362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
327ca2c3c75784d35d136fc7c952717cdee5063c193sewardjBool guest_mips64_state_requires_precise_mem_exns (
328ca2c3c75784d35d136fc7c952717cdee5063c193sewardj        Int minoff, Int maxoff, VexRegisterUpdates pxControl
329ca2c3c75784d35d136fc7c952717cdee5063c193sewardj     )
330b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
331b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int sp_min = offsetof(VexGuestMIPS64State, guest_r29);
332b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int sp_max = sp_min + 8 - 1;
333b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int pc_min = offsetof(VexGuestMIPS64State, guest_PC);
334b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int pc_max = pc_min + 8 - 1;
335b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
336b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   if ( maxoff < sp_min || minoff > sp_max ) {
337b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      /* no overlap with sp */
338ca2c3c75784d35d136fc7c952717cdee5063c193sewardj      if (pxControl == VexRegUpdSpAtMemAccess)
339b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         return False;  /* We only need to check stack pointer. */
340b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   } else {
341b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      return True;
342b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   }
343b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
344b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   if ( maxoff < pc_min || minoff > pc_max ) {
345b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      /* no overlap with pc */
346b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   } else {
347b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      return True;
348b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   }
349b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
350b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int fp_min = offsetof(VexGuestMIPS64State, guest_r30);
351b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   Int fp_max = fp_min + 8 - 1;
352b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
353b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   if ( maxoff < fp_min || minoff > fp_max ) {
354b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      /* no overlap with fp */
355b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   } else {
356b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      return True;
357b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   }
358b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
359b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   return False;
360b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
361b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
362362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjVexGuestLayout mips32Guest_layout = {
363362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Total size of the guest state, in bytes. */
364362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .total_sizeB = sizeof(VexGuestMIPS32State),
365362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Describe the stack pointer. */
366362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .offset_SP = offsetof(VexGuestMIPS32State, guest_r29),
367362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .sizeof_SP = 4,
368362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Describe the frame pointer. */
369362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .offset_FP = offsetof(VexGuestMIPS32State, guest_r30),
370362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .sizeof_FP = 4,
371362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Describe the instruction pointer. */
372362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .offset_IP = offsetof(VexGuestMIPS32State, guest_PC),
373362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .sizeof_IP = 4,
374362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* Describe any sections to be regarded by Memcheck as
375362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      'always-defined'. */
376362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .n_alwaysDefd = 8,
377362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   /* ? :(  */
378362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   .alwaysDefd = {
379362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             /* 0 */ ALWAYSDEFD32(guest_r0),
380362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             /* 1 */ ALWAYSDEFD32(guest_r1),
3816ef84bed9bb3af22060eb1759788034602bbcc88florian             /* 2 */ ALWAYSDEFD32(guest_EMNOTE),
38205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj             /* 3 */ ALWAYSDEFD32(guest_CMSTART),
38305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj             /* 4 */ ALWAYSDEFD32(guest_CMLEN),
384362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             /* 5 */ ALWAYSDEFD32(guest_r29),
385362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             /* 6 */ ALWAYSDEFD32(guest_r31),
386362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             /* 7 */ ALWAYSDEFD32(guest_ULR)
387362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj             }
388362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj};
389362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
390b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjVexGuestLayout mips64Guest_layout = {
391b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Total size of the guest state, in bytes. */
392b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .total_sizeB = sizeof(VexGuestMIPS64State),
393b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Describe the stack pointer. */
394b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .offset_SP = offsetof(VexGuestMIPS64State, guest_r29),
395b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .sizeof_SP = 8,
396b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Describe the frame pointer. */
397b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .offset_FP = offsetof(VexGuestMIPS64State, guest_r30),
398b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .sizeof_FP = 8,
399b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Describe the instruction pointer. */
400b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .offset_IP = offsetof(VexGuestMIPS64State, guest_PC),
401b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .sizeof_IP = 8,
402b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* Describe any sections to be regarded by Memcheck as
403b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      'always-defined'. */
404b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .n_alwaysDefd = 7,
405b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   /* ? :(  */
406b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   .alwaysDefd = {
407b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  /* 0 */ ALWAYSDEFD64 (guest_r0),
408b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  /* 1 */ ALWAYSDEFD64 (guest_EMNOTE),
40905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                  /* 2 */ ALWAYSDEFD64 (guest_CMSTART),
41005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj                  /* 3 */ ALWAYSDEFD64 (guest_CMLEN),
411b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  /* 4 */ ALWAYSDEFD64 (guest_r29),
412b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  /* 5 */ ALWAYSDEFD64 (guest_r31),
413b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  /* 6 */ ALWAYSDEFD64 (guest_ULR)
414b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj                  }
415b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj};
416b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
417362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#define ASM_VOLATILE_CASE(rd, sel) \
418b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         case rd: \
419b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj            asm volatile ("mfc0 %0, $" #rd ", "#sel"\n\t" :"=r" (x) ); \
420b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj            break;
421362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
422362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjUInt mips32_dirtyhelper_mfc0(UInt rd, UInt sel)
423362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj{
424362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   UInt x = 0;
425362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
426362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   switch (sel) {
427362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 0:
428b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
429362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
430362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 0);
431362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 0);
432362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 0);
433362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 0);
434362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 0);
435362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 0);
436362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 0);
437362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 0);
438362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 0);
439362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 0);
440362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 0);
441362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 0);
442362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 0);
443362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 0);
444362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 0);
445362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 0);
446362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 0);
447362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 0);
448362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 0);
449362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 0);
450362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 0);
451362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 0);
452362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 0);
453362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 0);
454362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 0);
455362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 0);
456362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 0);
457362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 0);
458362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 0);
459362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 0);
460362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 0);
461362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 0);
462362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
463362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
464362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
465362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
466362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 1:
467b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
468362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
469362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 1);
470362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 1);
471362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 1);
472362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 1);
473362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 1);
474362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 1);
475362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 1);
476362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 1);
477362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 1);
478362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 1);
479362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 1);
480362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 1);
481362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 1);
482362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 1);
483362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 1);
484362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 1);
485362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 1);
486362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 1);
487362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 1);
488362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 1);
489362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 1);
490362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 1);
491362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 1);
492362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 1);
493362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 1);
494362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 1);
495362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 1);
496362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 1);
497362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 1);
498362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 1);
499362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 1);
500362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 1);
501362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
502362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
503362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
504362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
505362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 2:
506b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
507362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
508362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 2);
509362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 2);
510362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 2);
511362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 1);
512362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 2);
513362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 2);
514362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 2);
515362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 2);
516362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 2);
517362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 2);
518362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 2);
519362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 2);
520362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 2);
521362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 2);
522362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 2);
523362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 2);
524362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 2);
525362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 2);
526362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 2);
527362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 2);
528362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 2);
529362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 2);
530362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 2);
531362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 2);
532362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 2);
533362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 2);
534362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 2);
535362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 2);
536362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 2);
537362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 2);
538362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 2);
539362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 2);
540362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
541362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
542362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
543362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
544362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 3:
545b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
546362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
547362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 3);
548362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 3);
549362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 3);
550362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 3);
551362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 3);
552362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 3);
553362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 3);
554362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 3);
555362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 3);
556362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 3);
557362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 3);
558362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 3);
559362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 3);
560362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 3);
561362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 3);
562362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 3);
563362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 3);
564362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 3);
565362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 3);
566362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 3);
567362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 3);
568362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 3);
569362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 3);
570362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 3);
571362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 3);
572362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 3);
573362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 3);
574362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 3);
575362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 3);
576362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 3);
577362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 3);
578362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 3);
579362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
580362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
581362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
582362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
583362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 4:
584b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
585362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
586362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 4);
587362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 4);
588362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 4);
589362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 4);
590362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 4);
591362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 4);
592362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 4);
593362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 4);
594362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 4);
595362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 4);
596362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 4);
597362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 4);
598362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 4);
599362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 4);
600362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 4);
601362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 4);
602362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 4);
603362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 4);
604362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 4);
605362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 4);
606362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 4);
607362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 4);
608362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 4);
609362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 4);
610362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 4);
611362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 4);
612362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 4);
613362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 4);
614362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 4);
615362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 4);
616362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 4);
617362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 4);
618362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
619362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
620362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
621362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
622362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 5:
623b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
624362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
625362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 5);
626362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 5);
627362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 5);
628362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 5);
629362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 5);
630362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 5);
631362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 5);
632362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 5);
633362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 5);
634362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 5);
635362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 5);
636362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 5);
637362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 5);
638362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 5);
639362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 5);
640362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 5);
641362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 5);
642362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 5);
643362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 5);
644362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 5);
645362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 5);
646362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 5);
647362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 5);
648362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 5);
649362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 5);
650362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 5);
651362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 5);
652362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 5);
653362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 5);
654362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 5);
655362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 5);
656362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 5);
657362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
658362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
659362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
660362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
661362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 6:
662b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
663362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
664362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 6);
665362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 6);
666362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 6);
667362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 6);
668362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 6);
669362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 6);
670362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 6);
671362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 6);
672362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 6);
673362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 6);
674362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 6);
675362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 6);
676362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 6);
677362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 6);
678362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 6);
679362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 6);
680362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 6);
681362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 6);
682362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 6);
683362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 6);
684362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 6);
685362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 6);
686362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 6);
687362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 6);
688362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 6);
689362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 6);
690362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 6);
691362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 6);
692362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 6);
693362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 6);
694362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 6);
695362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 6);
696362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
697362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
698362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
699362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         break;
700362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      case 7:
701b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         /* __asm__("mfc0 %0, $1, 0" :"=r" (x)); */
702362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         switch (rd) {
703362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(0, 7);
704362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(1, 7);
705362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(2, 7);
706362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(3, 7);
707362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(4, 7);
708362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(5, 7);
709362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(6, 7);
710362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(7, 7);
711362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(8, 7);
712362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(9, 7);
713362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(10, 7);
714362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(11, 7);
715362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(12, 7);
716362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(13, 7);
717362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(14, 7);
718362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(15, 7);
719362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(16, 7);
720362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(17, 7);
721362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(18, 7);
722362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(19, 7);
723362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(20, 7);
724362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(21, 7);
725362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(22, 7);
726362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(23, 7);
727362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(24, 7);
728362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(25, 7);
729362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(26, 7);
730362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(27, 7);
731362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(28, 7);
732362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(29, 7);
733362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(30, 7);
734362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            ASM_VOLATILE_CASE(31, 7);
735362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         default:
736362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj            break;
737362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj         }
738362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      break;
739362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
740362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   default:
741362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj      break;
742362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   }
743362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#endif
744362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj   return x;
745362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj}
746362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
747362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#undef ASM_VOLATILE_CASE
748362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj
749362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#define ASM_VOLATILE_CASE(rd, sel) \
750b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         case rd: \
751b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj            asm volatile ("dmfc0 %0, $" #rd ", "#sel"\n\t" :"=r" (x) ); \
752b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj            break;
753b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
754b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjULong mips64_dirtyhelper_dmfc0 ( UInt rd, UInt sel )
755b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
756b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   ULong x = 0;
757b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#if defined(VGP_mips64_linux)
758b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   switch (sel) {
759b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 0:
760b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
761b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
762b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 0);
763b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 0);
764b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 0);
765b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 0);
766b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 0);
767b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 0);
768b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 0);
769b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 0);
770b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 0);
771b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 0);
772b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 0);
773b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 0);
774b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 0);
775b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 0);
776b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 0);
777b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 0);
778b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 0);
779b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 0);
780b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 0);
781b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 0);
782b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 0);
783b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 0);
784b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 0);
785b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 0);
786b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 0);
787b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 0);
788b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 0);
789b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 0);
790b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 0);
791b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 0);
792b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 0);
793b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 0);
794b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         default:
795b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
796b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        }
797b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
798b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 1:
799b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
800b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
801b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 1);
802b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 1);
803b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 1);
804b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 1);
805b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 1);
806b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 1);
807b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 1);
808b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 1);
809b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 1);
810b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 1);
811b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 1);
812b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 1);
813b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 1);
814b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 1);
815b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 1);
816b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 1);
817b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 1);
818b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 1);
819b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 1);
820b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 1);
821b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 1);
822b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 1);
823b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 1);
824b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 1);
825b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 1);
826b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 1);
827b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 1);
828b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 1);
829b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 1);
830b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 1);
831b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 1);
832b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 1);
833b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        default:
834b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
835b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        }
836b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
837b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 2:
838b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
839b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
840b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 2);
841b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 2);
842b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 2);
843b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 1);
844b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 2);
845b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 2);
846b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 2);
847b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 2);
848b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 2);
849b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 2);
850b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 2);
851b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 2);
852b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 2);
853b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 2);
854b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 2);
855b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 2);
856b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 2);
857b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 2);
858b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 2);
859b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 2);
860b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 2);
861b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 2);
862b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 2);
863b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 2);
864b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 2);
865b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 2);
866b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 2);
867b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 2);
868b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 2);
869b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 2);
870b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 2);
871b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 2);
872b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         default:
873b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
874b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         }
875b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
876b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 3:
877b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
878b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
879b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 3);
880b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 3);
881b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 3);
882b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 3);
883b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 3);
884b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 3);
885b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 3);
886b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 3);
887b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 3);
888b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 3);
889b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 3);
890b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 3);
891b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 3);
892b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 3);
893b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 3);
894b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 3);
895b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 3);
896b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 3);
897b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 3);
898b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 3);
899b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 3);
900b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 3);
901b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 3);
902b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 3);
903b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 3);
904b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 3);
905b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 3);
906b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 3);
907b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 3);
908b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 3);
909b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 3);
910b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 3);
911b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        default:
912b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
913b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        }
914b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
915b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 4:
916b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
917b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
918b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 4);
919b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 4);
920b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 4);
921b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 4);
922b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 4);
923b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 4);
924b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 4);
925b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 4);
926b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 4);
927b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 4);
928b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 4);
929b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 4);
930b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 4);
931b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 4);
932b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 4);
933b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 4);
934b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 4);
935b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 4);
936b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 4);
937b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 4);
938b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 4);
939b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 4);
940b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 4);
941b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 4);
942b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 4);
943b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 4);
944b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 4);
945b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 4);
946b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 4);
947b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 4);
948b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 4);
949b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 4);
950b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           default:
951b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj              break;
952b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           }
953b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
954b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 5:
955b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
956b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
957b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 5);
958b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 5);
959b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 5);
960b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 5);
961b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 5);
962b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 5);
963b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 5);
964b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 5);
965b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 5);
966b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 5);
967b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 5);
968b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 5);
969b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 5);
970b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 5);
971b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 5);
972b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 5);
973b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 5);
974b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 5);
975b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 5);
976b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 5);
977b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 5);
978b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 5);
979b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 5);
980b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 5);
981b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 5);
982b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 5);
983b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 5);
984b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 5);
985b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 5);
986b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 5);
987b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 5);
988b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 5);
989b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           default:
990b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj              break;
991b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        }
992b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
993b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 6:
994b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
995b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
996b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 6);
997b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 6);
998b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 6);
999b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 6);
1000b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 6);
1001b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 6);
1002b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 6);
1003b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 6);
1004b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 6);
1005b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 6);
1006b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 6);
1007b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 6);
1008b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 6);
1009b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 6);
1010b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 6);
1011b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 6);
1012b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 6);
1013b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 6);
1014b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 6);
1015b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 6);
1016b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 6);
1017b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 6);
1018b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 6);
1019b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 6);
1020b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 6);
1021b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 6);
1022b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 6);
1023b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 6);
1024b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 6);
1025b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 6);
1026b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 6);
1027b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 6);
1028b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        default:
1029b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
1030b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        }
1031b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        break;
1032b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     case 7:
1033b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        /* __asm__("dmfc0 %0, $1, 0" :"=r" (x)); */
1034b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj        switch (rd) {
1035b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (0, 7);
1036b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (1, 7);
1037b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (2, 7);
1038b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (3, 7);
1039b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (4, 7);
1040b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (5, 7);
1041b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (6, 7);
1042b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (7, 7);
1043b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (8, 7);
1044b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (9, 7);
1045b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (10, 7);
1046b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (11, 7);
1047b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (12, 7);
1048b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (13, 7);
1049b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (14, 7);
1050b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (15, 7);
1051b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (16, 7);
1052b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (17, 7);
1053b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (18, 7);
1054b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (19, 7);
1055b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (20, 7);
1056b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (21, 7);
1057b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (22, 7);
1058b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (23, 7);
1059b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (24, 7);
1060b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (25, 7);
1061b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (26, 7);
1062b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (27, 7);
1063b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (28, 7);
1064b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (29, 7);
1065b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (30, 7);
1066b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           ASM_VOLATILE_CASE (31, 7);
1067b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         default:
1068b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj           break;
1069b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         }
1070b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj       break;
1071c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj
1072b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     default:
1073b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj       break;
1074b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj     }
1075b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#endif
1076b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   return x;
1077b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
1078b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
1079b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
1080a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanjUInt mips32_dirtyhelper_rdhwr ( UInt rt, UInt rd )
1081a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj{
1082a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj   UInt x = 0;
1083a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj   switch (rd) {
1084a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj      case 1:  /* x = SYNCI_StepSize() */
1085a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj         __asm__ __volatile__("rdhwr %0, $1\n\t" : "=r" (x) );
1086a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj         break;
1087a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj
1088a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj      default:
1089a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj         vassert(0);
1090a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj         break;
1091a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj   }
1092a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj   return x;
1093a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj}
1094a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj
1095b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjULong mips64_dirtyhelper_rdhwr ( ULong rt, ULong rd )
1096b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{
1097b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   ULong x = 0;
1098b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   switch (rd) {
1099b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      case 1:  /* x = SYNCI_StepSize() */
1100b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         __asm__ __volatile__("rdhwr %0, $1\n\t" : "=r" (x) );
1101b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
1102b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
1103b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj      default:
1104b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         vassert(0);
1105b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj         break;
1106b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   }
1107b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj   return x;
1108b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj}
1109b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#endif
1110b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj
11114183322f42e2bf4796c838a9a1475369d13c9530dejanj#define ASM_VOLATILE_UNARY32(inst)                                  \
11124183322f42e2bf4796c838a9a1475369d13c9530dejanj   __asm__ volatile("cfc1  $t0,  $31"   "\n\t"                      \
11134183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  %2,   $31"   "\n\t"                      \
11144183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %1,   $f20"  "\n\t"                      \
11154183322f42e2bf4796c838a9a1475369d13c9530dejanj                    #inst" $f20, $f20"  "\n\t"                      \
11164183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "cfc1  %0,   $31"   "\n\t"                      \
11174183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  $t0,  $31"   "\n\t"                      \
1118a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj                    : "=r" (ret)                                    \
11194183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "r" (loFsVal), "r" (fcsr)                     \
11204183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "t0", "$f20"                                  \
1121a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj                   );
1122a445f1bbe9763e289e1004055b21a9ac6e005bd9dejanj
11234183322f42e2bf4796c838a9a1475369d13c9530dejanj#define ASM_VOLATILE_UNARY32_DOUBLE(inst)                           \
11244183322f42e2bf4796c838a9a1475369d13c9530dejanj   __asm__ volatile("cfc1  $t0,  $31"   "\n\t"                      \
11254183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  %3,   $31"   "\n\t"                      \
11264183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %1,   $f20"  "\n\t"                      \
11274183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %2,   $f21"  "\n\t"                      \
11284183322f42e2bf4796c838a9a1475369d13c9530dejanj                    #inst" $f20, $f20"  "\n\t"                      \
11294183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "cfc1  %0,   $31"   "\n\t"                      \
11304183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  $t0,  $31"   "\n\t"                      \
11318007ea6cf7eb93ab51c7a334583d0192df202910dejanj                    : "=r" (ret)                                    \
11324183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "r" (loFsVal), "r" (hiFsVal), "r" (fcsr)      \
11334183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "t0", "$f20", "$f21"                          \
11348007ea6cf7eb93ab51c7a334583d0192df202910dejanj                   );
11358007ea6cf7eb93ab51c7a334583d0192df202910dejanj
11364183322f42e2bf4796c838a9a1475369d13c9530dejanj#define ASM_VOLATILE_UNARY64(inst)                                  \
11370e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   __asm__ volatile("cfc1  $t0,  $31"    "\n\t"                     \
11380e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ctc1  %2,   $31"    "\n\t"                     \
11390e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ldc1  $f24, 0(%1)"  "\n\t"                     \
11400e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    #inst" $f24, $f24"   "\n\t"                     \
11410e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "cfc1  %0,   $31"    "\n\t"                     \
11420e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ctc1  $t0,  $31"    "\n\t"                     \
11438007ea6cf7eb93ab51c7a334583d0192df202910dejanj                    : "=r" (ret)                                    \
11440e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    : "r" (&(addr[fs])), "r" (fcsr)                 \
11454183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "t0", "$f24"                                  \
11464183322f42e2bf4796c838a9a1475369d13c9530dejanj                   );
11474183322f42e2bf4796c838a9a1475369d13c9530dejanj
11484183322f42e2bf4796c838a9a1475369d13c9530dejanj#define ASM_VOLATILE_BINARY32(inst)                                 \
11494183322f42e2bf4796c838a9a1475369d13c9530dejanj   __asm__ volatile("cfc1  $t0,  $31"         "\n\t"                \
11504183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  %3,   $31"         "\n\t"                \
11514183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %1,   $f20"        "\n\t"                \
11524183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %2,   $f22"        "\n\t"                \
11534183322f42e2bf4796c838a9a1475369d13c9530dejanj                    #inst" $f20, $f20, $f22"  "\n\t"                \
11544183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "cfc1  %0,   $31"         "\n\t"                \
11554183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  $t0,  $31"         "\n\t"                \
11564183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "=r" (ret)                                    \
11574183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "r" (loFsVal), "r" (loFtVal), "r" (fcsr)      \
11584183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "t0", "$f20", "$f22"                          \
11594183322f42e2bf4796c838a9a1475369d13c9530dejanj                   );
11604183322f42e2bf4796c838a9a1475369d13c9530dejanj
11614183322f42e2bf4796c838a9a1475369d13c9530dejanj#define ASM_VOLATILE_BINARY32_DOUBLE(inst)                          \
11624183322f42e2bf4796c838a9a1475369d13c9530dejanj   __asm__ volatile("cfc1  $t0,  $31"         "\n\t"                \
11634183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  %5,   $31"         "\n\t"                \
11644183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %1,   $f20"        "\n\t"                \
11654183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %2,   $f21"        "\n\t"                \
11664183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %3,   $f22"        "\n\t"                \
11674183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "mtc1  %4,   $f23"        "\n\t"                \
11684183322f42e2bf4796c838a9a1475369d13c9530dejanj                    #inst" $f20, $f20, $f22"  "\n\t"                \
11694183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "cfc1  %0,   $31"         "\n\t"                \
11704183322f42e2bf4796c838a9a1475369d13c9530dejanj                    "ctc1  $t0,  $31"         "\n\t"                \
11714183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "=r" (ret)                                    \
11724183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "r" (loFsVal), "r" (hiFsVal), "r" (loFtVal),  \
11734183322f42e2bf4796c838a9a1475369d13c9530dejanj                      "r" (hiFtVal), "r" (fcsr)                     \
11744183322f42e2bf4796c838a9a1475369d13c9530dejanj                    : "t0", "$f20", "$f21", "$f22", "$f23"          \
11754183322f42e2bf4796c838a9a1475369d13c9530dejanj                   );
11764183322f42e2bf4796c838a9a1475369d13c9530dejanj
11770e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#define ASM_VOLATILE_BINARY64(inst)                                     \
11780e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   __asm__ volatile("cfc1  $t0,  $31"         "\n\t"                    \
11790e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ctc1  %3,   $31"         "\n\t"                    \
11800e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ldc1  $f24, 0(%1)"       "\n\t"                    \
11810e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ldc1  $f26, 0(%2)"       "\n\t"                    \
11820e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    #inst" $f24, $f24, $f26"  "\n\t"                    \
11830e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "cfc1  %0,   $31"         "\n\t"                    \
11840e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    "ctc1  $t0,  $31"         "\n\t"                    \
11850e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    : "=r" (ret)                                        \
11860e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    : "r" (&(addr[fs])), "r" (&(addr[ft])), "r" (fcsr)  \
11870e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                    : "t0", "$f24", "$f26"                              \
11888007ea6cf7eb93ab51c7a334583d0192df202910dejanj                   );
11898007ea6cf7eb93ab51c7a334583d0192df202910dejanj
11908007ea6cf7eb93ab51c7a334583d0192df202910dejanj/* TODO: Add cases for all fpu instructions because all fpu instructions are
11918007ea6cf7eb93ab51c7a334583d0192df202910dejanj         change the value of FCSR register. */
11920e006f25d4016d7845bd016b65b5d2676a4e8c92dejanjextern UInt mips_dirtyhelper_calculate_FCSR_fp32 ( void* gs, UInt fs, UInt ft,
11930e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                                                   flt_op inst )
11940e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj{
11950e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   UInt ret = 0;
11960e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#if defined(__mips__)
11970e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   VexGuestMIPS32State* guest_state = (VexGuestMIPS32State*)gs;
11980e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   UInt loFsVal, hiFsVal, loFtVal, hiFtVal;
11990e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#if defined (_MIPSEL)
12000e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   ULong *addr = (ULong *)&guest_state->guest_f0;
12010e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   loFsVal     = (UInt)addr[fs];
12020e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   hiFsVal     = (UInt)addr[fs+1];
12030e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   loFtVal     = (UInt)addr[ft];
12040e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   hiFtVal     = (UInt)addr[ft+1];
12050e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#elif defined (_MIPSEB)
12060e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   UInt *addr = (UInt *)&guest_state->guest_f0;
12070e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   loFsVal    = (UInt)addr[fs*2];
12080e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   hiFsVal    = (UInt)addr[fs*2+2];
12090e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   loFtVal    = (UInt)addr[ft*2];
12100e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   hiFtVal    = (UInt)addr[ft*2+2];
12110e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#endif
12120e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   UInt fcsr     = guest_state->guest_FCSR;
12130e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   switch (inst) {
12140e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ROUNDWD:
12150e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(round.w.d)
12160e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12170e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case FLOORWS:
12180e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(floor.w.s)
12190e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12200e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case FLOORWD:
12210e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(floor.w.d)
12220e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12230e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case TRUNCWS:
12240e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(trunc.w.s)
12250e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12260e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case TRUNCWD:
12270e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(trunc.w.d)
12280e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12290e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CEILWS:
12300e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(ceil.w.s)
12310e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12320e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CEILWD:
12330e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(ceil.w.d)
12340e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12350e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTDS:
12360e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(cvt.d.s)
12370e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12380e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTDW:
12390e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(cvt.d.w)
12400e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12410e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTSW:
12420e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(cvt.s.w)
12430e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12440e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTSD:
12450e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(cvt.s.d)
12460e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12470e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTWS:
12480e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(cvt.w.s)
12490e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12500e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTWD:
12510e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(cvt.w.d)
12520e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12530e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ROUNDWS:
12540e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(round.w.s)
12550e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12560e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#if ((__mips == 32) && defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) \
12570e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj    || (__mips == 64)
12580e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CEILLS:
12590e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(ceil.l.s)
12600e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12610e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CEILLD:
12620e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(ceil.l.d)
12630e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12640e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTDL:
12650e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(cvt.d.l)
12660e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12670e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTLS:
12680e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(cvt.l.s)
12690e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12700e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTLD:
12710e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(cvt.l.d)
12720e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12730e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case CVTSL:
12740e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(cvt.s.l)
12750e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12760e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case FLOORLS:
12770e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(floor.l.s)
12780e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12790e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case FLOORLD:
12800e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(floor.l.d)
12810e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12820e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ROUNDLS:
12830e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(round.l.s)
12840e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12850e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ROUNDLD:
12860e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(round.l.d)
12870e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12880e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case TRUNCLS:
12890e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32(trunc.l.s)
12900e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12910e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case TRUNCLD:
12920e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY32_DOUBLE(trunc.l.d)
12930e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
12940e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#endif
12950e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ADDS:
12960e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY32(add.s)
12970e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          break;
12980e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case ADDD:
12990e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY32_DOUBLE(add.d)
13000e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          break;
13010e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case SUBS:
13020e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY32(sub.s)
13030e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          break;
13040e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case SUBD:
13050e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY32_DOUBLE(sub.d)
13060e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          break;
13070e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      case DIVS:
13080e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY32(div.s)
13090e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          break;
13100e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj      default:
13110e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         vassert(0);
13120e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         break;
13130e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   }
13140e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj#endif
13150e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   return ret;
13160e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj}
13170e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj
13180e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj/* TODO: Add cases for all fpu instructions because all fpu instructions are
13190e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         change the value of FCSR register. */
13200e006f25d4016d7845bd016b65b5d2676a4e8c92dejanjextern UInt mips_dirtyhelper_calculate_FCSR_fp64 ( void* gs, UInt fs, UInt ft,
13210e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj                                                   flt_op inst )
13228007ea6cf7eb93ab51c7a334583d0192df202910dejanj{
13238007ea6cf7eb93ab51c7a334583d0192df202910dejanj   UInt ret = 0;
1324512f059181737ea039985d4d592b1e8c903c3dd6dejanj#if defined(__mips__)
13258007ea6cf7eb93ab51c7a334583d0192df202910dejanj#if defined(VGA_mips32)
13268007ea6cf7eb93ab51c7a334583d0192df202910dejanj   VexGuestMIPS32State* guest_state = (VexGuestMIPS32State*)gs;
13278007ea6cf7eb93ab51c7a334583d0192df202910dejanj#else
13288007ea6cf7eb93ab51c7a334583d0192df202910dejanj   VexGuestMIPS64State* guest_state = (VexGuestMIPS64State*)gs;
13298007ea6cf7eb93ab51c7a334583d0192df202910dejanj#endif
13300e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   ULong *addr = (ULong *)&guest_state->guest_f0;
13310e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj   UInt fcsr   = guest_state->guest_FCSR;
13328007ea6cf7eb93ab51c7a334583d0192df202910dejanj   switch (inst) {
13338007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case ROUNDWD:
13340e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(round.w.d)
13358007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13368007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case FLOORWS:
13370e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(floor.w.s)
13388007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13398007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case FLOORWD:
13400e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(floor.w.d)
13418007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13428007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case TRUNCWS:
13430e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(trunc.w.s)
13448007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13458007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case TRUNCWD:
13460e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(trunc.w.d)
13478007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13488007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CEILWS:
13490e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(ceil.w.s)
13508007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13518007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CEILWD:
13520e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(ceil.w.d)
13538007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13548007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTDS:
13550e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.d.s)
13568007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13578007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTDW:
13580e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.d.w)
13598007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13608007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTSW:
13610e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.s.w)
13628007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13638007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTSD:
13640e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.s.d)
13658007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13668007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTWS:
13670e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.w.s)
13688007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13698007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTWD:
13700e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.w.d)
13718007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13728e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case ROUNDWS:
13730e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(round.w.s)
13748e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
1375e8e46ab072e6da516b7802fab47ec5a43d6ef1f5petarj#if ((__mips == 32) && defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) \
1376e8e46ab072e6da516b7802fab47ec5a43d6ef1f5petarj    || (__mips == 64)
13778e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case CEILLS:
13780e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(ceil.l.s)
13798e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
13808e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case CEILLD:
13810e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(ceil.l.d)
13828e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
13838e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case CVTDL:
13840e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.d.l)
13858e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
13868007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTLS:
13870e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.l.s)
13888007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13898007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case CVTLD:
13900e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.l.d)
13918007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13928e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case CVTSL:
13930e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(cvt.s.l)
13948e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
13958007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case FLOORLS:
13960e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(floor.l.s)
13978007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
13988007ea6cf7eb93ab51c7a334583d0192df202910dejanj      case FLOORLD:
13990e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(floor.l.d)
14008007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
14018e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case ROUNDLS:
14020e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(round.l.s)
14038007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
14048e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case ROUNDLD:
14050e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(round.l.d)
14068e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
14078e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case TRUNCLS:
14080e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(trunc.l.s)
14098e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
14108e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj      case TRUNCLD:
14110e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj         ASM_VOLATILE_UNARY64(trunc.l.d)
14128e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj         break;
14138e70cdcb8d9a8597c524d3fd8af30e529ac70ffepetarj#endif
14144183322f42e2bf4796c838a9a1475369d13c9530dejanj      case ADDS:
14150e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY64(add.s)
14164183322f42e2bf4796c838a9a1475369d13c9530dejanj          break;
14174183322f42e2bf4796c838a9a1475369d13c9530dejanj      case ADDD:
14180e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY64(add.d)
14194183322f42e2bf4796c838a9a1475369d13c9530dejanj          break;
14204183322f42e2bf4796c838a9a1475369d13c9530dejanj      case SUBS:
14210e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY64(sub.s)
14224183322f42e2bf4796c838a9a1475369d13c9530dejanj          break;
14234183322f42e2bf4796c838a9a1475369d13c9530dejanj      case SUBD:
14240e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY64(sub.d)
14254183322f42e2bf4796c838a9a1475369d13c9530dejanj          break;
14264183322f42e2bf4796c838a9a1475369d13c9530dejanj      case DIVS:
14270e006f25d4016d7845bd016b65b5d2676a4e8c92dejanj          ASM_VOLATILE_BINARY64(div.s)
14284183322f42e2bf4796c838a9a1475369d13c9530dejanj          break;
14298007ea6cf7eb93ab51c7a334583d0192df202910dejanj      default:
14308007ea6cf7eb93ab51c7a334583d0192df202910dejanj         vassert(0);
14318007ea6cf7eb93ab51c7a334583d0192df202910dejanj         break;
14328007ea6cf7eb93ab51c7a334583d0192df202910dejanj   }
1433aae16ca81b9b820f5b50c5f8f6fa7360dbeadea3tom#endif
14348007ea6cf7eb93ab51c7a334583d0192df202910dejanj   return ret;
14358007ea6cf7eb93ab51c7a334583d0192df202910dejanj}
14368007ea6cf7eb93ab51c7a334583d0192df202910dejanj
1437362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/
1438362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- end                                guest_mips_helpers.c ---*/
1439362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/
1440