1409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/*
2409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  MIPS32 emulation for qemu: main translation routines.
3409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
4409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  Copyright (c) 2004-2005 Jocelyn Mayer
5409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  Copyright (c) 2006 Marius Groeger (FPU operations)
6409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
7409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
8409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * This library is free software; you can redistribute it and/or
9409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * modify it under the terms of the GNU Lesser General Public
10409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * License as published by the Free Software Foundation; either
11409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * version 2 of the License, or (at your option) any later version.
12409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
13409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * This library is distributed in the hope that it will be useful,
14409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but WITHOUT ANY WARRANTY; without even the implied warranty of
15409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * Lesser General Public License for more details.
17409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
18409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * You should have received a copy of the GNU Lesser General Public
19409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli */
21409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
22409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <stdarg.h>
23409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <stdlib.h>
24409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <stdio.h>
25409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <string.h>
26409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <inttypes.h>
27409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
28409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "cpu.h"
29409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "exec-all.h"
30409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "disas.h"
31409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "tcg-op.h"
32409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "qemu-common.h"
33409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
34409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "helper.h"
35409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GEN_HELPER 1
36409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "helper.h"
37409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
38409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//#define MIPS_DEBUG_DISAS
39409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//#define MIPS_DEBUG_SIGN_EXTENSIONS
40409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
41409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS major opcodes */
42409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
43409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
44409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
45409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* indirect opcode tables */
46409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL  = (0x00 << 26),
47409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_REGIMM   = (0x01 << 26),
48409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CP0      = (0x10 << 26),
49409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CP1      = (0x11 << 26),
50409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CP2      = (0x12 << 26),
51409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CP3      = (0x13 << 26),
52409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL2 = (0x1C << 26),
53409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL3 = (0x1F << 26),
54409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* arithmetic with immediate */
55409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ADDI     = (0x08 << 26),
56409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ADDIU    = (0x09 << 26),
57409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLTI     = (0x0A << 26),
58409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLTIU    = (0x0B << 26),
59409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* logic with immediate */
60409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ANDI     = (0x0C << 26),
61409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ORI      = (0x0D << 26),
62409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_XORI     = (0x0E << 26),
63409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LUI      = (0x0F << 26),
64409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* arithmetic with immediate */
65409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DADDI    = (0x18 << 26),
66409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DADDIU   = (0x19 << 26),
67409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Jump and branches */
68409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_J        = (0x02 << 26),
69409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_JAL      = (0x03 << 26),
70409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
71409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BEQL     = (0x14 << 26),
72409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BNE      = (0x05 << 26),
73409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BNEL     = (0x15 << 26),
74409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLEZ     = (0x06 << 26),
75409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLEZL    = (0x16 << 26),
76409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGTZ     = (0x07 << 26),
77409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGTZL    = (0x17 << 26),
78409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_JALX     = (0x1D << 26),  /* MIPS 16 only */
79409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Load and stores */
80409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LDL      = (0x1A << 26),
81409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LDR      = (0x1B << 26),
82409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LB       = (0x20 << 26),
83409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LH       = (0x21 << 26),
84409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWL      = (0x22 << 26),
85409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LW       = (0x23 << 26),
86409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LBU      = (0x24 << 26),
87409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LHU      = (0x25 << 26),
88409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWR      = (0x26 << 26),
89409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWU      = (0x27 << 26),
90409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SB       = (0x28 << 26),
91409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SH       = (0x29 << 26),
92409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SWL      = (0x2A << 26),
93409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SW       = (0x2B << 26),
94409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDL      = (0x2C << 26),
95409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDR      = (0x2D << 26),
96409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SWR      = (0x2E << 26),
97409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LL       = (0x30 << 26),
98409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LLD      = (0x34 << 26),
99409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LD       = (0x37 << 26),
100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SC       = (0x38 << 26),
101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SCD      = (0x3C << 26),
102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SD       = (0x3F << 26),
103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Floating point load/store */
104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWC1     = (0x31 << 26),
105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWC2     = (0x32 << 26),
106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LDC1     = (0x35 << 26),
107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LDC2     = (0x36 << 26),
108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SWC1     = (0x39 << 26),
109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SWC2     = (0x3A << 26),
110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDC1     = (0x3D << 26),
111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDC2     = (0x3E << 26),
112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* MDMX ASE specific */
113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MDMX     = (0x1E << 26),
114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Cache and prefetch */
115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CACHE    = (0x2F << 26),
116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_PREF     = (0x33 << 26),
117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Reserved major opcode */
118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MAJOR3B_RESERVED = (0x3B << 26),
119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS special opcodes */
122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Shifts */
126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLL      = 0x00 | OPC_SPECIAL,
127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* NOP is SLL r0, r0, 0   */
128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* SSNOP is SLL r0, r0, 1 */
129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* EHB is SLL r0, r0, 3 */
130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SRA      = 0x03 | OPC_SPECIAL,
132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLLV     = 0x04 | OPC_SPECIAL,
133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SRAV     = 0x07 | OPC_SPECIAL,
135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSLLV    = 0x14 | OPC_SPECIAL,
136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRAV    = 0x17 | OPC_SPECIAL,
138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSLL     = 0x38 | OPC_SPECIAL,
139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRA     = 0x3B | OPC_SPECIAL,
141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSLL32   = 0x3C | OPC_SPECIAL,
142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSRA32   = 0x3F | OPC_SPECIAL,
144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Multiplication / division */
145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MULT     = 0x18 | OPC_SPECIAL,
146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MULTU    = 0x19 | OPC_SPECIAL,
147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DIV      = 0x1A | OPC_SPECIAL,
148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DIVU     = 0x1B | OPC_SPECIAL,
149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMULT    = 0x1C | OPC_SPECIAL,
150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMULTU   = 0x1D | OPC_SPECIAL,
151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DDIV     = 0x1E | OPC_SPECIAL,
152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DDIVU    = 0x1F | OPC_SPECIAL,
153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 2 registers arithmetic / logic */
154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ADD      = 0x20 | OPC_SPECIAL,
155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ADDU     = 0x21 | OPC_SPECIAL,
156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SUB      = 0x22 | OPC_SPECIAL,
157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SUBU     = 0x23 | OPC_SPECIAL,
158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_AND      = 0x24 | OPC_SPECIAL,
159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_OR       = 0x25 | OPC_SPECIAL,
160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_XOR      = 0x26 | OPC_SPECIAL,
161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NOR      = 0x27 | OPC_SPECIAL,
162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLT      = 0x2A | OPC_SPECIAL,
163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SLTU     = 0x2B | OPC_SPECIAL,
164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DADD     = 0x2C | OPC_SPECIAL,
165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DADDU    = 0x2D | OPC_SPECIAL,
166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSUB     = 0x2E | OPC_SPECIAL,
167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSUBU    = 0x2F | OPC_SPECIAL,
168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Jumps */
169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Traps */
172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TGE      = 0x30 | OPC_SPECIAL,
173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TGEU     = 0x31 | OPC_SPECIAL,
174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLT      = 0x32 | OPC_SPECIAL,
175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLTU     = 0x33 | OPC_SPECIAL,
176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TEQ      = 0x34 | OPC_SPECIAL,
177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TNE      = 0x36 | OPC_SPECIAL,
178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* HI / LO registers load & stores */
179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFHI     = 0x10 | OPC_SPECIAL,
180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTHI     = 0x11 | OPC_SPECIAL,
181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFLO     = 0x12 | OPC_SPECIAL,
182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTLO     = 0x13 | OPC_SPECIAL,
183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Conditional moves */
184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MOVZ     = 0x0A | OPC_SPECIAL,
185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MOVN     = 0x0B | OPC_SPECIAL,
186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MOVCI    = 0x01 | OPC_SPECIAL,
188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Special */
190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BREAK    = 0x0D | OPC_SPECIAL,
193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SYNC     = 0x0F | OPC_SPECIAL,
195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL15_RESERVED = 0x15 | OPC_SPECIAL,
197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL35_RESERVED = 0x35 | OPC_SPECIAL,
200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL37_RESERVED = 0x37 | OPC_SPECIAL,
201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Multiplication variants of the vr54xx. */
206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* REGIMM (rt field) opcodes */
226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Special2 opcodes */
247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Multiply & xxx operations */
251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MADD     = 0x00 | OPC_SPECIAL2,
252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MADDU    = 0x01 | OPC_SPECIAL2,
253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MUL      = 0x02 | OPC_SPECIAL2,
254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MSUB     = 0x04 | OPC_SPECIAL2,
255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Misc */
257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CLZ      = 0x20 | OPC_SPECIAL2,
258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CLO      = 0x21 | OPC_SPECIAL2,
259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DCLO     = 0x25 | OPC_SPECIAL2,
261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Special */
262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Special3 opcodes */
266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_EXT      = 0x00 | OPC_SPECIAL3,
270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DEXT     = 0x03 | OPC_SPECIAL3,
273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_INS      = 0x04 | OPC_SPECIAL3,
274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DINSM    = 0x05 | OPC_SPECIAL3,
275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DINSU    = 0x06 | OPC_SPECIAL3,
276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DINS     = 0x07 | OPC_SPECIAL3,
277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_FORK     = 0x08 | OPC_SPECIAL3,
278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_YIELD    = 0x09 | OPC_SPECIAL3,
279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* BSHFL opcodes */
285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_WSBH     = (0x02 << 6) | OPC_BSHFL,
289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SEB      = (0x10 << 6) | OPC_BSHFL,
290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SEH      = (0x18 << 6) | OPC_BSHFL,
291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* DBSHFL opcodes */
294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSBH     = (0x02 << 6) | OPC_DBSHFL,
298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DSHD     = (0x05 << 6) | OPC_DBSHFL,
299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Coprocessor 0 (rs field) */
302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFC0     = (0x00 << 21) | OPC_CP0,
306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTC0     = (0x04 << 21) | OPC_CP0,
308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFTR     = (0x08 << 21) | OPC_CP0,
310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTTR     = (0x0C << 21) | OPC_CP0,
313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_C0       = (0x10 << 21) | OPC_CP0,
315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MFMC0 opcodes */
320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Coprocessor 0 (with rs == C0) */
332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLBR     = 0x01 | OPC_C0,
336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLBWI    = 0x02 | OPC_C0,
337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLBWR    = 0x06 | OPC_C0,
338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_TLBP     = 0x08 | OPC_C0,
339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_RFE      = 0x10 | OPC_C0,
340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ERET     = 0x18 | OPC_C0,
341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DERET    = 0x1F | OPC_C0,
342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_WAIT     = 0x20 | OPC_C0,
343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Coprocessor 1 (rs field) */
346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFC1     = (0x00 << 21) | OPC_CP1,
350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CFC1     = (0x02 << 21) | OPC_CP1,
352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTC1     = (0x04 << 21) | OPC_CP1,
354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CTC1     = (0x06 << 21) | OPC_CP1,
356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_S_FMT    = (0x10 << 21) | OPC_CP1, /* 16: fmt=single fp */
361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_D_FMT    = (0x11 << 21) | OPC_CP1, /* 17: fmt=double fp */
362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_E_FMT    = (0x12 << 21) | OPC_CP1, /* 18: fmt=extended fp */
363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_Q_FMT    = (0x13 << 21) | OPC_CP1, /* 19: fmt=quad fp */
364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_W_FMT    = (0x14 << 21) | OPC_CP1, /* 20: fmt=32bit fixed */
365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_L_FMT    = (0x15 << 21) | OPC_CP1, /* 21: fmt=64bit fixed */
366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_PS_FMT   = (0x16 << 21) | OPC_CP1, /* 22: fmt=paired single fp */
367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1F     = (0x00 << 16) | OPC_BC1,
374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1T     = (0x01 << 16) | OPC_BC1,
375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFC2    = (0x00 << 21) | OPC_CP2,
393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CFC2    = (0x02 << 21) | OPC_CP2,
395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTC2    = (0x04 << 21) | OPC_CP2,
397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_CTC2    = (0x06 << 21) | OPC_CP2,
399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_BC2     = (0x08 << 21) | OPC_CP2,
401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LWXC1   = 0x00 | OPC_CP3,
407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LDXC1   = 0x01 | OPC_CP3,
408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_LUXC1   = 0x05 | OPC_CP3,
409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SWXC1   = 0x08 | OPC_CP3,
410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SDXC1   = 0x09 | OPC_CP3,
411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_SUXC1   = 0x0D | OPC_CP3,
412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_PREFX   = 0x0F | OPC_CP3,
413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_ALNV_PS = 0x1E | OPC_CP3,
414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MADD_S  = 0x20 | OPC_CP3,
415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MADD_D  = 0x21 | OPC_CP3,
416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MADD_PS = 0x26 | OPC_CP3,
417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MSUB_S  = 0x28 | OPC_CP3,
418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MSUB_D  = 0x29 | OPC_CP3,
419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_MSUB_PS = 0x2E | OPC_CP3,
420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMADD_S = 0x30 | OPC_CP3,
421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMADD_D = 0x31 | OPC_CP3,
422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMADD_PS= 0x36 | OPC_CP3,
423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMSUB_S = 0x38 | OPC_CP3,
424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMSUB_D = 0x39 | OPC_CP3,
425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    OPC_NMSUB_PS= 0x3E | OPC_CP3,
426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* global register indices */
429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv_ptr cpu_env;
430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv cpu_gpr[32], cpu_PC;
431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC];
432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv cpu_dspctrl, btarget, bcond;
433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv_i32 hflags;
434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic TCGv_i32 fpu_fcr0, fpu_fcr31;
435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "gen-icount.h"
437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define gen_helper_0i(name, arg) do {                             \
439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_##name(helper_tmp);                                \
441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(helper_tmp);                                \
442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while(0)
443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define gen_helper_1i(name, arg1, arg2) do {                      \
445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_##name(arg1, helper_tmp);                          \
447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(helper_tmp);                                \
448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while(0)
449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define gen_helper_2i(name, arg1, arg2, arg3) do {                \
451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_##name(arg1, arg2, helper_tmp);                    \
453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(helper_tmp);                                \
454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while(0)
455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define gen_helper_3i(name, arg1, arg2, arg3, arg4) do {          \
457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_##name(arg1, arg2, arg3, helper_tmp);              \
459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(helper_tmp);                                \
460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while(0)
461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitypedef struct DisasContext {
463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    struct TranslationBlock *tb;
464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong pc, saved_pc;
465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t opcode;
466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int singlestep_enabled;
467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Routine used to access memory */
468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int mem_idx;
469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t hflags, saved_hflags;
470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int bstate;
471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong btarget;
472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} DisasContext;
473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallienum {
475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                      * exception condition */
477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    BS_STOP     = 1, /* We want to stop translation for any reason */
478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    BS_BRANCH   = 2, /* We reached a branch condition     */
479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    BS_EXCP     = 3, /* We reached an exception condition */
480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic const char *regnames[] =
483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", };
487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic const char *regnames_HI[] =
489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    { "HI0", "HI1", "HI2", "HI3", };
490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic const char *regnames_LO[] =
492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    { "LO0", "LO1", "LO2", "LO3", };
493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic const char *regnames_ACX[] =
495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    { "ACX0", "ACX1", "ACX2", "ACX3", };
496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic const char *fregnames[] =
498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    { "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli      "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", };
502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef MIPS_DEBUG_DISAS
504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MIPS_DEBUG(fmt, ...)                         \
505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log_mask(CPU_LOG_TB_IN_ASM,                \
506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       TARGET_FMT_lx ": %08x " fmt "\n", \
507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       ctx->pc, ctx->opcode , ## __VA_ARGS__)
508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define LOG_DISAS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__)
509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MIPS_DEBUG(fmt, ...) do { } while(0)
511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define LOG_DISAS(...) do { } while (0)
512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MIPS_INVAL(op)                                                        \
515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallido {                                                                          \
516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F));             \
518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} while (0)
519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* General purpose registers moves. */
521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_gpr (TCGv t, int reg)
522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (reg == 0)
524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t, 0);
525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(t, cpu_gpr[reg]);
527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_gpr (TCGv t, int reg)
530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (reg != 0)
532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(cpu_gpr[reg], t);
533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Moves to/from ACX register.  */
536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_ACX (TCGv t, int reg)
537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_mov_tl(t, cpu_ACX[reg]);
539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_ACX (TCGv t, int reg)
542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_mov_tl(cpu_ACX[reg], t);
544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Moves to/from shadow registers. */
547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_srsgpr (int from, int to)
548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (from == 0)
552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, 0);
553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else {
554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i32 t2 = tcg_temp_new_i32();
555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_ptr addr = tcg_temp_new_ptr();
556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUState, CP0_SRSCtl));
558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t2, t2, 0xf);
560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext_i32_ptr(addr, t2);
562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_add_ptr(addr, cpu_env, addr);
563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_ptr(addr);
566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i32(t2);
567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, to);
569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_srsgpr (int from, int to)
573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (to != 0) {
575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv t0 = tcg_temp_new();
576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i32 t2 = tcg_temp_new_i32();
577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_ptr addr = tcg_temp_new_ptr();
578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, from);
580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUState, CP0_SRSCtl));
581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t2, t2, 0xf);
583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext_i32_ptr(addr, t2);
585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_add_ptr(addr, cpu_env, addr);
586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_ptr(addr);
589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i32(t2);
590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free(t0);
591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Floating point register moves. */
595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_fpr32 (TCGv_i32 t, int reg)
596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[FP_ENDIAN_IDX]));
598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_fpr32 (TCGv_i32 t, int reg)
601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[FP_ENDIAN_IDX]));
603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_fpr32h (TCGv_i32 t, int reg)
606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[!FP_ENDIAN_IDX]));
608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_fpr32h (TCGv_i32 t, int reg)
611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[!FP_ENDIAN_IDX]));
613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_load_fpr64 (DisasContext *ctx, TCGv_i64 t, int reg)
616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->hflags & MIPS_HFLAG_F64) {
618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ld_i64(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].d));
619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i32 t0 = tcg_temp_new_i32();
621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i32 t1 = tcg_temp_new_i32();
622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_fpr32(t0, reg & ~1);
623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_fpr32(t1, reg | 1);
624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_concat_i32_i64(t, t0, t1);
625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i32(t0);
626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i32(t1);
627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_store_fpr64 (DisasContext *ctx, TCGv_i64 t, int reg)
631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->hflags & MIPS_HFLAG_F64) {
633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_st_i64(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].d));
634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i64 t0 = tcg_temp_new_i64();
636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        TCGv_i32 t1 = tcg_temp_new_i32();
637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_trunc_i64_i32(t1, t);
638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_fpr32(t1, reg & ~1);
639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i64(t0, t, 32);
640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_trunc_i64_i32(t1, t0);
641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_fpr32(t1, reg | 1);
642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i32(t1);
643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free_i64(t0);
644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline int get_fp_bit (int cc)
648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (cc)
650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 24 + cc;
651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 23;
653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_CONDS(type, fmt, bits)                                            \
656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_cmp ## type ## _ ## fmt(int n, TCGv_i##bits a,         \
657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                               TCGv_i##bits b, int cc)        \
658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                             \
659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (n) {                                                              \
660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  0: gen_helper_2i(cmp ## type ## _ ## fmt ## _f, a, b, cc);    break;\
661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  1: gen_helper_2i(cmp ## type ## _ ## fmt ## _un, a, b, cc);   break;\
662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  2: gen_helper_2i(cmp ## type ## _ ## fmt ## _eq, a, b, cc);   break;\
663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  3: gen_helper_2i(cmp ## type ## _ ## fmt ## _ueq, a, b, cc);  break;\
664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  4: gen_helper_2i(cmp ## type ## _ ## fmt ## _olt, a, b, cc);  break;\
665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  5: gen_helper_2i(cmp ## type ## _ ## fmt ## _ult, a, b, cc);  break;\
666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  6: gen_helper_2i(cmp ## type ## _ ## fmt ## _ole, a, b, cc);  break;\
667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  7: gen_helper_2i(cmp ## type ## _ ## fmt ## _ule, a, b, cc);  break;\
668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  8: gen_helper_2i(cmp ## type ## _ ## fmt ## _sf, a, b, cc);   break;\
669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case  9: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngle, a, b, cc); break;\
670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 10: gen_helper_2i(cmp ## type ## _ ## fmt ## _seq, a, b, cc);  break;\
671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngl, a, b, cc);  break;\
672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12: gen_helper_2i(cmp ## type ## _ ## fmt ## _lt, a, b, cc);   break;\
673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 13: gen_helper_2i(cmp ## type ## _ ## fmt ## _nge, a, b, cc);  break;\
674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 14: gen_helper_2i(cmp ## type ## _ ## fmt ## _le, a, b, cc);   break;\
675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 15: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngt, a, b, cc);  break;\
676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default: abort();                                                         \
677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                                         \
678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
680409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(, d, 64)
681409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(abs, d, 64)
682409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(, s, 32)
683409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(abs, s, 32)
684409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(, ps, 64)
685409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_CONDS(abs, ps, 64)
686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FOP_CONDS
687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Tests */
689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_COND(name, cond)                                         \
690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void glue(gen_op_, name) (TCGv ret, TCGv t0, TCGv t1) \
691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                   \
692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();                                       \
693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l2 = gen_new_label();                                       \
694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                    \
695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcond_tl(cond, t0, t1, l1);                            \
696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 0);                                        \
697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_br(l2);                                                 \
698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);                                              \
699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 1);                                        \
700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l2);                                              \
701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
702409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(eq, TCG_COND_EQ);
703409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(ne, TCG_COND_NE);
704409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(ge, TCG_COND_GE);
705409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(geu, TCG_COND_GEU);
706409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(lt, TCG_COND_LT);
707409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_COND(ltu, TCG_COND_LTU);
708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_COND
709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_CONDI(name, cond)                                                 \
711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void glue(gen_op_, name) (TCGv ret, TCGv t0, target_ulong val) \
712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                            \
713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();                                                \
714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l2 = gen_new_label();                                                \
715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                             \
716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_tl(cond, t0, val, l1);                                   \
717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 0);                                                 \
718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_br(l2);                                                          \
719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);                                                       \
720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 1);                                                 \
721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l2);                                                       \
722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
723409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDI(lti, TCG_COND_LT);
724409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDI(ltiu, TCG_COND_LTU);
725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_CONDI
726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_CONDZ(name, cond)                                  \
728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void glue(gen_op_, name) (TCGv ret, TCGv t0)    \
729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                             \
730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();                                 \
731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l2 = gen_new_label();                                 \
732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                              \
733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_tl(cond, t0, 0, l1);                      \
734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 0);                                  \
735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_br(l2);                                           \
736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);                                        \
737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(ret, 1);                                  \
738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l2);                                        \
739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
740409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDZ(gez, TCG_COND_GE);
741409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDZ(gtz, TCG_COND_GT);
742409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDZ(lez, TCG_COND_LE);
743409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_CONDZ(ltz, TCG_COND_LT);
744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_CONDZ
745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_save_pc(target_ulong pc)
747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(cpu_PC, pc);
749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void save_cpu_state (DisasContext *ctx, int do_save_pc)
752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (do_save_pc && ctx->pc != ctx->saved_pc) {
755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_save_pc(ctx->pc);
756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->saved_pc = ctx->pc;
757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->hflags != ctx->saved_hflags) {
759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_i32(hflags, ctx->hflags);
760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->saved_hflags = ctx->hflags;
761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (ctx->hflags & MIPS_HFLAG_BMASK) {
762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BR:
763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BC:
765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BL:
766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_B:
767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(btarget, ctx->btarget);
768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void restore_cpu_state (CPUState *env, DisasContext *ctx)
774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx->saved_hflags = ctx->hflags;
776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (ctx->hflags & MIPS_HFLAG_BMASK) {
777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case MIPS_HFLAG_BR:
778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case MIPS_HFLAG_BC:
780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case MIPS_HFLAG_BL:
781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case MIPS_HFLAG_B:
782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->btarget = env->btarget;
783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void
788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalligenerate_exception_err (DisasContext *ctx, int excp, int err)
789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 texcp = tcg_const_i32(excp);
791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 terr = tcg_const_i32(err);
792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    save_cpu_state(ctx, 1);
793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_raise_exception_err(texcp, terr);
794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(terr);
795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(texcp);
796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void
799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalligenerate_exception (DisasContext *ctx, int excp)
800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    save_cpu_state(ctx, 1);
802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_0i(raise_exception, excp);
803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Addresses computation */
806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_add_tl(ret, arg0, arg1);
809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* For compatibility with 32-bit code, data reference in user mode
812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       with Status_UX = 0 should be casted to 32-bit and sign extended.
813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       See the MIPS64 PRA manual, section 4.10. */
814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        !(ctx->hflags & MIPS_HFLAG_UX)) {
816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_i64(ret, ret);
817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_cp0_enabled(DisasContext *ctx)
822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception_err(ctx, EXCP_CpU, 0);
825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_cp1_enabled(DisasContext *ctx)
828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception_err(ctx, EXCP_CpU, 1);
831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Verify that the processor is running with COP1X instructions enabled.
834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   This is associated with the nabla symbol in the MIPS32 and MIPS64
835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   opcode tables.  */
836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_cop1x(DisasContext *ctx)
838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Verify that the processor is running with 64-bit floating-point
844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   operations enabled.  */
845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_cp1_64bitmode(DisasContext *ctx)
847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/*
853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * Verify if floating point register is valid; an operation is not defined
854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * if bit 0 of any register specification is set and the FR bit in the
855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * Status register equals zero, since the register numbers specify an
856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * even-odd pair of adjacent coprocessor general registers. When the FR bit
857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * in the Status register equals one, both even and odd register numbers
858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * Multiple 64 bit wide registers can be checked by calling
861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli */
863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_cp1_registers(DisasContext *ctx, int regs)
864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* This code generates a "reserved instruction" exception if the
870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   CPU does not support the instruction set corresponding to flags. */
871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_insn(CPUState *env, DisasContext *ctx, int flags)
872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(env->insn_flags & flags)))
874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* This code generates a "reserved instruction" exception if 64-bit
878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   instructions are not enabled. */
879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void check_mips_64(DisasContext *ctx)
880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* load/store instructions. */
886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_LD(insn,fname)                                                 \
887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv ret, TCGv arg1, DisasContext *ctx) \
888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                        \
890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
891409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lb,ld8s);
892409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lbu,ld8u);
893409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lh,ld16s);
894409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lhu,ld16u);
895409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lw,ld32s);
896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
897409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(lwu,ld32u);
898409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD(ld,ld64);
899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_LD
901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_ST(insn,fname)                                                  \
903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv arg1, TCGv arg2, DisasContext *ctx) \
904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                          \
905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_qemu_##fname(arg1, arg2, ctx->mem_idx);                        \
906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
907409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST(sb,st8);
908409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST(sh,st16);
909409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST(sw,st32);
910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
911409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST(sd,st64);
912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_ST
914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef CONFIG_USER_ONLY
916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_LD_ATOMIC(insn,fname)                                           \
917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)  \
918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                          \
919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();                                              \
920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_mov_tl(t0, arg1);                                              \
921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, lladdr));                \
923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(ret, cpu_env, offsetof(CPUState, llval));                \
924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);                                                     \
925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_LD_ATOMIC(insn,fname)                                           \
928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)  \
929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                          \
930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_2i(insn, ret, arg1, ctx->mem_idx);                          \
931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
933409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD_ATOMIC(ll,ld32s);
934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
935409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_LD_ATOMIC(lld,ld64);
936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_LD_ATOMIC
938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef CONFIG_USER_ONLY
940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                            \
943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();                                                \
944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();                                                \
945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l2 = gen_new_label();                                                \
946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                             \
947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_tl(t0, arg2, almask);                                       \
948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUState, CP0_BadVAddr));          \
950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_AdES);                                      \
951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);                                                       \
952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, lladdr));                  \
953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, llreg));                   \
956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUState, llnewval));              \
957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_0i(raise_exception, EXCP_SC);                                 \
958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l2);                                                       \
959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_movi_tl(t0, 0);                                                  \
960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, rt);                                                   \
961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);                                                       \
962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void op_ldst_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                            \
967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();                                                \
968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_helper_3i(insn, t0, arg1, arg2, ctx->mem_idx);                       \
969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, rt);                                                   \
970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);                                                       \
971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
973409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST_ATOMIC(sc,st32,ld32s,0x3);
974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
975409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliOP_ST_ATOMIC(scd,st64,ld64,0x7);
976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef OP_ST_ATOMIC
978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Load and store */
980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_ldst (DisasContext *ctx, uint32_t opc, int rt,
981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                      int base, int16_t offset)
982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "ldst";
984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t1 = tcg_temp_new();
986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (base == 0) {
988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (offset == 0) {
990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, base);
991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_addr_add(ctx, t0, cpu_gpr[base], t0);
994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Don't do NOP if destination is zero: we must perform the actual
996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       memory access. */
997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWU:
1000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lwu(t0, t0, ctx);
1002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lwu";
1004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LD:
1006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_ld(t0, t0, ctx);
1008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ld";
1010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LLD:
1012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lld(t0, t0, ctx);
1014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lld";
1016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SD:
1018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_sd(t1, t0, ctx);
1021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sd";
1022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDL:
1024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_3i(ldl, t1, t1, t0, ctx->mem_idx);
1027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t1, rt);
1028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ldl";
1029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDL:
1031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_2i(sdl, t1, t0, ctx->mem_idx);
1034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sdl";
1035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDR:
1037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_3i(ldr, t1, t1, t0, ctx->mem_idx);
1040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t1, rt);
1041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ldr";
1042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDR:
1044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_2i(sdr, t1, t0, ctx->mem_idx);
1047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sdr";
1048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LW:
1051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lw(t0, t0, ctx);
1053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lw";
1055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SW:
1057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_sw(t1, t0, ctx);
1060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sw";
1061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LH:
1063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lh(t0, t0, ctx);
1065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lh";
1067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SH:
1069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_sh(t1, t0, ctx);
1072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sh";
1073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LHU:
1075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lhu(t0, t0, ctx);
1077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lhu";
1079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LB:
1081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lb(t0, t0, ctx);
1083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lb";
1085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SB:
1087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_sb(t1, t0, ctx);
1090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sb";
1091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LBU:
1093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_lbu(t0, t0, ctx);
1095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lbu";
1097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWL:
1099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_3i(lwl, t1, t1, t0, ctx->mem_idx);
1102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t1, rt);
1103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lwl";
1104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWL:
1106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_2i(swl, t1, t0, ctx->mem_idx);
1109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "swr";
1110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWR:
1112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_3i(lwr, t1, t1, t0, ctx->mem_idx);
1115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t1, rt);
1116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lwr";
1117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWR:
1119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t1, rt);
1121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_2i(swr, t1, t0, ctx->mem_idx);
1122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "swr";
1123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LL:
1125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_ll(t0, t0, ctx);
1127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
1128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ll";
1129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
1134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Store conditional */
1137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
1138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                         int base, int16_t offset)
1139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "st_cond";
1141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0, t1;
1142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_local_new();
1144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (base == 0) {
1146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
1147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (offset == 0) {
1148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, base);
1149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
1150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
1151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_addr_add(ctx, t0, cpu_gpr[base], t0);
1152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Don't do NOP if destination is zero: we must perform the actual
1154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       memory access. */
1155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t1 = tcg_temp_local_new();
1157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rt);
1158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SCD:
1161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
1162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_scd(t1, t0, rt, ctx);
1163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "scd";
1164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SC:
1167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
1168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op_ldst_sc(t1, t0, rt, ctx);
1169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sc";
1170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
1174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Load and store */
1178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
1179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                          int base, int16_t offset)
1180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "flt_ldst";
1182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
1183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (base == 0) {
1185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
1186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (offset == 0) {
1187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, base);
1188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
1189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, offset);
1190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_addr_add(ctx, t0, cpu_gpr[base], t0);
1191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Don't do NOP if destination is zero: we must perform the actual
1193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       memory access. */
1194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWC1:
1196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
1198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
1201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, ft);
1202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
1203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lwc1";
1205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWC1:
1207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
1209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, ft);
1212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(t1, fp0);
1213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
1216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "swc1";
1218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDC1:
1220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
1222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
1224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, ft);
1225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
1226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ldc1";
1228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDC1:
1230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
1232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, ft);
1234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
1235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
1236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sdc1";
1238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
1240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
1241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
1242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
1243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
1245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
1246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Arithmetic with immediate operand */
1250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc,
1251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                           int rt, int rs, int16_t imm)
1252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
1254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "imm arith";
1255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
1257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP.
1258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           For addi, we must generate the overflow exception when needed. */
1259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADDI:
1264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_addi_tl(t0, t1, uimm);
1272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
1273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xori_tl(t1, t1, ~uimm);
1275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xori_tl(t2, t0, uimm);
1276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of same sign, result different sign */
1281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
1284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rt);
1285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "addi";
1288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADDIU:
1290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0) {
1291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
1293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "addiu";
1297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADDI:
1300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_addi_tl(t0, t1, uimm);
1308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xori_tl(t1, t1, ~uimm);
1310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xori_tl(t2, t0, uimm);
1311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of same sign, result different sign */
1316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rt);
1319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "daddi";
1322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADDIU:
1324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0) {
1325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "daddiu";
1330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Logic with immediate operand */
1337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_logic_imm (CPUState *env, uint32_t opc, int rt, int rs, int16_t imm)
1338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong uimm;
1340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "imm logic";
1341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rt == 0) {
1343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
1344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uimm = (uint16_t)imm;
1348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ANDI:
1350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0))
1351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rt], 0);
1354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "andi";
1355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ORI:
1357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0)
1358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ori";
1362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_XORI:
1364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0))
1365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "xori";
1369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LUI:
1371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
1372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lui";
1373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Set on less than with immediate operand */
1379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_slt_imm (CPUState *env, uint32_t opc, int rt, int rs, int16_t imm)
1380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
1382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "imm arith";
1383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0;
1384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rt == 0) {
1386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
1387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
1391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
1392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLTI:
1394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_lti(cpu_gpr[rt], t0, uimm);
1395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "slti";
1396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLTIU:
1398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_ltiu(cpu_gpr[rt], t0, uimm);
1399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sltiu";
1400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Shifts with immediate operand */
1407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_shift_imm(CPUState *env, DisasContext *ctx, uint32_t opc,
1408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                          int rt, int rs, int16_t imm)
1409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong uimm = ((uint16_t)imm) & 0x1f;
1411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "imm shift";
1412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0;
1413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rt == 0) {
1415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
1416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
1421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
1422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLL:
1424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(t0, t0, uimm);
1425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
1426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sll";
1427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SRA:
1429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_tl(t0, t0);
1430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
1431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sra";
1432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SRL:
1434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch ((ctx->opcode >> 21) & 0x1f) {
1435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
1436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (uimm != 0) {
1437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_ext32u_tl(t0, t0);
1438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
1439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
1441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            opn = "srl";
1443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
1445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* rotr is decoded as srl on non-R2 CPUs */
1446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->insn_flags & ISA_MIPS32R2) {
1447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                if (uimm != 0) {
1448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    TCGv_i32 t1 = tcg_temp_new_i32();
1449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_trunc_tl_i32(t1, t0);
1451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_rotri_i32(t1, t1, uimm);
1452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
1453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_temp_free_i32(t1);
1454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                } else {
1455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
1456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
1457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "rotr";
1458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                if (uimm != 0) {
1460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_ext32u_tl(t0, t0);
1461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
1462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                } else {
1463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
1464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
1465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "srl";
1466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
1469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("invalid srl flag");
1470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
1471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSLL:
1476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
1477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsll";
1478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRA:
1480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
1481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsra";
1482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRL:
1484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch ((ctx->opcode >> 21) & 0x1f) {
1485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
1486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
1487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            opn = "dsrl";
1488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
1490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* drotr is decoded as dsrl on non-R2 CPUs */
1491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->insn_flags & ISA_MIPS32R2) {
1492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                if (uimm != 0) {
1493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
1494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                } else {
1495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_mov_tl(cpu_gpr[rt], t0);
1496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
1497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "drotr";
1498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
1500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "dsrl";
1501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
1504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("invalid dsrl flag");
1505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
1506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSLL32:
1510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
1511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsll32";
1512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRA32:
1514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
1515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsra32";
1516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRL32:
1518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch ((ctx->opcode >> 21) & 0x1f) {
1519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
1520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
1521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            opn = "dsrl32";
1522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
1524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
1525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->insn_flags & ISA_MIPS32R2) {
1526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
1527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "drotr32";
1528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
1530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "dsrl32";
1531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
1534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("invalid dsrl32 flag");
1535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
1536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Arithmetic */
1546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc,
1547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       int rd, int rs, int rt)
1548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "arith";
1550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
1552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       && opc != OPC_DADD && opc != OPC_DSUB) {
1553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP.
1554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           For add & sub, we must generate the overflow exception when needed. */
1555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADD:
1561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t2, rt);
1569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_tl(t0, t1, t2);
1570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
1571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t1, t1, t2);
1572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_tl(t1, t1);
1573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t2, t0, t2);
1574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of same sign, result different sign */
1579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rd);
1582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "add";
1585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADDU:
1587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 && rt != 0) {
1588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
1590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
1592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "addu";
1598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SUB:
1600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t2, rt);
1608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_tl(t0, t1, t2);
1609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
1610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t2, t1, t2);
1611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t1, t0, t1);
1612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of different sign, first operand and result different sign */
1617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rd);
1620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sub";
1623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SUBU:
1625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 && rt != 0) {
1626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
1628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
1630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
1631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "subu";
1637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADD:
1640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t2, rt);
1648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_tl(t0, t1, t2);
1649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t1, t1, t2);
1650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_tl(t1, t1);
1651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t2, t0, t2);
1652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of same sign, result different sign */
1657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rd);
1660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dadd";
1663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADDU:
1665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 && rt != 0) {
1666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
1669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "daddu";
1675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSUB:
1677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
1678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
1679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
1680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t2 = tcg_temp_new();
1681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
1682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rs);
1684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t2, rt);
1685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_tl(t0, t1, t2);
1686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t2, t1, t2);
1687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(t1, t0, t1);
1688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(t1, t1, t2);
1689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t2);
1690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
1692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* operands of different sign, first operand and result different sign */
1693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_OVERFLOW);
1694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
1695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_gpr(t0, rd);
1696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
1697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsub";
1699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSUBU:
1701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 && rt != 0) {
1702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
1705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsubu";
1711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MUL:
1714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0 && rt != 0)) {
1715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
1717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mul";
1721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Conditional move */
1727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_cond_move (CPUState *env, uint32_t opc, int rd, int rs, int rt)
1728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "cond move";
1730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1;
1731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
1733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP.
1734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           For add & sub, we must generate the overflow exception when needed. */
1735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    l1 = gen_new_label();
1740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MOVN:
1742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rt != 0))
1743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[rt], 0, l1);
1744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_br(l1);
1746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movn";
1747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MOVZ:
1749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rt != 0))
1750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[rt], 0, l1);
1751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movz";
1752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rs != 0)
1755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(cpu_gpr[rd], 0);
1758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);
1759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Logic */
1764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_logic (CPUState *env, uint32_t opc, int rd, int rs, int rt)
1765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "logic";
1767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
1769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
1770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_AND:
1776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0 && rt != 0)) {
1777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "and";
1782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NOR:
1784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 && rt != 0) {
1785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
1788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
1790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
1792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nor";
1794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_OR:
1796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0 && rt != 0)) {
1797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
1800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "or";
1806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_XOR:
1808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (likely(rs != 0 && rt != 0)) {
1809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
1810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs == 0 && rt != 0) {
1811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
1812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else if (rs != 0 && rt == 0) {
1813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
1814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[rd], 0);
1816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "xor";
1818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Set on lower than */
1824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_slt (CPUState *env, uint32_t opc, int rd, int rs, int rt)
1825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "slt";
1827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0, t1;
1828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
1830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
1831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
1836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t1 = tcg_temp_new();
1837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
1838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rt);
1839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLT:
1841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_lt(cpu_gpr[rd], t0, t1);
1842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "slt";
1843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLTU:
1845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_ltu(cpu_gpr[rd], t0, t1);
1846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sltu";
1847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
1852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Shifts */
1855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_shift (CPUState *env, DisasContext *ctx, uint32_t opc,
1856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       int rd, int rs, int rt)
1857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "shifts";
1859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0, t1;
1860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
1862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP.
1863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           For add & sub, we must generate the overflow exception when needed. */
1864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
1869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t1 = tcg_temp_new();
1870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
1871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rt);
1872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLLV:
1874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, 0x1f);
1875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shl_tl(t0, t1, t0);
1876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
1877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sllv";
1878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SRAV:
1880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_tl(t1, t1);
1881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, 0x1f);
1882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
1883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "srav";
1884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SRLV:
1886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch ((ctx->opcode >> 6) & 0x1f) {
1887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
1888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t1, t1);
1889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, 0x1f);
1890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shr_tl(t0, t1, t0);
1891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
1892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            opn = "srlv";
1893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
1895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* rotrv is decoded as srlv on non-R2 CPUs */
1896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->insn_flags & ISA_MIPS32R2) {
1897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv_i32 t2 = tcg_temp_new_i32();
1898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv_i32 t3 = tcg_temp_new_i32();
1899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_trunc_tl_i32(t2, t0);
1901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_trunc_tl_i32(t3, t1);
1902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_andi_i32(t2, t2, 0x1f);
1903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_rotr_i32(t2, t3, t2);
1904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
1905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free_i32(t2);
1906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free_i32(t3);
1907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "rotrv";
1908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_ext32u_tl(t1, t1);
1910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_andi_tl(t0, t0, 0x1f);
1911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_shr_tl(t0, t1, t0);
1912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
1913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "srlv";
1914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
1917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("invalid srlv flag");
1918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
1919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSLLV:
1924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, 0x3f);
1925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
1926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsllv";
1927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRAV:
1929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, 0x3f);
1930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
1931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dsrav";
1932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSRLV:
1934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch ((ctx->opcode >> 6) & 0x1f) {
1935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
1936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, 0x3f);
1937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
1938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            opn = "dsrlv";
1939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
1941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* drotrv is decoded as dsrlv on non-R2 CPUs */
1942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->insn_flags & ISA_MIPS32R2) {
1943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_andi_tl(t0, t0, 0x3f);
1944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
1945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "drotrv";
1946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
1947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_andi_tl(t0, t0, 0x3f);
1948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_shr_tl(t0, t1, t0);
1949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = "dsrlv";
1950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
1953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("invalid dsrlv flag");
1954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
1955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
1962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
1963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Arithmetic on HI/LO registers */
1966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_HILO (DisasContext *ctx, uint32_t opc, int reg)
1967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "hilo";
1969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
1971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Treat as NOP. */
1972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
1973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
1974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
1976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFHI:
1977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[0]);
1978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mfhi";
1979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFLO:
1981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[0]);
1982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mflo";
1983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTHI:
1985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (reg != 0)
1986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_HI[0], cpu_gpr[reg]);
1987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_HI[0], 0);
1989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mthi";
1990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTLO:
1992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (reg != 0)
1993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_LO[0], cpu_gpr[reg]);
1994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_LO[0], 0);
1996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mtlo";
1997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
1998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s", opn, regnames[reg]);
2000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_muldiv (DisasContext *ctx, uint32_t opc,
2003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        int rs, int rt)
2004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "mul/div";
2006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0, t1;
2007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DIV:
2010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DIVU:
2011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DDIV:
2013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DDIVU:
2014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        t0 = tcg_temp_local_new();
2016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        t1 = tcg_temp_local_new();
2017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        t0 = tcg_temp_new();
2020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        t1 = tcg_temp_new();
2021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
2025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rt);
2026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DIV:
2028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
2030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l2 = gen_new_label();
2031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
2033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t1, t1);
2034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
2036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
2037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_LO[0], t0);
2039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_HI[0], 0);
2040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_br(l1);
2041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l2);
2042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_div_tl(cpu_LO[0], t0, t1);
2043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_rem_tl(cpu_HI[0], t0, t1);
2044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
2047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "div";
2049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DIVU:
2051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
2053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t0, t0);
2055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t1, t1);
2056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_divu_tl(cpu_LO[0], t0, t1);
2058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_remu_tl(cpu_HI[0], t0, t1);
2059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
2062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "divu";
2064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MULT:
2066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t2, t0);
2071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t3, t1);
2072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mult";
2082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MULTU:
2084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t0, t0);
2089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t1, t1);
2090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t2, t0);
2091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t3, t1);
2092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "multu";
2102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DDIV:
2105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
2107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l2 = gen_new_label();
2108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
2111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
2112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_LO[0], t0);
2113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_HI[0], 0);
2114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_br(l1);
2115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l2);
2116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_div_i64(cpu_LO[0], t0, t1);
2117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_rem_i64(cpu_HI[0], t0, t1);
2118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
2119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ddiv";
2121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DDIVU:
2123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
2125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_divu_i64(cpu_LO[0], t0, t1);
2128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_remu_i64(cpu_HI[0], t0, t1);
2129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
2130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ddivu";
2132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMULT:
2134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_dmult(t0, t1);
2135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmult";
2136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMULTU:
2138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_dmultu(t0, t1);
2139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmultu";
2140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MADD:
2143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t2, t0);
2148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t3, t1);
2149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_concat_tl_i64(t3, cpu_LO[0], cpu_HI[0]);
2151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_i64(t2, t2, t3);
2152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "madd";
2161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MADDU:
2163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       {
2164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t0, t0);
2168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t1, t1);
2169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t2, t0);
2170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t3, t1);
2171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_concat_tl_i64(t3, cpu_LO[0], cpu_HI[0]);
2173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_add_i64(t2, t2, t3);
2174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "maddu";
2183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MSUB:
2185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t2, t0);
2190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_tl_i64(t3, t1);
2191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_concat_tl_i64(t3, cpu_LO[0], cpu_HI[0]);
2193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_i64(t2, t3, t2);
2194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msub";
2203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MSUBU:
2205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t2 = tcg_temp_new_i64();
2207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 t3 = tcg_temp_new_i64();
2208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t0, t0);
2210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32u_tl(t1, t1);
2211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t2, t0);
2212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_tl_i64(t3, t1);
2213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mul_i64(t2, t2, t3);
2214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_concat_tl_i64(t3, cpu_LO[0], cpu_HI[0]);
2215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_sub_i64(t2, t3, t2);
2216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t3);
2217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t0, t2);
2218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i64(t2, t2, 32);
2219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_i64_tl(t1, t2);
2220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(t2);
2221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_LO[0], t0);
2222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_HI[0], t1);
2223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msubu";
2225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
2228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
2230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
2232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
2233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
2235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
2238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                            int rd, int rs, int rt)
2239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "mul vr54xx";
2241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
2242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t1 = tcg_temp_new();
2243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
2245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rt);
2246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULS:
2249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_muls(t0, t0, t1);
2250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "muls";
2251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULSU:
2253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_mulsu(t0, t0, t1);
2254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulsu";
2255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MACC:
2257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_macc(t0, t0, t1);
2258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "macc";
2259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MACCU:
2261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_maccu(t0, t0, t1);
2262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "maccu";
2263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MSAC:
2265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_msac(t0, t0, t1);
2266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msac";
2267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MSACU:
2269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_msacu(t0, t0, t1);
2270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msacu";
2271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULHI:
2273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_mulhi(t0, t0, t1);
2274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulhi";
2275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULHIU:
2277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_mulhiu(t0, t0, t1);
2278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulhiu";
2279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULSHI:
2281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_mulshi(t0, t0, t1);
2282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulshi";
2283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MULSHIU:
2285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_mulshiu(t0, t0, t1);
2286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulshiu";
2287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MACCHI:
2289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_macchi(t0, t0, t1);
2290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "macchi";
2291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MACCHIU:
2293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_macchiu(t0, t0, t1);
2294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "macchiu";
2295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MSACHI:
2297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_msachi(t0, t0, t1);
2298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msachi";
2299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_VR54XX_MSACHIU:
2301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_msachiu(t0, t0, t1);
2302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msachiu";
2303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL("mul vr54xx");
2306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
2308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, rd);
2310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
2313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
2315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_cl (DisasContext *ctx, uint32_t opc,
2318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    int rd, int rs)
2319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "CLx";
2321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0;
2322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
2324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Treat as NOP. */
2325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
2326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
2327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
2329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rs);
2330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CLO:
2332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_clo(cpu_gpr[rd], t0);
2333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "clo";
2334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CLZ:
2336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_clz(cpu_gpr[rd], t0);
2337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "clz";
2338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DCLO:
2341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_dclo(cpu_gpr[rd], t0);
2342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dclo";
2343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DCLZ:
2345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_dclz(cpu_gpr[rd], t0);
2346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dclz";
2347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
2351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Traps */
2355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_trap (DisasContext *ctx, uint32_t opc,
2356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                      int rs, int rt, int16_t imm)
2357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cond;
2359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
2360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t1 = tcg_temp_new();
2361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cond = 0;
2363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Load needed operands */
2364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TEQ:
2366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TGE:
2367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TGEU:
2368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLT:
2369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLTU:
2370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TNE:
2371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Compare two registers */
2372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != rt) {
2373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rs);
2374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rt);
2375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cond = 1;
2376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TEQI:
2379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TGEI:
2380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TGEIU:
2381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLTI:
2382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLTIU:
2383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TNEI:
2384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Compare register to immediate */
2385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0 || imm != 0) {
2386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rs);
2387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(t1, (int32_t)imm);
2388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cond = 1;
2389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (cond == 0) {
2393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (opc) {
2394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TEQ:   /* rs == rs */
2395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TEQI:  /* r0 == 0  */
2396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGE:   /* rs >= rs */
2397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEI:  /* r0 >= 0  */
2398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEU:  /* rs >= rs unsigned */
2399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEIU: /* r0 >= 0  unsigned */
2400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Always trap */
2401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_TRAP);
2402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLT:   /* rs < rs           */
2404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTI:  /* r0 < 0            */
2405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTU:  /* rs < rs unsigned  */
2406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTIU: /* r0 < 0  unsigned  */
2407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNE:   /* rs != rs          */
2408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNEI:  /* r0 != 0           */
2409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Never trap: treat as NOP. */
2410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
2413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        int l1 = gen_new_label();
2414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (opc) {
2416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TEQ:
2417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TEQI:
2418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
2419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGE:
2421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEI:
2422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
2423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEU:
2425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEIU:
2426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
2427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLT:
2429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTI:
2430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
2431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTU:
2433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TLTIU:
2434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
2435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNE:
2437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNEI:
2438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
2439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_TRAP);
2442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_set_label(l1);
2443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
2446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
2449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TranslationBlock *tb;
2451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tb = ctx->tb;
2452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
2453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        likely(!ctx->singlestep_enabled)) {
2454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_goto_tb(n);
2455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_save_pc(dest);
2456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_exit_tb((long)tb + n);
2457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
2458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_save_pc(dest);
2459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (ctx->singlestep_enabled) {
2460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(ctx, 0);
2461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_0i(raise_exception, EXCP_DEBUG);
2462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_exit_tb(0);
2464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Branches (before delay slot) */
2468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_compute_branch (DisasContext *ctx, uint32_t opc,
2469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                int rs, int rt, int32_t offset)
2470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong btgt = -1;
2472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int blink = 0;
2473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int bcond_compute = 0;
2474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
2475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t1 = tcg_temp_new();
2476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->hflags & MIPS_HFLAG_BMASK) {
2478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef MIPS_DEBUG_DISAS
2479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        LOG_DISAS("Branch in delay slot at PC 0x" TARGET_FMT_lx "\n", ctx->pc);
2480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
2483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Load needed operands */
2486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BEQ:
2488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BEQL:
2489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BNE:
2490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BNEL:
2491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Compare two registers */
2492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != rt) {
2493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rs);
2494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t1, rt);
2495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            bcond_compute = 1;
2496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        btgt = ctx->pc + 4 + offset;
2498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGEZ:
2500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGEZAL:
2501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGEZALL:
2502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGEZL:
2503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGTZ:
2504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BGTZL:
2505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLEZ:
2506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLEZL:
2507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLTZ:
2508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLTZAL:
2509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLTZALL:
2510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BLTZL:
2511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Compare to zero */
2512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rs != 0) {
2513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rs);
2514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            bcond_compute = 1;
2515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        btgt = ctx->pc + 4 + offset;
2517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_J:
2519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_JAL:
2520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Jump to immediate */
2521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        btgt = ((ctx->pc + 4) & (int32_t)0xF0000000) | (uint32_t)offset;
2522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_JR:
2524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_JALR:
2525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Jump to register */
2526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (offset != 0 && offset != 16) {
2527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
2528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               others are reserved. */
2529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("jump hint");
2530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
2531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(btarget, rs);
2534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL("branch/jump");
2537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
2539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (bcond_compute == 0) {
2541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* No condition to be computed */
2542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (opc) {
2543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BEQ:     /* rx == rx        */
2544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BEQL:    /* rx == rx likely */
2545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZ:    /* 0 >= 0          */
2546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZL:   /* 0 >= 0 likely   */
2547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLEZ:    /* 0 <= 0          */
2548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLEZL:   /* 0 <= 0 likely   */
2549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Always take */
2550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_B;
2551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("balways");
2552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZAL:  /* 0 >= 0          */
2554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZALL: /* 0 >= 0 likely   */
2555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Always take and link */
2556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_B;
2558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("balways and link");
2559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BNE:     /* rx != rx        */
2561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGTZ:    /* 0 > 0           */
2562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZ:    /* 0 < 0           */
2563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
2564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bnever (NOP)");
2565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZAL:  /* 0 < 0           */
2567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
2568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bnever and link");
2569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZALL: /* 0 < 0 likely */
2571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
2572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Skip the instruction in the delay slot */
2573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bnever, link and skip");
2574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->pc += 4;
2575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BNEL:    /* rx != rx likely */
2577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGTZL:   /* 0 > 0 likely */
2578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZL:   /* 0 < 0 likely */
2579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Skip the instruction in the delay slot */
2580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bnever and skip");
2581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->pc += 4;
2582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_J:
2584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_B;
2585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("j " TARGET_FMT_lx, btgt);
2586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_JAL:
2588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_B;
2590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("jal " TARGET_FMT_lx, btgt);
2591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_JR:
2593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_BR;
2594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("jr %s", regnames[rs]);
2595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_JALR:
2597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = rt;
2598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_BR;
2599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
2600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
2602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("branch/jump");
2603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
2604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
2607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (opc) {
2608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BEQ:
2609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_eq(bcond, t0, t1);
2610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
2611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       regnames[rs], regnames[rt], btgt);
2612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BEQL:
2614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_eq(bcond, t0, t1);
2615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
2616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       regnames[rs], regnames[rt], btgt);
2617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BNE:
2619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ne(bcond, t0, t1);
2620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
2621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       regnames[rs], regnames[rt], btgt);
2622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BNEL:
2624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ne(bcond, t0, t1);
2625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
2626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       regnames[rs], regnames[rt], btgt);
2627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZ:
2629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gez(bcond, t0);
2630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt);
2631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZL:
2633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gez(bcond, t0);
2634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
2635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZAL:
2637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gez(bcond, t0);
2638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt);
2639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGEZALL:
2642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gez(bcond, t0);
2643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt);
2645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGTZ:
2647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gtz(bcond, t0);
2648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt);
2649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BGTZL:
2651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_gtz(bcond, t0);
2652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
2653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLEZ:
2655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_lez(bcond, t0);
2656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt);
2657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLEZL:
2659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_lez(bcond, t0);
2660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
2661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZ:
2663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ltz(bcond, t0);
2664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt);
2665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto not_likely;
2666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZL:
2667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ltz(bcond, t0);
2668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
2669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto likely;
2670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZAL:
2671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ltz(bcond, t0);
2672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt);
2674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        not_likely:
2675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_BC;
2676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZALL:
2678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_op_ltz(bcond, t0);
2679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            blink = 31;
2680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt);
2681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        likely:
2682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->hflags |= MIPS_HFLAG_BL;
2683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
2685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("conditional branch/jump");
2686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
2687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto out;
2688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
2691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               blink, ctx->hflags, btgt);
2692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx->btarget = btgt;
2694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (blink > 0) {
2695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + 8);
2696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
2699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
2701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* special3 bitfield operations */
2704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
2705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        int rs, int lsb, int msb)
2706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
2708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t1 = tcg_temp_new();
2709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong mask;
2710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t1, rs);
2712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
2713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_EXT:
2714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (lsb + msb > 31)
2715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto fail;
2716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_tl(t0, t1, lsb);
2717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (msb != 31) {
2718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, (1 << (msb + 1)) - 1);
2719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
2720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(t0, t0);
2721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DEXTM:
2725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_tl(t0, t1, lsb);
2726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (msb != 31) {
2727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1 + 32)) - 1);
2728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DEXTU:
2731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_tl(t0, t1, lsb + 32);
2732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
2733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DEXT:
2735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_tl(t0, t1, lsb);
2736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
2737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_INS:
2740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (lsb > msb)
2741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto fail;
2742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask = ((msb - lsb + 1 < 32) ? ((1 << (msb - lsb + 1)) - 1) : ~0) << lsb;
2743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
2744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~mask);
2745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(t1, t1, lsb);
2746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t1, t1, mask);
2747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_or_tl(t0, t0, t1);
2748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext32s_tl(t0, t0);
2749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DINSM:
2752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (lsb > msb)
2753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto fail;
2754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask = ((msb - lsb + 1 + 32 < 64) ? ((1ULL << (msb - lsb + 1 + 32)) - 1) : ~0ULL) << lsb;
2755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
2756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~mask);
2757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(t1, t1, lsb);
2758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t1, t1, mask);
2759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_or_tl(t0, t0, t1);
2760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DINSU:
2762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (lsb > msb)
2763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto fail;
2764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask = ((1ULL << (msb - lsb + 1)) - 1) << (lsb + 32);
2765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
2766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~mask);
2767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(t1, t1, lsb + 32);
2768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t1, t1, mask);
2769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_or_tl(t0, t0, t1);
2770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DINS:
2772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (lsb > msb)
2773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto fail;
2774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
2775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask = ((1ULL << (msb - lsb + 1)) - 1) << lsb;
2776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
2777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~mask);
2778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shli_tl(t1, t1, lsb);
2779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t1, t1, mask);
2780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_or_tl(t0, t0, t1);
2781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallifail:
2785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL("bitops");
2786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free(t0);
2788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free(t1);
2789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
2790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, rt);
2792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t1);
2794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
2797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0;
2799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
2801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If no destination, treat it as a NOP. */
2802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("NOP");
2803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
2804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new();
2807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rt);
2808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (op2) {
2809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_WSBH:
2810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
2812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(t1, t0, 8);
2814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
2815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shli_tl(t0, t0, 8);
2816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
2817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_tl(t0, t0, t1);
2818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
2819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SEB:
2823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
2824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SEH:
2826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
2827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
2829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSBH:
2830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
2832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(t1, t0, 8);
2834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
2835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shli_tl(t0, t0, 8);
2836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
2837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
2838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
2839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DSHD:
2842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
2844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(t1, t0, 16);
2846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
2847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shli_tl(t0, t0, 16);
2848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
2849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_tl(t0, t0, t1);
2850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_tl(t1, t0, 32);
2851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shli_tl(t0, t0, 32);
2852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
2853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
2854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
2857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL("bsfhl");
2859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
2860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_temp_free(t0);
2861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
2862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
2864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
2867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* CP0 (MMU and control) */
2868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
2869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
2871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ld_i32(t0, cpu_env, off);
2873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ext_i32_tl(arg, t0);
2874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
2875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
2878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ld_tl(arg, cpu_env, off);
2880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ext32s_tl(arg, arg);
2881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
2884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
2886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_trunc_tl_i32(t0, arg);
2888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_i32(t0, cpu_env, off);
2889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
2890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_mtc0_store64 (TCGv arg, target_ulong off)
2893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_ext32s_tl(arg, arg);
2895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_st_tl(arg, cpu_env, off);
2896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
2899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *rn = "invalid";
2901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (sel != 0)
2903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS32);
2904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (reg) {
2906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
2907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
2908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
2909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Index));
2910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Index";
2911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
2913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpcontrol(arg);
2915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPControl";
2916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
2918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpconf0(arg);
2920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf0";
2921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
2923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpconf1(arg);
2925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf1";
2926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
2928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
2929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
2932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
2933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
2934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_random(arg);
2935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Random";
2936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
2938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEControl));
2940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEControl";
2941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
2943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEConf0));
2945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf0";
2946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
2948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEConf1));
2950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf1";
2951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
2953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load64(arg, offsetof(CPUState, CP0_YQMask));
2955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "YQMask";
2956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
2958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load64(arg, offsetof(CPUState, CP0_VPESchedule));
2960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPESchedule";
2961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
2963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load64(arg, offsetof(CPUState, CP0_VPEScheFBack));
2965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEScheFBack";
2966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
2968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEOpt));
2970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEOpt";
2971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
2973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
2974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
2977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
2978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
2979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryLo0));
2980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
2981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo0";
2982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
2984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcstatus(arg);
2986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCStatus";
2987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
2989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcbind(arg);
2991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCBind";
2992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
2994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
2995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcrestart(arg);
2996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCRestart";
2997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
2998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
2999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tchalt(arg);
3001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCHalt";
3002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tccontext(arg);
3006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCContext";
3007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcschedule(arg);
3011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCSchedule";
3012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcschefback(arg);
3016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCScheFBack";
3017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
3023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryLo1));
3026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo1";
3028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
3034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_Context));
3037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Context";
3039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
3042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ContextConfig";
3043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
3049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PageMask));
3052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageMask";
3053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PageGrain));
3057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageGrain";
3058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 6:
3064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Wired));
3067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Wired";
3068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf0));
3072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf0";
3073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf1));
3077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf1";
3078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf2));
3082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf2";
3083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf3));
3087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf3";
3088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf4));
3092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf4";
3093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 7:
3099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_HWREna));
3103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "HWREna";
3104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 8:
3110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_BadVAddr));
3113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "BadVAddr";
3115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       }
3119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 9:
3121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Mark as an IO operation because we read the time.  */
3124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (use_icount)
3125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_io_start();
3126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_count(arg);
3127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (use_icount) {
3128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_io_end();
3129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                ctx->bstate = BS_STOP;
3130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
3131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Count";
3132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 10:
3139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryHi));
3142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryHi";
3144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11:
3150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Compare));
3153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Compare";
3154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12:
3161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Status));
3164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Status";
3165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_IntCtl));
3169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "IntCtl";
3170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSCtl));
3174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSCtl";
3175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSMap));
3179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSMap";
3180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       }
3184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 13:
3186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Cause));
3189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Cause";
3190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       }
3194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 14:
3196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EPC));
3199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EPC";
3201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 15:
3207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PRid));
3210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PRid";
3211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_EBase));
3215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EBase";
3216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       }
3220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 16:
3222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config0));
3225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config";
3226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config1));
3229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config1";
3230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config2));
3233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config2";
3234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config3));
3237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config3";
3238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 4,5 are reserved */
3240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config6));
3243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config6";
3244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config7));
3247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config7";
3248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 17:
3254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_lladdr(arg);
3257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "LLAddr";
3258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 18:
3264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
3266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfc0_watchlo, arg, sel);
3267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchLo";
3268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 19:
3274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ...7:
3276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfc0_watchhi, arg, sel);
3277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchHi";
3278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 20:
3284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
3287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
3288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_XContext));
3289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "XContext";
3291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
3293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 21:
3298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* Officially reserved, but sel 0 is used for R1x000 framemask */
3299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Framemask));
3302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Framemask";
3303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 22:
3309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(arg, 0); /* unimplemented */
3310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "'Diagnostic"; /* implementation dependent */
3311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 23:
3313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_debug(arg); /* EJTAG support */
3316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Debug";
3317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
3320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl";
3321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
3324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl2";
3325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
3328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "UserTraceData";
3329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
3332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceBPC";
3333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 24:
3339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
3342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_DEPC));
3343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DEPC";
3345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
3351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Performance0));
3354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance0";
3355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance1(arg);
3358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance1";
3359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance2(arg);
3362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance2";
3363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance3(arg);
3366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance3";
3367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance4(arg);
3370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance4";
3371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance5(arg);
3374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance5";
3375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance6(arg);
3378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance6";
3379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mfc0_performance7(arg);
3382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance7";
3383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
3389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(arg, 0); /* unimplemented */
3390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "ECC";
3391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 27:
3393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 3:
3395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(arg, 0); /* unimplemented */
3396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "CacheErr";
3397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
3403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_TagLo));
3409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagLo";
3410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DataLo));
3416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataLo";
3417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 29:
3423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_TagHi));
3429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagHi";
3430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DataHi));
3436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataHi";
3437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 30:
3443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_ErrorEPC));
3446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext32s_tl(arg, arg);
3447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ErrorEPC";
3448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 31:
3454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
3457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DESAVE));
3458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DESAVE";
3459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
3465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       goto die;
3466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
3467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
3468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
3469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
3471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
3472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
3473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_mtc0 (CPUState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
3476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *rn = "invalid";
3478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (sel != 0)
3480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS32);
3481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (use_icount)
3483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_io_start();
3484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (reg) {
3486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
3487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_index(arg);
3490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Index";
3491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_mvpcontrol(arg);
3495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPControl";
3496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf0";
3501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf1";
3506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
3512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Random";
3516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpecontrol(arg);
3520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEControl";
3521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeconf0(arg);
3525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf0";
3526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeconf1(arg);
3530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf1";
3531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_yqmask(arg);
3535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "YQMask";
3536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store64(arg, offsetof(CPUState, CP0_VPESchedule));
3540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPESchedule";
3541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store64(arg, offsetof(CPUState, CP0_VPEScheFBack));
3545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEScheFBack";
3546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeopt(arg);
3550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEOpt";
3551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
3557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entrylo0(arg);
3560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo0";
3561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcstatus(arg);
3565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCStatus";
3566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcbind(arg);
3570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCBind";
3571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcrestart(arg);
3575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCRestart";
3576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tchalt(arg);
3580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCHalt";
3581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tccontext(arg);
3585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCContext";
3586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcschedule(arg);
3590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCSchedule";
3591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
3594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcschefback(arg);
3595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCScheFBack";
3596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
3602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entrylo1(arg);
3605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo1";
3606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
3612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_context(arg);
3615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Context";
3616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_contextconfig(arg); /* SmartMIPS ASE */
3619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ContextConfig";
3620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
3626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_pagemask(arg);
3629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageMask";
3630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_pagegrain(arg);
3634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageGrain";
3635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 6:
3641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_wired(arg);
3644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Wired";
3645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf0(arg);
3649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf0";
3650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf1(arg);
3654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf1";
3655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf2(arg);
3659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf2";
3660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf3(arg);
3664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf3";
3665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf4(arg);
3669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf4";
3670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 7:
3676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_hwrena(arg);
3680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "HWREna";
3681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 8:
3687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
3688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "BadVAddr";
3689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 9:
3691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_count(arg);
3694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Count";
3695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 10:
3702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entryhi(arg);
3705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryHi";
3706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11:
3712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_compare(arg);
3715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Compare";
3716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12:
3723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(ctx, 1);
3726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_status(arg);
3727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* BS_STOP isn't good enough here, hflags may have changed. */
3728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_save_pc(ctx->pc + 4);
3729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_EXCP;
3730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Status";
3731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_intctl(arg);
3735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "IntCtl";
3738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsctl(arg);
3742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSCtl";
3745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store32(arg, offsetof(CPUState, CP0_SRSMap));
3749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSMap";
3752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 13:
3758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(ctx, 1);
3761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_cause(arg);
3762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Cause";
3763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 14:
3769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store64(arg, offsetof(CPUState, CP0_EPC));
3772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EPC";
3773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 15:
3779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PRid";
3783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
3786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_ebase(arg);
3787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EBase";
3788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 16:
3794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_config0(arg);
3797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config";
3798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored, read only */
3803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config1";
3804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_config2(arg);
3807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config2";
3808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored, read only */
3813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config3";
3814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 4,5 are reserved */
3816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
3817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config6";
3820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config7";
3824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Invalid config selector";
3827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 17:
3831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_lladdr(arg);
3834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "LLAddr";
3835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 18:
3841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
3843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtc0_watchlo, arg, sel);
3844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchLo";
3845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 19:
3851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
3853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtc0_watchhi, arg, sel);
3854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchHi";
3855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 20:
3861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
3864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
3865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_xcontext(arg);
3866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "XContext";
3867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
3869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 21:
3874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* Officially reserved, but sel 0 is used for R1x000 framemask */
3875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_framemask(arg);
3878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Framemask";
3879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 22:
3885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
3886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "Diagnostic"; /* implementation dependent */
3887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 23:
3889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_debug(arg); /* EJTAG support */
3892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* BS_STOP isn't good enough here, hflags may have changed. */
3893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_save_pc(ctx->pc + 4);
3894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_EXCP;
3895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Debug";
3896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracecontrol(arg); /* PDtrace support */
3899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl";
3900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracecontrol2(arg); /* PDtrace support */
3905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl2";
3906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_usertracedata(arg); /* PDtrace support */
3913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "UserTraceData";
3914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracebpc(arg); /* PDtrace support */
3919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
3920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
3921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceBPC";
3922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 24:
3928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
3931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store64(arg, offsetof(CPUState, CP0_DEPC));
3932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DEPC";
3933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
3939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_performance0(arg);
3942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance0";
3943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
3945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance1(arg);
3946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance1";
3947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance2(arg);
3950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance2";
3951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
3953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance3(arg);
3954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance3";
3955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance4(arg);
3958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance4";
3959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
3961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance5(arg);
3962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance5";
3963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance6(arg);
3966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance6";
3967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
3969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance7(arg);
3970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance7";
3971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
3972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       break;
3976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
3977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
3978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "ECC";
3979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
3980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 27:
3981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 3:
3983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
3984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "CacheErr";
3985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
3987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
3988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
3989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       break;
3990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
3991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
3992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
3993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
3994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
3995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
3996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_taglo(arg);
3997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagLo";
3998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
3999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_datalo(arg);
4004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataLo";
4005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 29:
4011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_taghi(arg);
4017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagHi";
4018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_datahi(arg);
4024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataHi";
4025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "invalid sel";
4028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       break;
4031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 30:
4032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store64(arg, offsetof(CPUState, CP0_ErrorEPC));
4035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ErrorEPC";
4036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 31:
4042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
4045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store32(arg, offsetof(CPUState, CP0_DESAVE));
4046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DESAVE";
4047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Stop translation as we may have switched the execution mode */
4052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
4053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
4055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       goto die;
4056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
4057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
4058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* For simplicity assume that all writes can cause interrupts.  */
4059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (use_icount) {
4060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_io_end();
4061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
4062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
4063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
4064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
4066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
4067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
4068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
4069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
4071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
4073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *rn = "invalid";
4074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (sel != 0)
4076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS64);
4077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (reg) {
4079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
4080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Index));
4083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Index";
4084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpcontrol(arg);
4088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPControl";
4089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpconf0(arg);
4093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf0";
4094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_mvpconf1(arg);
4098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf1";
4099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
4105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_random(arg);
4108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Random";
4109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEControl));
4113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEControl";
4114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEConf0));
4118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf0";
4119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEConf1));
4123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf1";
4124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_YQMask));
4128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "YQMask";
4129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_VPESchedule));
4133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPESchedule";
4134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_VPEScheFBack));
4138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEScheFBack";
4139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_VPEOpt));
4143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEOpt";
4144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
4150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryLo0));
4153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo0";
4154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcstatus(arg);
4158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCStatus";
4159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_tcbind(arg);
4163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCBind";
4164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_tcrestart(arg);
4168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCRestart";
4169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_tchalt(arg);
4173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCHalt";
4174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_tccontext(arg);
4178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCContext";
4179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_tcschedule(arg);
4183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCSchedule";
4184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_tcschefback(arg);
4188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCScheFBack";
4189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
4195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryLo1));
4198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo1";
4199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
4205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_Context));
4208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Context";
4209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
4212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ContextConfig";
4213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
4219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PageMask));
4222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageMask";
4223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PageGrain));
4227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageGrain";
4228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 6:
4234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Wired));
4237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Wired";
4238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf0));
4242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf0";
4243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf1));
4247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf1";
4248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf2));
4252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf2";
4253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf3));
4257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf3";
4258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSConf4));
4262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf4";
4263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 7:
4269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_HWREna));
4273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "HWREna";
4274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 8:
4280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_BadVAddr));
4283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "BadVAddr";
4284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 9:
4290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Mark as an IO operation because we read the time.  */
4293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (use_icount)
4294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_io_start();
4295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_count(arg);
4296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (use_icount) {
4297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_io_end();
4298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                ctx->bstate = BS_STOP;
4299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
4300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Count";
4301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
4303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 10:
4308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EntryHi));
4311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryHi";
4312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11:
4318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Compare));
4321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Compare";
4322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
4324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12:
4329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Status));
4332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Status";
4333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_IntCtl));
4337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "IntCtl";
4338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSCtl));
4342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSCtl";
4343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_SRSMap));
4347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSMap";
4348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 13:
4354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Cause));
4357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Cause";
4358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 14:
4364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_EPC));
4367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EPC";
4368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 15:
4374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_PRid));
4377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PRid";
4378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_EBase));
4382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EBase";
4383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 16:
4389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config0));
4392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config";
4393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config1));
4396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config1";
4397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config2));
4400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config2";
4401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config3));
4404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config3";
4405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* 6,7 are implementation dependent */
4407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config6));
4409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config6";
4410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Config7));
4413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config7";
4414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 17:
4420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_dmfc0_lladdr(arg);
4423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "LLAddr";
4424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 18:
4430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
4432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(dmfc0_watchlo, arg, sel);
4433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchLo";
4434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 19:
4440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
4442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfc0_watchhi, arg, sel);
4443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchHi";
4444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 20:
4450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
4453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_XContext));
4454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "XContext";
4455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 21:
4461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* Officially reserved, but sel 0 is used for R1x000 framemask */
4462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Framemask));
4465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Framemask";
4466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 22:
4472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(arg, 0); /* unimplemented */
4473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "'Diagnostic"; /* implementation dependent */
4474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 23:
4476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mfc0_debug(arg); /* EJTAG support */
4479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Debug";
4480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_tracecontrol(arg); /* PDtrace support */
4483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl";
4484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_tracecontrol2(arg); /* PDtrace support */
4487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl2";
4488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_usertracedata(arg); /* PDtrace support */
4491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "UserTraceData";
4492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_tracebpc(arg); /* PDtrace support */
4495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceBPC";
4496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 24:
4502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
4505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_DEPC));
4506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DEPC";
4507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
4513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_Performance0));
4516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance0";
4517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance1(arg);
4520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance1";
4521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance2(arg);
4524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance2";
4525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance3(arg);
4528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance3";
4529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance4(arg);
4532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance4";
4533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance5(arg);
4536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance5";
4537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance6(arg);
4540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance6";
4541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_dmfc0_performance7(arg);
4544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance7";
4545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
4546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
4551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(arg, 0); /* unimplemented */
4552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "ECC";
4553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 27:
4555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
4557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 3:
4558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_movi_tl(arg, 0); /* unimplemented */
4559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "CacheErr";
4560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
4566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_TagLo));
4572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagLo";
4573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DataLo));
4579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataLo";
4580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 29:
4586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_TagHi));
4592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagHi";
4593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DataHi));
4599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataHi";
4600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 30:
4606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUState, CP0_ErrorEPC));
4609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ErrorEPC";
4610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 31:
4616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
4619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0_load32(arg, offsetof(CPUState, CP0_DESAVE));
4620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DESAVE";
4621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
4627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto die;
4628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
4629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
4631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
4633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
4635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
4636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_dmtc0 (CPUState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
4639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *rn = "invalid";
4640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (sel != 0)
4642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS64);
4643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (use_icount)
4645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_io_start();
4646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
4647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (reg) {
4648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
4649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_index(arg);
4652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Index";
4653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_mvpcontrol(arg);
4657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPControl";
4658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
4662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf0";
4663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
4667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "MVPConf1";
4668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
4674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
4677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Random";
4678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpecontrol(arg);
4682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEControl";
4683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeconf0(arg);
4687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf0";
4688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeconf1(arg);
4692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEConf1";
4693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_yqmask(arg);
4697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "YQMask";
4698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUState, CP0_VPESchedule));
4702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPESchedule";
4703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUState, CP0_VPEScheFBack));
4707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEScheFBack";
4708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_vpeopt(arg);
4712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "VPEOpt";
4713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
4719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entrylo0(arg);
4722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo0";
4723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcstatus(arg);
4727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCStatus";
4728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcbind(arg);
4732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCBind";
4733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcrestart(arg);
4737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCRestart";
4738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tchalt(arg);
4742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCHalt";
4743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tccontext(arg);
4747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCContext";
4748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
4750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcschedule(arg);
4752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCSchedule";
4753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
4755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
4756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_tcschefback(arg);
4757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TCScheFBack";
4758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
4764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entrylo1(arg);
4767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryLo1";
4768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
4774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_context(arg);
4777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Context";
4778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//           gen_helper_mtc0_contextconfig(arg); /* SmartMIPS ASE */
4781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ContextConfig";
4782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//           break;
4783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
4788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_pagemask(arg);
4791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageMask";
4792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_pagegrain(arg);
4796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PageGrain";
4797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 6:
4803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_wired(arg);
4806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Wired";
4807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf0(arg);
4811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf0";
4812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf1(arg);
4816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf1";
4817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf2(arg);
4821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf2";
4822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
4824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf3(arg);
4826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf3";
4827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
4829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsconf4(arg);
4831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSConf4";
4832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 7:
4838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_hwrena(arg);
4842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "HWREna";
4843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 8:
4849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
4850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "BadVAddr";
4851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 9:
4853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_count(arg);
4856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Count";
4857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
4859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Stop translation as we may have switched the execution mode */
4863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
4864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 10:
4866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_entryhi(arg);
4869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EntryHi";
4870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11:
4876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_compare(arg);
4879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Compare";
4880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
4882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Stop translation as we may have switched the execution mode */
4886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
4887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12:
4889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(ctx, 1);
4892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_status(arg);
4893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* BS_STOP isn't good enough here, hflags may have changed. */
4894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_save_pc(ctx->pc + 4);
4895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_EXCP;
4896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Status";
4897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_intctl(arg);
4901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
4902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
4903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "IntCtl";
4904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_srsctl(arg);
4908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
4909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
4910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSCtl";
4911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store32(arg, offsetof(CPUState, CP0_SRSMap));
4915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
4916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
4917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "SRSMap";
4918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 13:
4924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(ctx, 1);
4927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_cause(arg);
4928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Cause";
4929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 14:
4935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUState, CP0_EPC));
4938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EPC";
4939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 15:
4945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
4948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "PRid";
4949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
4952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_ebase(arg);
4953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "EBase";
4954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 16:
4960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_config0(arg);
4963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config";
4964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
4965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
4966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
4968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored, read only */
4969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config1";
4970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
4972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_config2(arg);
4973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config2";
4974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
4975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
4976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
4978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
4979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Config3";
4980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 6,7 are implementation dependent */
4982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Invalid config selector";
4984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 17:
4988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
4990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_lladdr(arg);
4991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "LLAddr";
4992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
4993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
4994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
4995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
4996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
4997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 18:
4998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
4999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
5000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtc0_watchlo, arg, sel);
5001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchLo";
5002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 19:
5008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 7:
5010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtc0_watchhi, arg, sel);
5011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "WatchHi";
5012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 20:
5018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
5021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_xcontext(arg);
5022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "XContext";
5023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 21:
5029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* Officially reserved, but sel 0 is used for R1x000 framemask */
5030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_framemask(arg);
5033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Framemask";
5034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 22:
5040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
5041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "Diagnostic"; /* implementation dependent */
5042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 23:
5044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_debug(arg); /* EJTAG support */
5047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* BS_STOP isn't good enough here, hflags may have changed. */
5048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_save_pc(ctx->pc + 4);
5049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_EXCP;
5050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Debug";
5051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracecontrol(arg); /* PDtrace support */
5054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
5055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
5056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl";
5057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracecontrol2(arg); /* PDtrace support */
5060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
5061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
5062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceControl2";
5063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
5065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_usertracedata(arg); /* PDtrace support */
5066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
5067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
5068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "UserTraceData";
5069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_tracebpc(arg); /* PDtrace support */
5072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Stop translation as we may have switched the execution mode */
5073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
5074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TraceBPC";
5075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 24:
5081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
5084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUState, CP0_DEPC));
5085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DEPC";
5086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
5092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_performance0(arg);
5095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance0";
5096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance1(arg);
5099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance1";
5100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance2(arg);
5103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance2";
5104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
5106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance3(arg);
5107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance3";
5108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance4(arg);
5111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance4";
5112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
5114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance5(arg);
5115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance5";
5116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
5118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance6(arg);
5119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance6";
5120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
5122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            gen_helper_mtc0_performance7(arg);
5123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "Performance7";
5124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli//            break;
5125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
5130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* ignored */
5131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        rn = "ECC";
5132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 27:
5134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0 ... 3:
5136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* ignored */
5137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "CacheErr";
5138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
5144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
5149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_taglo(arg);
5150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagLo";
5151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
5154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
5155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
5156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_datalo(arg);
5157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataLo";
5158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 29:
5164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
5169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_taghi(arg);
5170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "TagHi";
5171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 3:
5174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
5175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 7:
5176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mtc0_datahi(arg);
5177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DataHi";
5178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "invalid sel";
5181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 30:
5185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUState, CP0_ErrorEPC));
5188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "ErrorEPC";
5189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 31:
5195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (sel) {
5196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* EJTAG support */
5198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0_store32(arg, offsetof(CPUState, CP0_DESAVE));
5199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            rn = "DESAVE";
5200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Stop translation as we may have switched the execution mode */
5205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
5206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto die;
5209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* For simplicity assume that all writes can cause interrupts.  */
5212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (use_icount) {
5213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_io_end();
5214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_STOP;
5215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
5217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
5219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
5221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */
5223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_mftr(CPUState *env, DisasContext *ctx, int rt, int rd,
5225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     int u, int sel, int h)
5226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
5228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_local_new();
5229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
5231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
5232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
5233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, -1);
5234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
5235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli             (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
5236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(t0, -1);
5237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else if (u == 0) {
5238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (rt) {
5239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 1:
5242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tcstatus(t0);
5243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 2:
5245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tcbind(t0);
5246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 3:
5248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tcrestart(t0);
5249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 4:
5251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tchalt(t0);
5252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 5:
5254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tccontext(t0);
5255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 6:
5257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tcschedule(t0);
5258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 7:
5260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_tcschefback(t0);
5261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mfc0(env, ctx, t0, rt, sel);
5264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 10:
5268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_entryhi(t0);
5271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mfc0(env, ctx, t0, rt, sel);
5274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 12:
5277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_status(t0);
5280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mfc0(env, ctx, t0, rt, sel);
5283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 23:
5286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mftc0_debug(t0);
5289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mfc0(env, ctx, t0, rt, sel);
5292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mfc0(env, ctx, t0, rt, sel);
5297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else switch (sel) {
5299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* GPR registers. */
5300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
5301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(mftgpr, t0, rt);
5302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Auxiliary CPU registers */
5304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
5305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (rt) {
5306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftlo, t0, 0);
5308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfthi, t0, 0);
5311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftacx, t0, 0);
5314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftlo, t0, 1);
5317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
5319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfthi, t0, 1);
5320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
5322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftacx, t0, 1);
5323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 8:
5325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftlo, t0, 2);
5326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 9:
5328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfthi, t0, 2);
5329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 10:
5331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftacx, t0, 2);
5332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 12:
5334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftlo, t0, 3);
5335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 13:
5337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mfthi, t0, 3);
5338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 14:
5340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mftacx, t0, 3);
5341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 16:
5343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mftdsp(t0);
5344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Floating point (COP1). */
5350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
5351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* XXX: For now we support only a single FPU context. */
5352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (h == 0) {
5353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, rt);
5356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_i32_tl(t0, fp0);
5357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
5359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp0, rt);
5362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_i32_tl(t0, fp0);
5363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
5367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* XXX: For now we support only a single FPU context. */
5368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(cfc1, t0, rt);
5369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* COP2: Not implemented. */
5371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
5372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
5373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* fall through */
5374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto die;
5376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
5378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_gpr(t0, rd);
5379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
5380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
5381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
5383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
5384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
5385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
5386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_mttr(CPUState *env, DisasContext *ctx, int rd, int rt,
5389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     int u, int sel, int h)
5390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
5392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_local_new();
5393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_gpr(t0, rt);
5395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
5396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
5397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
5398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* NOP */ ;
5399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
5400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli             (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
5401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* NOP */ ;
5402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else if (u == 0) {
5403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (rd) {
5404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 1:
5407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tcstatus(t0);
5408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 2:
5410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tcbind(t0);
5411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 3:
5413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tcrestart(t0);
5414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 4:
5416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tchalt(t0);
5417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 5:
5419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tccontext(t0);
5420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 6:
5422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tcschedule(t0);
5423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 7:
5425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_tcschefback(t0);
5426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mtc0(env, ctx, t0, rd, sel);
5429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 10:
5433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_entryhi(t0);
5436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mtc0(env, ctx, t0, rd, sel);
5439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 12:
5442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_status(t0);
5445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mtc0(env, ctx, t0, rd, sel);
5448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 23:
5451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (sel) {
5452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case 0:
5453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_mttc0_debug(t0);
5454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
5456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mtc0(env, ctx, t0, rd, sel);
5457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
5458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
5459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0(env, ctx, t0, rd, sel);
5462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else switch (sel) {
5464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* GPR registers. */
5465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
5466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(mttgpr, t0, rd);
5467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Auxiliary CPU registers */
5469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 1:
5470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (rd) {
5471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 0:
5472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttlo, t0, 0);
5473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 1:
5475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtthi, t0, 0);
5476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 2:
5478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttacx, t0, 0);
5479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 4:
5481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttlo, t0, 1);
5482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 5:
5484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtthi, t0, 1);
5485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 6:
5487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttacx, t0, 1);
5488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 8:
5490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttlo, t0, 2);
5491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 9:
5493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtthi, t0, 2);
5494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 10:
5496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttacx, t0, 2);
5497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 12:
5499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttlo, t0, 3);
5500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 13:
5502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mtthi, t0, 3);
5503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 14:
5505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_1i(mttacx, t0, 3);
5506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case 16:
5508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_mttdsp(t0);
5509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
5510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
5511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Floating point (COP1). */
5515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2:
5516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* XXX: For now we support only a single FPU context. */
5517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (h == 0) {
5518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
5521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, rd);
5522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
5524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
5527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, rd);
5528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
5532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* XXX: For now we support only a single FPU context. */
5533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(ctc1, t0, rd);
5534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* COP2: Not implemented. */
5536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 4:
5537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 5:
5538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* fall through */
5539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto die;
5541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
5543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
5544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return;
5545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidie:
5547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
5548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
5549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    generate_exception(ctx, EXCP_RI);
5550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
5553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "ldst";
5555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
5557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFC0:
5558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rt == 0) {
5559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
5560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
5561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_mfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
5563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mfc0";
5564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTC0:
5566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_new();
5568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rt);
5570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_mtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
5571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
5572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mtc0";
5574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
5576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMFC0:
5577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3);
5578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rt == 0) {
5579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
5580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
5581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_dmfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
5583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmfc0";
5584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMTC0:
5586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3);
5587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_new();
5589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, rt);
5591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_dmtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
5592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
5593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmtc0";
5595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
5597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFTR:
5598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ASE_MT);
5599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (rd == 0) {
5600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
5601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
5602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
5604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
5605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mftr";
5606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTTR:
5608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ASE_MT);
5609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
5610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
5611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mttr";
5612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLBWI:
5614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "tlbwi";
5615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!env->tlb->helper_tlbwi)
5616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_tlbwi();
5618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLBWR:
5620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "tlbwr";
5621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!env->tlb->helper_tlbwr)
5622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_tlbwr();
5624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLBP:
5626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "tlbp";
5627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!env->tlb->helper_tlbp)
5628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_tlbp();
5630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_TLBR:
5632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "tlbr";
5633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!env->tlb->helper_tlbr)
5634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            goto die;
5635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_tlbr();
5636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ERET:
5638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "eret";
5639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS2);
5640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_eret();
5641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_EXCP;
5642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DERET:
5644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "deret";
5645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS32);
5646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!(ctx->hflags & MIPS_HFLAG_DM)) {
5647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL(opn);
5648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
5649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
5650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_deret();
5651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_EXCP;
5652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_WAIT:
5655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "wait";
5656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
5657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If we get an exception, we want to restart at next instruction */
5658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->pc += 4;
5659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 1);
5660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->pc -= 4;
5661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_wait();
5662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_EXCP;
5663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli die:
5666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
5667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
5668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
5669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
5671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
5673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* CP1 Branches (before delay slot) */
5675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                 int32_t cc, int32_t offset)
5677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong btarget;
5679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "cp1 cond branch";
5680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
5681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (cc != 0)
5683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
5684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    btarget = ctx->pc + 4 + offset;
5686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (op) {
5688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1F:
5689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_not_i32(t0, t0);
5691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t0, t0, 1);
5692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_extu_i32_tl(bcond, t0);
5693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1f";
5694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto not_likely;
5695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1FL:
5696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_not_i32(t0, t0);
5698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t0, t0, 1);
5699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_extu_i32_tl(bcond, t0);
5700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1fl";
5701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto likely;
5702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1T:
5703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t0, t0, 1);
5705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_extu_i32_tl(bcond, t0);
5706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1t";
5707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto not_likely;
5708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1TL:
5709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_i32(t0, t0, 1);
5711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_extu_i32_tl(bcond, t0);
5712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1tl";
5713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    likely:
5714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->hflags |= MIPS_HFLAG_BL;
5715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1FANY2:
5717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 t1 = tcg_temp_new_i32();
5719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
5721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(t1);
5723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_i32(t0, t0);
5724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_i32(t0, t0, 1);
5725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(bcond, t0);
5726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1any2f";
5728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto not_likely;
5729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1TANY2:
5730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 t1 = tcg_temp_new_i32();
5732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
5734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(t1);
5736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_i32(t0, t0, 1);
5737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(bcond, t0);
5738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1any2t";
5740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto not_likely;
5741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1FANY4:
5742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 t1 = tcg_temp_new_i32();
5744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
5746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
5748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
5750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(t1);
5752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_not_i32(t0, t0);
5753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_i32(t0, t0, 1);
5754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(bcond, t0);
5755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1any4f";
5757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto not_likely;
5758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BC1TANY4:
5759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 t1 = tcg_temp_new_i32();
5761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
5762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
5763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
5765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
5767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_or_i32(t0, t0, t1);
5768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(t1);
5769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_i32(t0, t0, 1);
5770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(bcond, t0);
5771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "bc1any4t";
5773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    not_likely:
5774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->hflags |= MIPS_HFLAG_BC;
5775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
5778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception (ctx, EXCP_RI);
5779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
5780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
5782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               ctx->hflags, btarget);
5783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx->btarget = btarget;
5784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
5786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
5787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Coprocessor 1 (FPU) */
5790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP(func, fmt) (((fmt) << 21) | (func))
5792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
5794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "cp1 move";
5796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
5797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
5799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFC1:
5800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
5804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_i32_tl(t0, fp0);
5805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
5808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mfc1";
5809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTC1:
5811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
5812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
5816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fs);
5817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mtc1";
5820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CFC1:
5822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(cfc1, t0, fs);
5823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
5824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cfc1";
5825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CTC1:
5827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
5828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_1i(ctc1, t0, fs);
5829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ctc1";
5830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
5832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMFC1:
5833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_fpr64(ctx, t0, fs);
5834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
5835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmfc1";
5836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DMTC1:
5838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
5839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_fpr64(ctx, t0, fs);
5840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "dmtc1";
5841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
5843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MFHC1:
5844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp0, fs);
5848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_ext_i32_tl(t0, fp0);
5849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_store_gpr(t0, rt);
5852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mfhc1";
5853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MTHC1:
5855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, rt);
5856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
5857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
5858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
5860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, fs);
5861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
5862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
5863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mthc1";
5864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
5865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
5866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
5867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception (ctx, EXCP_RI);
5868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        goto out;
5869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
5871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli out:
5873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
5874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1;
5879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGCond cond;
5880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0;
5881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rd == 0) {
5883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Treat as NOP. */
5884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
5885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tf)
5888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_EQ;
5889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
5890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_NE;
5891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    l1 = gen_new_label();
5893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    t0 = tcg_temp_new_i32();
5894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
5895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_i32(cond, t0, 0, l1);
5896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
5897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (rs == 0) {
5898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_tl(cpu_gpr[rd], 0);
5899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
5900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
5901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
5902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);
5903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_movcf_s (int fs, int fd, int cc, int tf)
5906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cond;
5908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
5909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();
5910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tf)
5912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_EQ;
5913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
5914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_NE;
5915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
5917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_i32(cond, t0, 0, l1);
5918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_fpr32(t0, fs);
5919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_fpr32(t0, fd);
5920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);
5921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
5922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
5925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cond;
5927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
5928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i64 fp0;
5929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();
5930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tf)
5932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_EQ;
5933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
5934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_NE;
5935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
5937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_i32(cond, t0, 0, l1);
5938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
5939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fp0 = tcg_temp_new_i64();
5940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_fpr64(ctx, fp0, fs);
5941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_fpr64(ctx, fp0, fd);
5942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i64(fp0);
5943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);
5944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
5947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cond;
5949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv_i32 t0 = tcg_temp_new_i32();
5950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l1 = gen_new_label();
5951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int l2 = gen_new_label();
5952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tf)
5954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_EQ;
5955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
5956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cond = TCG_COND_NE;
5957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
5959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_i32(cond, t0, 0, l1);
5960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_fpr32(t0, fs);
5961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_fpr32(t0, fd);
5962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l1);
5963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
5965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_gen_brcondi_i32(cond, t0, 0, l2);
5966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_load_fpr32h(t0, fs);
5967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_store_fpr32h(t0, fd);
5968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free_i32(t0);
5969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_set_label(l2);
5970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
5971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
5973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_farith (DisasContext *ctx, uint32_t op1,
5974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        int ft, int fs, int fd, int cc)
5975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
5976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "farith";
5977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *condnames[] = {
5978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.f",
5979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.un",
5980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.eq",
5981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ueq",
5982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.olt",
5983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ult",
5984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ole",
5985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ule",
5986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.sf",
5987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ngle",
5988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.seq",
5989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ngl",
5990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.lt",
5991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.nge",
5992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.le",
5993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "c.ngt",
5994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    };
5995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *condnames_abs[] = {
5996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.f",
5997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.un",
5998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.eq",
5999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ueq",
6000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.olt",
6001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ult",
6002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ole",
6003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ule",
6004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.sf",
6005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ngle",
6006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.seq",
6007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ngl",
6008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.lt",
6009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.nge",
6010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.le",
6011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            "cabs.ngt",
6012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    };
6013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
6014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t func = ctx->opcode & 0x3f;
6015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (ctx->opcode & FOP(0x3f, 0x1f)) {
6017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(0, 16):
6018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_add_s(fp0, fp0, fp1);
6025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "add.s";
6030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(1, 16):
6033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_sub_s(fp0, fp0, fp1);
6040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sub.s";
6045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(2, 16):
6048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mul_s(fp0, fp0, fp1);
6055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mul.s";
6060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(3, 16):
6063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_div_s(fp0, fp0, fp1);
6070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "div.s";
6075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(4, 16):
6078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_sqrt_s(fp0, fp0);
6083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sqrt.s";
6087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(5, 16):
6089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_abs_s(fp0, fp0);
6094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "abs.s";
6098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(6, 16):
6100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mov.s";
6108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(7, 16):
6110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_chs_s(fp0, fp0);
6115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "neg.s";
6119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(8, 16):
6121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_roundl_s(fp64, fp32);
6128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "round.l.s";
6133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(9, 16):
6135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_truncl_s(fp64, fp32);
6142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "trunc.l.s";
6147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(10, 16):
6149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_ceill_s(fp64, fp32);
6156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ceil.l.s";
6161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(11, 16):
6163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_floorl_s(fp64, fp32);
6170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "floor.l.s";
6175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(12, 16):
6177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_roundw_s(fp0, fp0);
6182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "round.w.s";
6186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(13, 16):
6188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_truncw_s(fp0, fp0);
6193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "trunc.w.s";
6197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(14, 16):
6199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_ceilw_s(fp0, fp0);
6204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ceil.w.s";
6208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(15, 16):
6210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_floorw_s(fp0, fp0);
6215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "floor.w.s";
6219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(17, 16):
6221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_movcf_s(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
6222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movcf.s";
6223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(18, 16):
6225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0;
6228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0) {
6230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
6231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fp0 = tcg_temp_new_i32();
6233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
6237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movz.s";
6239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(19, 16):
6241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0;
6244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0) {
6246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
6247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                fp0 = tcg_temp_new_i32();
6248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_fpr32(fp0, fs);
6249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_store_fpr32(fp0, fd);
6250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free_i32(fp0);
6251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_set_label(l1);
6252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movn.s";
6255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(21, 16):
6257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
6258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip_s(fp0, fp0);
6263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip.s";
6267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(22, 16):
6269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
6270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt_s(fp0, fp0);
6275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt.s";
6279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(28, 16):
6281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, fd);
6288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip2_s(fp0, fp0, fp1);
6289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip2.s";
6294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(29, 16):
6296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip1_s(fp0, fp0);
6302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip1.s";
6306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(30, 16):
6308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt1_s(fp0, fp0);
6314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt1.s";
6318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(31, 16):
6320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt2_s(fp0, fp0, fp1);
6328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt2.s";
6333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(33, 16):
6335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd);
6336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtd_s(fp64, fp32);
6342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.d.s";
6347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(36, 16):
6349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtw_s(fp0, fp0);
6354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.w.s";
6358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(37, 16):
6360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtl_s(fp64, fp32);
6367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.l.s";
6372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(38, 16):
6374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32_0 = tcg_temp_new_i32();
6378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32_1 = tcg_temp_new_i32();
6379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32_0, fs);
6381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32_1, ft);
6382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_concat_i32_i64(fp64, fp32_0, fp32_1);
6383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32_1);
6384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32_0);
6385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.ps.s";
6389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(48, 16):
6391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(49, 16):
6392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(50, 16):
6393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(51, 16):
6394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(52, 16):
6395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(53, 16):
6396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(54, 16):
6397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(55, 16):
6398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(56, 16):
6399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(57, 16):
6400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(58, 16):
6401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(59, 16):
6402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(60, 16):
6403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(61, 16):
6404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(62, 16):
6405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(63, 16):
6406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
6409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
6412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ctx->opcode & (1 << 6)) {
6413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cop1x(ctx);
6414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmpabs_s(func-48, fp0, fp1, cc);
6415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames_abs[func-48];
6416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
6417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmp_s(func-48, fp0, fp1, cc);
6418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames[func-48];
6419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
6422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(0, 17):
6425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | ft | fd);
6426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_add_d(fp0, fp0, fp1);
6433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "add.d";
6438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(1, 17):
6441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | ft | fd);
6442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_sub_d(fp0, fp0, fp1);
6449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sub.d";
6454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(2, 17):
6457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | ft | fd);
6458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mul_d(fp0, fp0, fp1);
6465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mul.d";
6470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(3, 17):
6473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | ft | fd);
6474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_div_d(fp0, fp0, fp1);
6481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "div.d";
6486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        optype = BINOP;
6487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(4, 17):
6489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | fd);
6490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_sqrt_d(fp0, fp0);
6495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sqrt.d";
6499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(5, 17):
6501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | fd);
6502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_abs_d(fp0, fp0);
6507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "abs.d";
6511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(6, 17):
6513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | fd);
6514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mov.d";
6522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(7, 17):
6524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs | fd);
6525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_chs_d(fp0, fp0);
6530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "neg.d";
6534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(8, 17):
6536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_roundl_d(fp0, fp0);
6542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "round.l.d";
6546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(9, 17):
6548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_truncl_d(fp0, fp0);
6554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "trunc.l.d";
6558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(10, 17):
6560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_ceill_d(fp0, fp0);
6566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ceil.l.d";
6570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(11, 17):
6572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_floorl_d(fp0, fp0);
6578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "floor.l.d";
6582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(12, 17):
6584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_roundw_d(fp32, fp64);
6591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "round.w.d";
6596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(13, 17):
6598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_truncw_d(fp32, fp64);
6605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "trunc.w.d";
6610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(14, 17):
6612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_ceilw_d(fp32, fp64);
6619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ceil.w.d";
6624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(15, 17):
6626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_floorw_d(fp32, fp64);
6633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "floor.w.d";
6638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(17, 17):
6640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
6641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movcf.d";
6642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(18, 17):
6644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0;
6647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0) {
6649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
6650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fp0 = tcg_temp_new_i64();
6652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
6656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movz.d";
6658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(19, 17):
6660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0;
6663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0) {
6665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
6666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                fp0 = tcg_temp_new_i64();
6667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_fpr64(ctx, fp0, fs);
6668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_store_fpr64(ctx, fp0, fd);
6669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free_i64(fp0);
6670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_set_label(l1);
6671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movn.d";
6674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(21, 17):
6676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip_d(fp0, fp0);
6682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip.d";
6686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(22, 17):
6688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt_d(fp0, fp0);
6694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt.d";
6698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(28, 17):
6700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip2_d(fp0, fp0, fp1);
6708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip2.d";
6713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(29, 17):
6715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip1_d(fp0, fp0);
6721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip1.d";
6725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(30, 17):
6727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt1_d(fp0, fp0);
6733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt1.d";
6737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(31, 17):
6739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt2_d(fp0, fp0, fp1);
6747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt2.d";
6752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(48, 17):
6754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(49, 17):
6755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(50, 17):
6756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(51, 17):
6757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(52, 17):
6758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(53, 17):
6759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(54, 17):
6760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(55, 17):
6761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(56, 17):
6762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(57, 17):
6763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(58, 17):
6764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(59, 17):
6765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(60, 17):
6766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(61, 17):
6767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(62, 17):
6768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(63, 17):
6769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ctx->opcode & (1 << 6)) {
6776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cop1x(ctx);
6777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cp1_registers(ctx, fs | ft);
6778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmpabs_d(func-48, fp0, fp1, cc);
6779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames_abs[func-48];
6780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
6781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cp1_registers(ctx, fs | ft);
6782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmp_d(func-48, fp0, fp1, cc);
6783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames[func-48];
6784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
6785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(32, 17):
6790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvts_d(fp32, fp64);
6797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.s.d";
6802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(36, 17):
6804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
6805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtw_d(fp32, fp64);
6811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.w.d";
6816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(37, 17):
6818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtl_d(fp0, fp0);
6824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.l.d";
6828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(32, 20):
6830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
6832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
6834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvts_w(fp0, fp0);
6835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
6836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
6837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.s.w";
6839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(33, 20):
6841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd);
6842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp32, fs);
6847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtd_w(fp64, fp32);
6848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp64, fd);
6850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.d.w";
6853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(32, 21):
6855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp32 = tcg_temp_new_i32();
6858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp64 = tcg_temp_new_i64();
6859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp64, fs);
6861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvts_l(fp32, fp64);
6862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp64);
6863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp32, fd);
6864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp32);
6865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.s.l";
6867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(33, 21):
6869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtd_l(fp0, fp0);
6875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.d.l";
6879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(38, 20):
6881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtps_pw(fp0, fp0);
6887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.ps.pw";
6891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(0, 22):
6893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_add_ps(fp0, fp0, fp1);
6901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "add.ps";
6906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(1, 22):
6908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_sub_ps(fp0, fp0, fp1);
6916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sub.ps";
6921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(2, 22):
6923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
6927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
6930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mul_ps(fp0, fp0, fp1);
6931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
6932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mul.ps";
6936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(5, 22):
6938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_abs_ps(fp0, fp0);
6944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "abs.ps";
6948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(6, 22):
6950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mov.ps";
6959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(7, 22):
6961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
6964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_chs_ps(fp0, fp0);
6967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "neg.ps";
6971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(17, 22):
6973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_movcf_ps(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
6975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movcf.ps";
6976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(18, 22):
6978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0;
6982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0)
6984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
6985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fp0 = tcg_temp_new_i64();
6986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
6987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
6988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
6989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
6990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
6991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movz.ps";
6992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
6993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(19, 22):
6994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
6995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
6996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
6997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0;
6998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
6999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ft != 0) {
7000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
7001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                fp0 = tcg_temp_new_i64();
7002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_fpr64(ctx, fp0, fs);
7003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_store_fpr64(ctx, fp0, fd);
7004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free_i64(fp0);
7005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_set_label(l1);
7006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "movn.ps";
7009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(24, 22):
7011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, ft);
7017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, fs);
7018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_addr_ps(fp0, fp0, fp1);
7019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "addr.ps";
7024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(26, 22):
7026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, ft);
7032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, fs);
7033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mulr_ps(fp0, fp0, fp1);
7034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "mulr.ps";
7039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(28, 22):
7041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, fd);
7048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip2_ps(fp0, fp0, fp1);
7049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip2.ps";
7054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(29, 22):
7056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_recip1_ps(fp0, fp0);
7062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "recip1.ps";
7066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(30, 22):
7068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt1_ps(fp0, fp0);
7074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt1.ps";
7078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(31, 22):
7080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_rsqrt2_ps(fp0, fp0, fp1);
7088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "rsqrt2.ps";
7093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(32, 22):
7095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp0, fs);
7100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvts_pu(fp0, fp0);
7101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
7102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.s.pu";
7105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(36, 22):
7107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvtpw_ps(fp0, fp0);
7113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.pw.ps";
7117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(40, 22):
7119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_cvts_pl(fp0, fp0);
7125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
7126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "cvt.s.pl";
7129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(44, 22):
7131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, fd);
7139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp1, fd);
7140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "pll.ps";
7144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(45, 22):
7146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp1, ft);
7153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp1, fd);
7154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, fd);
7155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "plu.ps";
7159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(46, 22):
7161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp0, fs);
7167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp1, fd);
7169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, fd);
7170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "pul.ps";
7174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(47, 22):
7176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp0, fs);
7182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fp1, ft);
7183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp1, fd);
7184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp0, fd);
7185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "puu.ps";
7189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(48, 22):
7191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(49, 22):
7192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(50, 22):
7193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(51, 22):
7194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(52, 22):
7195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(53, 22):
7196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(54, 22):
7197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(55, 22):
7198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(56, 22):
7199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(57, 22):
7200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(58, 22):
7201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(59, 22):
7202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(60, 22):
7203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(61, 22):
7204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(62, 22):
7205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case FOP(63, 22):
7206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ctx->opcode & (1 << 6)) {
7214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmpabs_ps(func-48, fp0, fp1, cc);
7215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames_abs[func-48];
7216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
7217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cmp_ps(func-48, fp0, fp1, cc);
7218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                opn = condnames[func-48];
7219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
7225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
7226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception (ctx, EXCP_RI);
7227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
7228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (optype) {
7230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case BINOP:
7231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
7232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case CMPOP:
7234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
7235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
7237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
7238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
7241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Coprocessor 3 (FPU) */
7243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
7244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                           int fd, int fs, int base, int index)
7245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
7246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "extended float load/store";
7247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int store = 0;
7248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGv t0 = tcg_temp_new();
7249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (base == 0) {
7251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, index);
7252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (index == 0) {
7253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, base);
7254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
7255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_load_gpr(t0, index);
7256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_op_addr_add(ctx, t0, cpu_gpr[base], t0);
7257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Don't do NOP if destination is zero: we must perform the actual
7259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       memory access. */
7260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    save_cpu_state(ctx, 0);
7261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
7262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWXC1:
7263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
7268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_trunc_tl_i32(fp0, t0);
7269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp0, fd);
7270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "lwxc1";
7273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDXC1:
7275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd);
7277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
7281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "ldxc1";
7285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LUXC1:
7287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~0x7);
7289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
7293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp0, fd);
7294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "luxc1";
7297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWXC1:
7299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t1 = tcg_temp_new();
7303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_extu_i32_tl(t1, fp0);
7306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
7307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t1);
7309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "swxc1";
7311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        store = 1;
7312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDXC1:
7314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fs);
7316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
7321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "sdxc1";
7324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        store = 1;
7325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SUXC1:
7327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_andi_tl(t0, t0, ~0x7);
7329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
7334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "suxc1";
7337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        store = 1;
7338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tcg_temp_free(t0);
7341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
7342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               regnames[index], regnames[base]);
7343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
7344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
7346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                            int fd, int fr, int fs, int ft)
7347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
7348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const char *opn = "flt3_arith";
7349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (opc) {
7351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ALNV_PS:
7352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv t0 = tcg_temp_local_new();
7355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp = tcg_temp_new_i32();
7356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fph = tcg_temp_new_i32();
7357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l1 = gen_new_label();
7358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            int l2 = gen_new_label();
7359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_gpr(t0, fr);
7361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_andi_tl(t0, t0, 0x7);
7362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
7364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp, fs);
7365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fph, fs);
7366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp, fd);
7367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fph, fd);
7368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_br(l2);
7369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l1);
7370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
7371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free(t0);
7372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN
7373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp, fs);
7374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fph, ft);
7375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp, fd);
7376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fph, fd);
7377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
7378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32h(fph, fs);
7379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp, ft);
7380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fph, fd);
7381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32h(fp, fd);
7382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_set_label(l2);
7384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp);
7385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fph);
7386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "alnv.ps";
7388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MADD_S:
7390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp2 = tcg_temp_new_i32();
7395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp2, fr);
7399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_muladd_s(fp2, fp0, fp1, fp2);
7400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp2, fd);
7403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp2);
7404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "madd.s";
7406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MADD_D:
7408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd | fs | ft | fr);
7410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_muladd_d(fp2, fp0, fp1, fp2);
7419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "madd.d";
7425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MADD_PS:
7427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_muladd_ps(fp2, fp0, fp1, fp2);
7437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "madd.ps";
7443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MSUB_S:
7445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp2 = tcg_temp_new_i32();
7450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp2, fr);
7454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mulsub_s(fp2, fp0, fp1, fp2);
7455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp2, fd);
7458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp2);
7459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msub.s";
7461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MSUB_D:
7463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd | fs | ft | fr);
7465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mulsub_d(fp2, fp0, fp1, fp2);
7474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msub.d";
7480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MSUB_PS:
7482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_mulsub_ps(fp2, fp0, fp1, fp2);
7492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "msub.ps";
7498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMADD_S:
7500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp2 = tcg_temp_new_i32();
7505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp2, fr);
7509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmuladd_s(fp2, fp0, fp1, fp2);
7510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp2, fd);
7513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp2);
7514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmadd.s";
7516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMADD_D:
7518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd | fs | ft | fr);
7520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmuladd_d(fp2, fp0, fp1, fp2);
7529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmadd.d";
7535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMADD_PS:
7537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmuladd_ps(fp2, fp0, fp1, fp2);
7547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmadd.ps";
7553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMSUB_S:
7555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp0 = tcg_temp_new_i32();
7558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp1 = tcg_temp_new_i32();
7559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i32 fp2 = tcg_temp_new_i32();
7560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp0, fs);
7562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp1, ft);
7563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr32(fp2, fr);
7564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmulsub_s(fp2, fp0, fp1, fp2);
7565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp0);
7566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp1);
7567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr32(fp2, fd);
7568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i32(fp2);
7569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmsub.s";
7571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMSUB_D:
7573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cop1x(ctx);
7574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_registers(ctx, fd | fs | ft | fr);
7575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmulsub_d(fp2, fp0, fp1, fp2);
7584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmsub.d";
7590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_NMSUB_PS:
7592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp1_64bitmode(ctx);
7593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
7594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp0 = tcg_temp_new_i64();
7595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp1 = tcg_temp_new_i64();
7596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            TCGv_i64 fp2 = tcg_temp_new_i64();
7597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp0, fs);
7599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp1, ft);
7600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_fpr64(ctx, fp2, fr);
7601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_float_nmulsub_ps(fp2, fp0, fp1, fp2);
7602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp0);
7603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp1);
7604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_fpr64(ctx, fp2, fd);
7605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_temp_free_i64(fp2);
7606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        opn = "nmsub.ps";
7608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
7610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL(opn);
7611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception (ctx, EXCP_RI);
7612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
7613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
7615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli               fregnames[fs], fregnames[ft]);
7616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
7617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* ISA extensions (ASEs) */
7619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS16 extension to MIPS32 */
7620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* SmartMIPS extension to MIPS32 */
7621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
7623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MDMX extension to MIPS64 */
7625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void decode_opc (CPUState *env, DisasContext *ctx)
7629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
7630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int32_t offset;
7631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int rs, rt, rd, sa;
7632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t op, op1, op2;
7633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int16_t imm;
7634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* make sure instructions are on a word boundary */
7636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->pc & 0x3) {
7637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_BadVAddr = ctx->pc;
7638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_AdEL);
7639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
7640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Handle blikely not taken case */
7643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((ctx->hflags & MIPS_HFLAG_BMASK) == MIPS_HFLAG_BL) {
7644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        int l1 = gen_new_label();
7645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
7647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
7648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
7649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_goto_tb(ctx, 1, ctx->pc + 4);
7650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_set_label(l1);
7651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
7652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP)))
7654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tcg_gen_debug_insn_start(ctx->pc);
7655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    op = MASK_OP_MAJOR(ctx->opcode);
7657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    rs = (ctx->opcode >> 21) & 0x1f;
7658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    rt = (ctx->opcode >> 16) & 0x1f;
7659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    rd = (ctx->opcode >> 11) & 0x1f;
7660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    sa = (ctx->opcode >> 6) & 0x1f;
7661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    imm = (int16_t)ctx->opcode;
7662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (op) {
7663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SPECIAL:
7664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op1 = MASK_SPECIAL(ctx->opcode);
7665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (op1) {
7666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SLL:          /* Shift with immediate */
7667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SRA:
7668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SRL:
7669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_shift_imm(env, ctx, op1, rd, rt, sa);
7670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MOVN:         /* Conditional move */
7672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MOVZ:
7673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
7674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_cond_move(env, op1, rd, rs, rt);
7675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_ADD ... OPC_SUBU:
7677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_arith(env, ctx, op1, rd, rs, rt);
7678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SLLV:         /* Shifts */
7680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SRLV:
7681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SRAV:
7682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_shift(env, ctx, op1, rd, rs, rt);
7683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SLT:          /* Set on less than */
7685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SLTU:
7686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_slt(env, op1, rd, rs, rt);
7687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_AND:          /* Logic*/
7689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_OR:
7690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_NOR:
7691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_XOR:
7692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_logic(env, op1, rd, rs, rt);
7693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MULT ... OPC_DIVU:
7695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (sa) {
7696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_insn(env, ctx, INSN_VR54XX);
7697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                op1 = MASK_MUL_VR54XX(ctx->opcode);
7698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_mul_vr54xx(ctx, op1, rd, rs, rt);
7699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else
7700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_muldiv(ctx, op1, rs, rt);
7701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_JR ... OPC_JALR:
7703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_compute_branch(ctx, op1, rs, rd, sa);
7704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
7705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGE ... OPC_TEQ: /* Traps */
7706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNE:
7707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_trap(ctx, op1, rs, rt, -1);
7708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MFHI:          /* Move from HI/LO */
7710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MFLO:
7711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_HILO(ctx, op1, rd);
7712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MTHI:
7714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MTLO:          /* Move to HI/LO */
7715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_HILO(ctx, op1, rs);
7716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_PMON:          /* Pmon entry point, also R4010 selsl */
7718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef MIPS_STRICT_STANDARD
7719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("PMON / selsl");
7720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
7722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_0i(pmon, sa);
7723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SYSCALL:
7726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_SYSCALL);
7727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            ctx->bstate = BS_STOP;
7728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BREAK:
7730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_BREAK);
7731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SPIM:
7733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef MIPS_STRICT_STANDARD
7734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("SPIM");
7735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
7737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           /* Implemented as RI exception for now. */
7738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("spim (unofficial)");
7739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SYNC:
7743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
7744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MOVCI:
7747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
7748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->CP0_Config1 & (1 << CP0C1_FP)) {
7749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cp1_enabled(ctx);
7750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
7751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                          (ctx->opcode >> 16) & 1);
7752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
7753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                generate_exception_err(ctx, EXCP_CpU, 1);
7754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
7758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       /* MIPS64 specific opcodes */
7759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSLL:
7760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRA:
7761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRL:
7762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSLL32:
7763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRA32:
7764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRL32:
7765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
7766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_shift_imm(env, ctx, op1, rd, rt, sa);
7768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DADD ... OPC_DSUBU:
7770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
7771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_arith(env, ctx, op1, rd, rs, rt);
7773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSLLV:
7775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRAV:
7776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DSRLV:
7777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
7778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_shift(env, ctx, op1, rd, rs, rt);
7780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DMULT ... OPC_DDIVU:
7782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS3);
7783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_muldiv(ctx, op1, rs, rt);
7785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:            /* Invalid */
7788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("special");
7789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SPECIAL2:
7794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op1 = MASK_SPECIAL2(ctx->opcode);
7795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (op1) {
7796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
7797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MSUB ... OPC_MSUBU:
7798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32);
7799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_muldiv(ctx, op1, rs, rt);
7800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MUL:
7802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_arith(env, ctx, op1, rd, rs, rt);
7803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_CLO:
7805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_CLZ:
7806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32);
7807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_cl(ctx, op1, rd, rs);
7808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SDBBP:
7810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* XXX: not clear which exception should be raised
7811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli             *      when in debug mode...
7812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli             */
7813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32);
7814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (!(ctx->hflags & MIPS_HFLAG_DM)) {
7815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                generate_exception(ctx, EXCP_DBp);
7816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            } else {
7817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                generate_exception(ctx, EXCP_DBp);
7818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
7820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
7822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DCLO:
7823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DCLZ:
7824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS64);
7825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_cl(ctx, op1, rd, rs);
7827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:            /* Invalid */
7830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("special2");
7831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SPECIAL3:
7836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op1 = MASK_SPECIAL3(ctx->opcode);
7837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (op1) {
7838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_EXT:
7839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_INS:
7840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
7841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_bitops(ctx, op1, rt, rs, sa, rd);
7842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BSHFL:
7844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
7845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            op2 = MASK_BSHFL(ctx->opcode);
7846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_bshfl(ctx, op2, rt, rd);
7847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_RDHWR:
7849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
7850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            {
7851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv t0 = tcg_temp_new();
7852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                switch (rd) {
7854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case 0:
7855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
7856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_rdhwr_cpunum(t0);
7857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case 1:
7860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
7861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_rdhwr_synci_step(t0);
7862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case 2:
7865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
7866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_rdhwr_cc(t0);
7867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case 3:
7870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
7871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_rdhwr_ccres(t0);
7872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case 29:
7875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY)
7876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, tls_value));
7877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
7880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    /* XXX: Some CPUs implement this in hardware.
7881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                       Not supported yet. */
7882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                default:            /* Invalid */
7884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    MIPS_INVAL("rdhwr");
7885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    generate_exception(ctx, EXCP_RI);
7886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
7888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free(t0);
7889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_FORK:
7892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
7893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            {
7894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv t0 = tcg_temp_new();
7895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv t1 = tcg_temp_new();
7896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_gpr(t0, rt);
7898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_gpr(t1, rs);
7899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_fork(t0, t1);
7900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free(t0);
7901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free(t1);
7902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_YIELD:
7905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ASE_MT);
7906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            {
7907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv t0 = tcg_temp_new();
7908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                save_cpu_state(ctx, 1);
7910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_load_gpr(t0, rs);
7911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_yield(t0, t0);
7912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_store_gpr(t0, rd);
7913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free(t0);
7914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
7915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
7917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DEXTM ... OPC_DEXT:
7918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DINSM ... OPC_DINS:
7919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS64R2);
7920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_bitops(ctx, op1, rt, rs, sa, rd);
7922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DBSHFL:
7924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS64R2);
7925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_mips_64(ctx);
7926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            op2 = MASK_DBSHFL(ctx->opcode);
7927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_bshfl(ctx, op2, rt, rd);
7928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:            /* Invalid */
7931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("special3");
7932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_REGIMM:
7937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op1 = MASK_REGIMM(ctx->opcode);
7938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (op1) {
7939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
7940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_BLTZAL ... OPC_BGEZALL:
7941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_compute_branch(ctx, op1, rs, -1, imm << 2);
7942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
7943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
7944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_TNEI:
7945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_trap(ctx, op1, rs, -1, imm);
7946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_SYNCI:
7948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
7949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Treat as NOP. */
7950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:            /* Invalid */
7952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("regimm");
7953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
7954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
7956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
7957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CP0:
7958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_cp0_enabled(ctx);
7959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        op1 = MASK_CP0(ctx->opcode);
7960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (op1) {
7961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MFC0:
7962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MTC0:
7963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MFTR:
7964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MTTR:
7965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
7966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DMFC0:
7967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_DMTC0:
7968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
7969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
7970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_cp0(env, ctx, op1, rt, rd);
7971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
7972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_C0_FIRST ... OPC_C0_LAST:
7974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
7975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
7976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
7977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
7978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_MFMC0:
7979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
7980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            {
7981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                TCGv t0 = tcg_temp_new();
7982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
7983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                op2 = MASK_MFMC0(ctx->opcode);
7984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                switch (op2) {
7985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_DMT:
7986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ASE_MT);
7987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_dmt(t0, t0);
7988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_EMT:
7991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ASE_MT);
7992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_emt(t0, t0);
7993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
7995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_DVPE:
7996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ASE_MT);
7997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_dvpe(t0, t0);
7998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
7999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
8000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_EVPE:
8001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ASE_MT);
8002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_evpe(t0, t0);
8003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
8004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
8005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_DI:
8006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ISA_MIPS32R2);
8007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
8008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_di(t0);
8009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
8010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    /* Stop translation as we may have switched the execution mode */
8011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    ctx->bstate = BS_STOP;
8012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
8013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                case OPC_EI:
8014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    check_insn(env, ctx, ISA_MIPS32R2);
8015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(ctx, 1);
8016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_ei(t0);
8017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_store_gpr(t0, rt);
8018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    /* Stop translation as we may have switched the execution mode */
8019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    ctx->bstate = BS_STOP;
8020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
8021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                default:            /* Invalid */
8022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    MIPS_INVAL("mfmc0");
8023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    generate_exception(ctx, EXCP_RI);
8024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    break;
8025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
8026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_temp_free(t0);
8027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
8029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_RDPGPR:
8031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
8032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_load_srsgpr(rt, rd);
8033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case OPC_WRPGPR:
8035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_insn(env, ctx, ISA_MIPS32R2);
8036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_store_srsgpr(rt, rd);
8037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
8039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_INVAL("cp0");
8040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception(ctx, EXCP_RI);
8041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADDI: /* Arithmetic with immediate opcode */
8045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ADDIU:
8046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_arith_imm(env, ctx, op, rt, rs, imm);
8047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         break;
8048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLTI: /* Set on less than with immediate opcode */
8049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SLTIU:
8050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_slt_imm(env, op, rt, rs, imm);
8051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         break;
8052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ANDI: /* Arithmetic with immediate opcode */
8053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LUI:
8054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_ORI:
8055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_XORI:
8056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_logic_imm(env, op, rt, rs, imm);
8057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         break;
8058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_J ... OPC_JAL: /* Jump */
8059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
8060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_compute_branch(ctx, op, rs, rt, offset);
8061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         return;
8062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BEQ ... OPC_BGTZ: /* Branch */
8063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_BEQL ... OPC_BGTZL:
8064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_compute_branch(ctx, op, rs, rt, imm << 2);
8065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         return;
8066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LB ... OPC_LWR: /* Load and stores */
8067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SB ... OPC_SW:
8068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWR:
8069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LL:
8070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_ldst(ctx, op, rt, rs, imm);
8071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         break;
8072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SC:
8073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         gen_st_cond(ctx, op, rt, rs, imm);
8074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli         break;
8075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CACHE:
8076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
8077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Treat as NOP. */
8078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_PREF:
8080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
8081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Treat as NOP. */
8082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Floating point (COP1). */
8085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWC1:
8086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDC1:
8087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWC1:
8088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDC1:
8089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
8090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_cp1_enabled(ctx);
8091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_flt_ldst(ctx, op, rt, rs, imm);
8092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
8093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception_err(ctx, EXCP_CpU, 1);
8094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CP1:
8098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
8099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_cp1_enabled(ctx);
8100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            op1 = MASK_CP1(ctx->opcode);
8101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (op1) {
8102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MFHC1:
8103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MTHC1:
8104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_insn(env, ctx, ISA_MIPS32R2);
8105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MFC1:
8106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_CFC1:
8107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MTC1:
8108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_CTC1:
8109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cp1(ctx, op1, rt, rd);
8110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
8112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_DMFC1:
8113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_DMTC1:
8114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_insn(env, ctx, ISA_MIPS3);
8115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_cp1(ctx, op1, rt, rd);
8116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_BC1ANY2:
8119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_BC1ANY4:
8120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_cop1x(ctx);
8121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                check_insn(env, ctx, ASE_MIPS3D);
8122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                /* fall through */
8123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_BC1:
8124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode),
8125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                    (rt >> 2) & 0x7, imm << 2);
8126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                return;
8127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_S_FMT:
8128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_D_FMT:
8129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_W_FMT:
8130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_L_FMT:
8131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_PS_FMT:
8132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_farith(ctx, MASK_CP1_FUNC(ctx->opcode), rt, rd, sa,
8133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                           (imm >> 8) & 0x7);
8134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
8136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                MIPS_INVAL("cp1");
8137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                generate_exception (ctx, EXCP_RI);
8138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
8141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception_err(ctx, EXCP_CpU, 1);
8142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* COP2.  */
8146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWC2:
8147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDC2:
8148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SWC2:
8149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDC2:
8150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CP2:
8151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* COP2: Not implemented. */
8152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception_err(ctx, EXCP_CpU, 2);
8153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_CP3:
8156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
8157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            check_cp1_enabled(ctx);
8158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            op1 = MASK_CP3(ctx->opcode);
8159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            switch (op1) {
8160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_LWXC1:
8161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_LDXC1:
8162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_LUXC1:
8163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_SWXC1:
8164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_SDXC1:
8165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_SUXC1:
8166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
8167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_PREFX:
8169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                /* Treat as NOP. */
8170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_ALNV_PS:
8172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MADD_S:
8173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MADD_D:
8174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MADD_PS:
8175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MSUB_S:
8176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MSUB_D:
8177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_MSUB_PS:
8178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMADD_S:
8179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMADD_D:
8180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMADD_PS:
8181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMSUB_S:
8182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMSUB_D:
8183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            case OPC_NMSUB_PS:
8184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
8185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            default:
8187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                MIPS_INVAL("cp3");
8188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                generate_exception (ctx, EXCP_RI);
8189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                break;
8190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
8192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            generate_exception_err(ctx, EXCP_CpU, 1);
8193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
8197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* MIPS64 opcodes */
8198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LWU:
8199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LDL ... OPC_LDR:
8200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SDL ... OPC_SDR:
8201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LLD:
8202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_LD:
8203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SD:
8204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3);
8205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_mips_64(ctx);
8206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_ldst(ctx, op, rt, rs, imm);
8207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_SCD:
8209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3);
8210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_mips_64(ctx);
8211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_st_cond(ctx, op, rt, rs, imm);
8212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADDI:
8214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_DADDIU:
8215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ISA_MIPS3);
8216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_mips_64(ctx);
8217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_arith_imm(env, ctx, op, rt, rs, imm);
8218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_JALX:
8221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ASE_MIPS16);
8222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* MIPS16: Not implemented. */
8223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case OPC_MDMX:
8224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        check_insn(env, ctx, ASE_MDMX);
8225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* MDMX: Not implemented. */
8226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:            /* Invalid */
8227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        MIPS_INVAL("major opcode");
8228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        generate_exception(ctx, EXCP_RI);
8229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
8230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ctx->hflags & MIPS_HFLAG_BMASK) {
8232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        int hflags = ctx->hflags & MIPS_HFLAG_BMASK;
8233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Branches completion */
8234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->hflags &= ~MIPS_HFLAG_BMASK;
8235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx->bstate = BS_BRANCH;
8236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(ctx, 0);
8237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* FIXME: Need to clear can_do_io.  */
8238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (hflags) {
8239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_B:
8240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* unconditional branch */
8241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("unconditional branch");
8242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_goto_tb(ctx, 0, ctx->btarget);
8243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BL:
8245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* blikely taken case */
8246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("blikely branch taken");
8247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_goto_tb(ctx, 0, ctx->btarget);
8248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BC:
8250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* Conditional branch */
8251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("conditional branch");
8252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            {
8253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                int l1 = gen_new_label();
8254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
8256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_goto_tb(ctx, 1, ctx->pc + 4);
8257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_set_label(l1);
8258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_goto_tb(ctx, 0, ctx->btarget);
8259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_BR:
8262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* unconditional branch to register */
8263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("branch to register");
8264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_mov_tl(cpu_PC, btarget);
8265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (ctx->singlestep_enabled) {
8266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                save_cpu_state(ctx, 0);
8267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                gen_helper_0i(raise_exception, EXCP_DEBUG);
8268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_exit_tb(0);
8270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
8272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            MIPS_DEBUG("unknown branch");
8273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void
8279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalligen_intermediate_code_internal (CPUState *env, TranslationBlock *tb,
8280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                int search_pc)
8281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    DisasContext ctx;
8283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong pc_start;
8284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint16_t *gen_opc_end;
8285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    CPUBreakpoint *bp;
8286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int j, lj = -1;
8287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int num_insns;
8288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int max_insns;
8289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (search_pc)
8291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("search pc %d\n", search_pc);
8292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    pc_start = tb->pc;
8294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
8295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.pc = pc_start;
8296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.saved_pc = -1;
8297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.singlestep_enabled = env->singlestep_enabled;
8298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.tb = tb;
8299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.bstate = BS_NONE;
8300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Restore delay slot state from the tb context.  */
8301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
8302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    restore_cpu_state(env, &ctx);
8303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef CONFIG_USER_ONLY
8304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx.mem_idx = MIPS_HFLAG_UM;
8305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
8306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
8307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    num_insns = 0;
8309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    max_insns = tb->cflags & CF_COUNT_MASK;
8310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (max_insns == 0)
8311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        max_insns = CF_COUNT_MASK;
8312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef DEBUG_DISAS
8313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    qemu_log_mask(CPU_LOG_TB_CPU, "------------------------------------------------\n");
8314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* FIXME: This may print out stale hflags from env... */
8315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    log_cpu_state_mask(CPU_LOG_TB_CPU, env, 0);
8316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
8318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_icount_start();
8319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    while (ctx.bstate == BS_NONE) {
8320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
8321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
8322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                if (bp->pc == ctx.pc) {
8323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    save_cpu_state(&ctx, 1);
8324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    ctx.bstate = BS_BRANCH;
8325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_helper_0i(raise_exception, EXCP_DEBUG);
8326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    /* Include the breakpoint location or the tb won't
8327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     * be flushed when it must be.  */
8328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    ctx.pc += 4;
8329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    goto done_generating;
8330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                }
8331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (search_pc) {
8335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            j = gen_opc_ptr - gen_opc_buf;
8336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (lj < j) {
8337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                lj++;
8338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                while (lj < j)
8339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                    gen_opc_instr_start[lj++] = 0;
8340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
8341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_opc_pc[lj] = ctx.pc;
8342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
8343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_opc_instr_start[lj] = 1;
8344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_opc_icount[lj] = num_insns;
8345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
8347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_io_start();
8348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx.opcode = ldl_code(ctx.pc);
8349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        decode_opc(env, &ctx);
8350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        ctx.pc += 4;
8351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        num_insns++;
8352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Execute a branch and its delay slot as a single instruction.
8354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           This is what GDB expects and is consistent with what the
8355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           hardware does (e.g. if a delay slot instruction faults, the
8356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           reported PC is the PC of the branch).  */
8357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0)
8358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
8361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (gen_opc_ptr >= gen_opc_end)
8364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (num_insns >= max_insns)
8367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (singlestep)
8370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tb->cflags & CF_LAST_IO)
8373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_io_end();
8374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->singlestep_enabled && ctx.bstate != BS_BRANCH) {
8375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        save_cpu_state(&ctx, ctx.bstate == BS_NONE);
8376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        gen_helper_0i(raise_exception, EXCP_DEBUG);
8377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
8378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (ctx.bstate) {
8379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case BS_STOP:
8380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_interrupt_restart();
8381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_goto_tb(&ctx, 0, ctx.pc);
8382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case BS_NONE:
8384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            save_cpu_state(&ctx, 0);
8385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_goto_tb(&ctx, 0, ctx.pc);
8386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case BS_EXCP:
8388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_helper_interrupt_restart();
8389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tcg_gen_exit_tb(0);
8390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case BS_BRANCH:
8392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default:
8393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
8394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallidone_generating:
8397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_icount_end(tb, num_insns);
8398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    *gen_opc_ptr = INDEX_op_end;
8399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (search_pc) {
8400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        j = gen_opc_ptr - gen_opc_buf;
8401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        lj++;
8402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        while (lj <= j)
8403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            gen_opc_instr_start[lj++] = 0;
8404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
8405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tb->size = ctx.pc - pc_start;
8406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tb->icount = num_insns;
8407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef DEBUG_DISAS
8409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    LOG_DISAS("\n");
8410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
8411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("IN: %s\n", lookup_symbol(pc_start));
8412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        log_target_disas(pc_start, ctx.pc - pc_start, 0);
8413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("\n");
8414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    qemu_log_mask(CPU_LOG_TB_CPU, "---------------- %d %08x\n", ctx.bstate, ctx.hflags);
8416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
8420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_intermediate_code_internal(env, tb, 0);
8422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
8425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    gen_intermediate_code_internal(env, tb, 1);
8427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void fpu_dump_state(CPUState *env, FILE *f,
8430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                           int (*fpu_fprintf)(FILE *f, const char *fmt, ...),
8431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                           int flags)
8432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int i;
8434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
8435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define printfpr(fp)                                                        \
8437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do {                                                                    \
8438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (is_fpu64)                                                       \
8439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fpu_fprintf(f, "w:%08x d:%016lx fd:%13g fs:%13g psu: %13g\n",   \
8440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        (fp)->w[FP_ENDIAN_IDX], (fp)->d, (fp)->fd,          \
8441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        (fp)->fs[FP_ENDIAN_IDX], (fp)->fs[!FP_ENDIAN_IDX]); \
8442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else {                                                              \
8443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fpr_t tmp;                                                      \
8444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];                  \
8445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];           \
8446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            fpu_fprintf(f, "w:%08x d:%016lx fd:%13g fs:%13g psu:%13g\n",    \
8447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        tmp.w[FP_ENDIAN_IDX], tmp.d, tmp.fd,                \
8448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        tmp.fs[FP_ENDIAN_IDX], tmp.fs[!FP_ENDIAN_IDX]);     \
8449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }                                                                   \
8450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while(0)
8451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%08x(0x%02x)\n",
8454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64, env->active_fpu.fp_status,
8455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                get_float_exception_flags(&env->active_fpu.fp_status));
8456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
8457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        fpu_fprintf(f, "%3s: ", fregnames[i]);
8458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        printfpr(&env->active_fpu.fpr[i]);
8459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef printfpr
8462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
8465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Debug help: The architecture requires 32bit code to maintain proper
8466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   sign-extended values on 64bit machines.  */
8467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
8469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void
8471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallicpu_mips_check_sign_extensions (CPUState *env, FILE *f,
8472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
8473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                int flags)
8474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int i;
8476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->active_tc.PC))
8478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC);
8479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->active_tc.HI[0]))
8480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]);
8481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->active_tc.LO[0]))
8482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]);
8483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->btarget))
8484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
8485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 0; i < 32; i++) {
8487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (!SIGN_EXT_P(env->active_tc.gpr[i]))
8488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]);
8489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->CP0_EPC))
8492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
8493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!SIGN_EXT_P(env->lladdr))
8494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr);
8495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid cpu_dump_state (CPUState *env, FILE *f,
8499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
8500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     int flags)
8501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int i;
8503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx " LO=0x" TARGET_FMT_lx " ds %04x " TARGET_FMT_lx " %d\n",
8505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
8506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->hflags, env->btarget, env->bcond);
8507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 0; i < 32; i++) {
8508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if ((i & 3) == 0)
8509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cpu_fprintf(f, "GPR%02d:", i);
8510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
8511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if ((i & 3) == 3)
8512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cpu_fprintf(f, "\n");
8513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
8516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
8517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n",
8518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->CP0_Config0, env->CP0_Config1, env->lladdr);
8519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->hflags & MIPS_HFLAG_FPU)
8520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        fpu_dump_state(env, f, cpu_fprintf, flags);
8521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
8522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
8523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void mips_tcg_init(void)
8527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int i;
8529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    static int inited;
8530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Initialize various static tables. */
8532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (inited)
8533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
8534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
8536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TCGV_UNUSED(cpu_gpr[0]);
8537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 1; i < 32; i++)
8538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0,
8539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                        offsetof(CPUState, active_tc.gpr[i]),
8540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                        regnames[i]);
8541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_PC = tcg_global_mem_new(TCG_AREG0,
8542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                offsetof(CPUState, active_tc.PC), "PC");
8543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 0; i < MIPS_DSP_ACC; i++) {
8544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_HI[i] = tcg_global_mem_new(TCG_AREG0,
8545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       offsetof(CPUState, active_tc.HI[i]),
8546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       regnames_HI[i]);
8547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_LO[i] = tcg_global_mem_new(TCG_AREG0,
8548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       offsetof(CPUState, active_tc.LO[i]),
8549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       regnames_LO[i]);
8550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_ACX[i] = tcg_global_mem_new(TCG_AREG0,
8551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                        offsetof(CPUState, active_tc.ACX[i]),
8552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                        regnames_ACX[i]);
8553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_dspctrl = tcg_global_mem_new(TCG_AREG0,
8555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                     offsetof(CPUState, active_tc.DSPControl),
8556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                     "DSPControl");
8557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    bcond = tcg_global_mem_new(TCG_AREG0,
8558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                               offsetof(CPUState, bcond), "bcond");
8559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    btarget = tcg_global_mem_new(TCG_AREG0,
8560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                 offsetof(CPUState, btarget), "btarget");
8561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    hflags = tcg_global_mem_new_i32(TCG_AREG0,
8562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                    offsetof(CPUState, hflags), "hflags");
8563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0,
8565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                      offsetof(CPUState, active_fpu.fcr0),
8566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                      "fcr0");
8567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fpu_fcr31 = tcg_global_mem_new_i32(TCG_AREG0,
8568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       offsetof(CPUState, active_fpu.fcr31),
8569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                       "fcr31");
8570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* register helpers */
8572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GEN_HELPER 2
8573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "helper.h"
8574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    inited = 1;
8576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "translate_init.c"
8579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8580409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliCPUMIPSState *cpu_mips_init (const char *cpu_model)
8581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    CPUMIPSState *env;
8583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    const mips_def_t *def;
8584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    def = cpu_mips_find_by_name(cpu_model);
8586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!def)
8587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return NULL;
8588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env = qemu_mallocz(sizeof(CPUMIPSState));
8589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->cpu_model = def;
8590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->cpu_model_str = cpu_model;
8591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_exec_init(env);
8593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
8594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    mmu_init(env, def);
8595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    mvp_init(env, def);
8597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    mips_tcg_init();
8598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_reset(env);
8599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    qemu_init_vcpu(env);
8600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env;
8601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid cpu_reset (CPUMIPSState *env)
8604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (qemu_loglevel_mask(CPU_LOG_RESET)) {
8606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
8607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        log_cpu_state(env, 0);
8608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    memset(env, 0, offsetof(CPUMIPSState, breakpoints));
8611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb_flush(env, 1);
8612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Reset registers to their default values */
8614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_PRid = env->cpu_model->CP0_PRid;
8615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config0 = env->cpu_model->CP0_Config0;
8616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN
8617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config0 |= (1 << CP0C0_BE);
8618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config1 = env->cpu_model->CP0_Config1;
8620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config2 = env->cpu_model->CP0_Config2;
8621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config3 = env->cpu_model->CP0_Config3;
8622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config6 = env->cpu_model->CP0_Config6;
8623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config7 = env->cpu_model->CP0_Config7;
8624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
8625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                 << env->cpu_model->CP0_LLAddr_shift;
8626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
8627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->SYNCI_Step = env->cpu_model->SYNCI_Step;
8628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CCRes = env->cpu_model->CCRes;
8629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
8630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
8631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
8632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->current_tc = 0;
8633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->SEGBITS = env->cpu_model->SEGBITS;
8634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
8635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
8636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->cpu_model->insn_flags & ISA_MIPS3) {
8637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->SEGMask |= 3ULL << 62;
8638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->PABITS = env->cpu_model->PABITS;
8641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->PAMask = (target_ulong)((1ULL << env->cpu_model->PABITS) - 1);
8642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
8643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
8644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
8645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
8646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
8647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
8648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
8649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
8650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
8651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
8652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->insn_flags = env->cpu_model->insn_flags;
8653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fpu_init(env, env->cpu_model);
8655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY)
8657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->hflags = MIPS_HFLAG_UM;
8658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Enable access to the SYNCI_Step register.  */
8659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_HWREna |= (1 << 1);
8660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
8661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->hflags |= MIPS_HFLAG_FPU;
8662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
8664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->active_fpu.fcr0 & (1 << FCR0_F64)) {
8665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->hflags |= MIPS_HFLAG_F64;
8666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
8669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->hflags & MIPS_HFLAG_BMASK) {
8670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* If the exception was raised from a delay slot,
8671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           come back to the jump.  */
8672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_ErrorEPC = env->active_tc.PC - 4;
8673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
8674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_ErrorEPC = env->active_tc.PC;
8675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.PC = (int32_t)0xBFC00000;
8677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Random = env->tlb->nb_tlb - 1;
8678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->tlb->tlb_in_use = env->tlb->nb_tlb;
8679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Wired = 0;
8680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* SMP not implemented */
8681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EBase = 0x80000000;
8682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
8683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* vectored interrupts not implemented, timer on int 7,
8684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       no performance counters. */
8685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_IntCtl = 0xe0000000;
8686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    {
8687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        int i;
8688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        for (i = 0; i < 7; i++) {
8690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            env->CP0_WatchLo[i] = 0;
8691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            env->CP0_WatchHi[i] = 0x80000000;
8692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
8693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_WatchLo[7] = 0;
8694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_WatchHi[7] = 0;
8695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Count register increments in debug mode, EJTAG version 1 */
8697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
8698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->hflags = MIPS_HFLAG_CP0;
8699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
8701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->cpu_model->insn_flags & ISA_MIPS3) {
8702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->hflags |= MIPS_HFLAG_64;
8703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
8704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
8705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->exception_index = EXCP_NONE;
8706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
8708325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapallivoid restore_state_to_opc(CPUState *env, TranslationBlock *tb, int pc_pos)
8709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
8710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.PC = gen_opc_pc[pc_pos];
8711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->hflags &= ~MIPS_HFLAG_BMASK;
8712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->hflags |= gen_opc_hflags[pc_pos];
8713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
8714