Statistics
| Branch: | Revision:

root / target-openrisc / translate.c @ da1d7759

History | View | Annotate | Download (55.5 kB)

1 e67db06e Jia Liu
/*
2 e67db06e Jia Liu
 * OpenRISC translation
3 e67db06e Jia Liu
 *
4 e67db06e Jia Liu
 * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
5 e67db06e Jia Liu
 *                         Feng Gao <gf91597@gmail.com>
6 e67db06e Jia Liu
 *
7 e67db06e Jia Liu
 * This library is free software; you can redistribute it and/or
8 e67db06e Jia Liu
 * modify it under the terms of the GNU Lesser General Public
9 e67db06e Jia Liu
 * License as published by the Free Software Foundation; either
10 e67db06e Jia Liu
 * version 2 of the License, or (at your option) any later version.
11 e67db06e Jia Liu
 *
12 e67db06e Jia Liu
 * This library is distributed in the hope that it will be useful,
13 e67db06e Jia Liu
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 e67db06e Jia Liu
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 e67db06e Jia Liu
 * Lesser General Public License for more details.
16 e67db06e Jia Liu
 *
17 e67db06e Jia Liu
 * You should have received a copy of the GNU Lesser General Public
18 e67db06e Jia Liu
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 e67db06e Jia Liu
 */
20 e67db06e Jia Liu
21 e67db06e Jia Liu
#include "cpu.h"
22 022c62cb Paolo Bonzini
#include "exec/exec-all.h"
23 76cad711 Paolo Bonzini
#include "disas/disas.h"
24 e67db06e Jia Liu
#include "tcg-op.h"
25 e67db06e Jia Liu
#include "qemu-common.h"
26 1de7afc9 Paolo Bonzini
#include "qemu/log.h"
27 e67db06e Jia Liu
#include "config.h"
28 1de7afc9 Paolo Bonzini
#include "qemu/bitops.h"
29 bbe418f2 Jia Liu
30 bbe418f2 Jia Liu
#include "helper.h"
31 bbe418f2 Jia Liu
#define GEN_HELPER 1
32 bbe418f2 Jia Liu
#include "helper.h"
33 e67db06e Jia Liu
34 e67db06e Jia Liu
#define OPENRISC_DISAS
35 e67db06e Jia Liu
36 e67db06e Jia Liu
#ifdef OPENRISC_DISAS
37 e67db06e Jia Liu
#  define LOG_DIS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__)
38 e67db06e Jia Liu
#else
39 e67db06e Jia Liu
#  define LOG_DIS(...) do { } while (0)
40 e67db06e Jia Liu
#endif
41 e67db06e Jia Liu
42 bbe418f2 Jia Liu
typedef struct DisasContext {
43 bbe418f2 Jia Liu
    TranslationBlock *tb;
44 bbe418f2 Jia Liu
    target_ulong pc, ppc, npc;
45 bbe418f2 Jia Liu
    uint32_t tb_flags, synced_flags, flags;
46 bbe418f2 Jia Liu
    uint32_t is_jmp;
47 bbe418f2 Jia Liu
    uint32_t mem_idx;
48 bbe418f2 Jia Liu
    int singlestep_enabled;
49 bbe418f2 Jia Liu
    uint32_t delayed_branch;
50 bbe418f2 Jia Liu
} DisasContext;
51 bbe418f2 Jia Liu
52 bbe418f2 Jia Liu
static TCGv_ptr cpu_env;
53 bbe418f2 Jia Liu
static TCGv cpu_sr;
54 bbe418f2 Jia Liu
static TCGv cpu_R[32];
55 bbe418f2 Jia Liu
static TCGv cpu_pc;
56 bbe418f2 Jia Liu
static TCGv jmp_pc;            /* l.jr/l.jalr temp pc */
57 bbe418f2 Jia Liu
static TCGv cpu_npc;
58 bbe418f2 Jia Liu
static TCGv cpu_ppc;
59 bbe418f2 Jia Liu
static TCGv_i32 env_btaken;    /* bf/bnf , F flag taken */
60 bbe418f2 Jia Liu
static TCGv_i32 fpcsr;
61 bbe418f2 Jia Liu
static TCGv machi, maclo;
62 bbe418f2 Jia Liu
static TCGv fpmaddhi, fpmaddlo;
63 bbe418f2 Jia Liu
static TCGv_i32 env_flags;
64 022c62cb Paolo Bonzini
#include "exec/gen-icount.h"
65 bbe418f2 Jia Liu
66 e67db06e Jia Liu
void openrisc_translate_init(void)
67 e67db06e Jia Liu
{
68 bbe418f2 Jia Liu
    static const char * const regnames[] = {
69 bbe418f2 Jia Liu
        "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
70 bbe418f2 Jia Liu
        "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
71 bbe418f2 Jia Liu
        "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
72 bbe418f2 Jia Liu
        "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
73 bbe418f2 Jia Liu
    };
74 bbe418f2 Jia Liu
    int i;
75 bbe418f2 Jia Liu
76 bbe418f2 Jia Liu
    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
77 bbe418f2 Jia Liu
    cpu_sr = tcg_global_mem_new(TCG_AREG0,
78 bbe418f2 Jia Liu
                                offsetof(CPUOpenRISCState, sr), "sr");
79 bbe418f2 Jia Liu
    env_flags = tcg_global_mem_new_i32(TCG_AREG0,
80 bbe418f2 Jia Liu
                                       offsetof(CPUOpenRISCState, flags),
81 bbe418f2 Jia Liu
                                       "flags");
82 bbe418f2 Jia Liu
    cpu_pc = tcg_global_mem_new(TCG_AREG0,
83 bbe418f2 Jia Liu
                                offsetof(CPUOpenRISCState, pc), "pc");
84 bbe418f2 Jia Liu
    cpu_npc = tcg_global_mem_new(TCG_AREG0,
85 bbe418f2 Jia Liu
                                 offsetof(CPUOpenRISCState, npc), "npc");
86 bbe418f2 Jia Liu
    cpu_ppc = tcg_global_mem_new(TCG_AREG0,
87 bbe418f2 Jia Liu
                                 offsetof(CPUOpenRISCState, ppc), "ppc");
88 bbe418f2 Jia Liu
    jmp_pc = tcg_global_mem_new(TCG_AREG0,
89 bbe418f2 Jia Liu
                                offsetof(CPUOpenRISCState, jmp_pc), "jmp_pc");
90 bbe418f2 Jia Liu
    env_btaken = tcg_global_mem_new_i32(TCG_AREG0,
91 bbe418f2 Jia Liu
                                        offsetof(CPUOpenRISCState, btaken),
92 bbe418f2 Jia Liu
                                        "btaken");
93 bbe418f2 Jia Liu
    fpcsr = tcg_global_mem_new_i32(TCG_AREG0,
94 bbe418f2 Jia Liu
                                   offsetof(CPUOpenRISCState, fpcsr),
95 bbe418f2 Jia Liu
                                   "fpcsr");
96 bbe418f2 Jia Liu
    machi = tcg_global_mem_new(TCG_AREG0,
97 bbe418f2 Jia Liu
                               offsetof(CPUOpenRISCState, machi),
98 bbe418f2 Jia Liu
                               "machi");
99 bbe418f2 Jia Liu
    maclo = tcg_global_mem_new(TCG_AREG0,
100 bbe418f2 Jia Liu
                               offsetof(CPUOpenRISCState, maclo),
101 bbe418f2 Jia Liu
                               "maclo");
102 bbe418f2 Jia Liu
    fpmaddhi = tcg_global_mem_new(TCG_AREG0,
103 bbe418f2 Jia Liu
                                  offsetof(CPUOpenRISCState, fpmaddhi),
104 bbe418f2 Jia Liu
                                  "fpmaddhi");
105 bbe418f2 Jia Liu
    fpmaddlo = tcg_global_mem_new(TCG_AREG0,
106 bbe418f2 Jia Liu
                                  offsetof(CPUOpenRISCState, fpmaddlo),
107 bbe418f2 Jia Liu
                                  "fpmaddlo");
108 bbe418f2 Jia Liu
    for (i = 0; i < 32; i++) {
109 bbe418f2 Jia Liu
        cpu_R[i] = tcg_global_mem_new(TCG_AREG0,
110 bbe418f2 Jia Liu
                                      offsetof(CPUOpenRISCState, gpr[i]),
111 bbe418f2 Jia Liu
                                      regnames[i]);
112 bbe418f2 Jia Liu
    }
113 bbe418f2 Jia Liu
}
114 bbe418f2 Jia Liu
115 bbe418f2 Jia Liu
/* Writeback SR_F transaltion-space to execution-space.  */
116 bbe418f2 Jia Liu
static inline void wb_SR_F(void)
117 bbe418f2 Jia Liu
{
118 bbe418f2 Jia Liu
    int label;
119 bbe418f2 Jia Liu
120 bbe418f2 Jia Liu
    label = gen_new_label();
121 bbe418f2 Jia Liu
    tcg_gen_andi_tl(cpu_sr, cpu_sr, ~SR_F);
122 bbe418f2 Jia Liu
    tcg_gen_brcondi_tl(TCG_COND_EQ, env_btaken, 0, label);
123 bbe418f2 Jia Liu
    tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_F);
124 bbe418f2 Jia Liu
    gen_set_label(label);
125 bbe418f2 Jia Liu
}
126 bbe418f2 Jia Liu
127 bbe418f2 Jia Liu
static inline int zero_extend(unsigned int val, int width)
128 bbe418f2 Jia Liu
{
129 bbe418f2 Jia Liu
    return val & ((1 << width) - 1);
130 bbe418f2 Jia Liu
}
131 bbe418f2 Jia Liu
132 bbe418f2 Jia Liu
static inline int sign_extend(unsigned int val, int width)
133 bbe418f2 Jia Liu
{
134 bbe418f2 Jia Liu
    int sval;
135 bbe418f2 Jia Liu
136 bbe418f2 Jia Liu
    /* LSL */
137 bbe418f2 Jia Liu
    val <<= TARGET_LONG_BITS - width;
138 bbe418f2 Jia Liu
    sval = val;
139 bbe418f2 Jia Liu
    /* ASR.  */
140 bbe418f2 Jia Liu
    sval >>= TARGET_LONG_BITS - width;
141 bbe418f2 Jia Liu
    return sval;
142 bbe418f2 Jia Liu
}
143 bbe418f2 Jia Liu
144 bbe418f2 Jia Liu
static inline void gen_sync_flags(DisasContext *dc)
145 bbe418f2 Jia Liu
{
146 bbe418f2 Jia Liu
    /* Sync the tb dependent flag between translate and runtime.  */
147 bbe418f2 Jia Liu
    if (dc->tb_flags != dc->synced_flags) {
148 bbe418f2 Jia Liu
        tcg_gen_movi_tl(env_flags, dc->tb_flags);
149 bbe418f2 Jia Liu
        dc->synced_flags = dc->tb_flags;
150 bbe418f2 Jia Liu
    }
151 bbe418f2 Jia Liu
}
152 bbe418f2 Jia Liu
153 bbe418f2 Jia Liu
static void gen_exception(DisasContext *dc, unsigned int excp)
154 bbe418f2 Jia Liu
{
155 bbe418f2 Jia Liu
    TCGv_i32 tmp = tcg_const_i32(excp);
156 bbe418f2 Jia Liu
    gen_helper_exception(cpu_env, tmp);
157 bbe418f2 Jia Liu
    tcg_temp_free_i32(tmp);
158 bbe418f2 Jia Liu
}
159 bbe418f2 Jia Liu
160 bbe418f2 Jia Liu
static void gen_illegal_exception(DisasContext *dc)
161 bbe418f2 Jia Liu
{
162 bbe418f2 Jia Liu
    tcg_gen_movi_tl(cpu_pc, dc->pc);
163 bbe418f2 Jia Liu
    gen_exception(dc, EXCP_ILLEGAL);
164 bbe418f2 Jia Liu
    dc->is_jmp = DISAS_UPDATE;
165 bbe418f2 Jia Liu
}
166 bbe418f2 Jia Liu
167 bbe418f2 Jia Liu
/* not used yet, open it when we need or64.  */
168 bbe418f2 Jia Liu
/*#ifdef TARGET_OPENRISC64
169 bbe418f2 Jia Liu
static void check_ob64s(DisasContext *dc)
170 bbe418f2 Jia Liu
{
171 bbe418f2 Jia Liu
    if (!(dc->flags & CPUCFGR_OB64S)) {
172 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
173 bbe418f2 Jia Liu
    }
174 bbe418f2 Jia Liu
}
175 bbe418f2 Jia Liu

176 bbe418f2 Jia Liu
static void check_of64s(DisasContext *dc)
177 bbe418f2 Jia Liu
{
178 bbe418f2 Jia Liu
    if (!(dc->flags & CPUCFGR_OF64S)) {
179 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
180 bbe418f2 Jia Liu
    }
181 bbe418f2 Jia Liu
}
182 bbe418f2 Jia Liu

183 bbe418f2 Jia Liu
static void check_ov64s(DisasContext *dc)
184 bbe418f2 Jia Liu
{
185 bbe418f2 Jia Liu
    if (!(dc->flags & CPUCFGR_OV64S)) {
186 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
187 bbe418f2 Jia Liu
    }
188 bbe418f2 Jia Liu
}
189 bbe418f2 Jia Liu
#endif*/
190 bbe418f2 Jia Liu
191 bbe418f2 Jia Liu
static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest)
192 bbe418f2 Jia Liu
{
193 bbe418f2 Jia Liu
    TranslationBlock *tb;
194 bbe418f2 Jia Liu
    tb = dc->tb;
195 bbe418f2 Jia Liu
    if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
196 bbe418f2 Jia Liu
                                       likely(!dc->singlestep_enabled)) {
197 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_pc, dest);
198 bbe418f2 Jia Liu
        tcg_gen_goto_tb(n);
199 8cfd0495 Richard Henderson
        tcg_gen_exit_tb((uintptr_t)tb + n);
200 bbe418f2 Jia Liu
    } else {
201 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_pc, dest);
202 bbe418f2 Jia Liu
        if (dc->singlestep_enabled) {
203 bbe418f2 Jia Liu
            gen_exception(dc, EXCP_DEBUG);
204 bbe418f2 Jia Liu
        }
205 bbe418f2 Jia Liu
        tcg_gen_exit_tb(0);
206 bbe418f2 Jia Liu
    }
207 bbe418f2 Jia Liu
}
208 bbe418f2 Jia Liu
209 bbe418f2 Jia Liu
static void gen_jump(DisasContext *dc, uint32_t imm, uint32_t reg, uint32_t op0)
210 bbe418f2 Jia Liu
{
211 bbe418f2 Jia Liu
    target_ulong tmp_pc;
212 bbe418f2 Jia Liu
    /* N26, 26bits imm */
213 bbe418f2 Jia Liu
    tmp_pc = sign_extend((imm<<2), 26) + dc->pc;
214 bbe418f2 Jia Liu
215 da1d7759 Sebastian Macke
    switch (op0) {
216 da1d7759 Sebastian Macke
    case 0x00:     /* l.j */
217 bbe418f2 Jia Liu
        tcg_gen_movi_tl(jmp_pc, tmp_pc);
218 da1d7759 Sebastian Macke
        break;
219 da1d7759 Sebastian Macke
    case 0x01:     /* l.jal */
220 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
221 bbe418f2 Jia Liu
        tcg_gen_movi_tl(jmp_pc, tmp_pc);
222 da1d7759 Sebastian Macke
        break;
223 da1d7759 Sebastian Macke
    case 0x03:     /* l.bnf */
224 da1d7759 Sebastian Macke
    case 0x04:     /* l.bf  */
225 da1d7759 Sebastian Macke
        {
226 da1d7759 Sebastian Macke
            int lab = gen_new_label();
227 da1d7759 Sebastian Macke
            TCGv sr_f = tcg_temp_new();
228 da1d7759 Sebastian Macke
            tcg_gen_movi_tl(jmp_pc, dc->pc+8);
229 da1d7759 Sebastian Macke
            tcg_gen_andi_tl(sr_f, cpu_sr, SR_F);
230 da1d7759 Sebastian Macke
            tcg_gen_brcondi_i32(op0 == 0x03 ? TCG_COND_EQ : TCG_COND_NE,
231 da1d7759 Sebastian Macke
                                sr_f, SR_F, lab);
232 da1d7759 Sebastian Macke
            tcg_gen_movi_tl(jmp_pc, tmp_pc);
233 da1d7759 Sebastian Macke
            gen_set_label(lab);
234 da1d7759 Sebastian Macke
            tcg_temp_free(sr_f);
235 da1d7759 Sebastian Macke
        }
236 da1d7759 Sebastian Macke
        break;
237 da1d7759 Sebastian Macke
    case 0x11:     /* l.jr */
238 bbe418f2 Jia Liu
        tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
239 da1d7759 Sebastian Macke
        break;
240 da1d7759 Sebastian Macke
    case 0x12:     /* l.jalr */
241 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
242 bbe418f2 Jia Liu
        tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
243 da1d7759 Sebastian Macke
        break;
244 da1d7759 Sebastian Macke
    default:
245 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
246 da1d7759 Sebastian Macke
        break;
247 bbe418f2 Jia Liu
    }
248 bbe418f2 Jia Liu
249 bbe418f2 Jia Liu
    dc->delayed_branch = 2;
250 bbe418f2 Jia Liu
    dc->tb_flags |= D_FLAG;
251 bbe418f2 Jia Liu
    gen_sync_flags(dc);
252 bbe418f2 Jia Liu
}
253 bbe418f2 Jia Liu
254 da1d7759 Sebastian Macke
255 bbe418f2 Jia Liu
static void dec_calc(DisasContext *dc, uint32_t insn)
256 bbe418f2 Jia Liu
{
257 bbe418f2 Jia Liu
    uint32_t op0, op1, op2;
258 bbe418f2 Jia Liu
    uint32_t ra, rb, rd;
259 bbe418f2 Jia Liu
    op0 = extract32(insn, 0, 4);
260 bbe418f2 Jia Liu
    op1 = extract32(insn, 8, 2);
261 bbe418f2 Jia Liu
    op2 = extract32(insn, 6, 2);
262 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
263 bbe418f2 Jia Liu
    rb = extract32(insn, 11, 5);
264 bbe418f2 Jia Liu
    rd = extract32(insn, 21, 5);
265 bbe418f2 Jia Liu
266 bbe418f2 Jia Liu
    switch (op0) {
267 bbe418f2 Jia Liu
    case 0x0000:
268 bbe418f2 Jia Liu
        switch (op1) {
269 bbe418f2 Jia Liu
        case 0x00:    /* l.add */
270 bbe418f2 Jia Liu
            LOG_DIS("l.add r%d, r%d, r%d\n", rd, ra, rb);
271 bbe418f2 Jia Liu
            {
272 bbe418f2 Jia Liu
                int lab = gen_new_label();
273 bbe418f2 Jia Liu
                TCGv_i64 ta = tcg_temp_new_i64();
274 bbe418f2 Jia Liu
                TCGv_i64 tb = tcg_temp_new_i64();
275 bbe418f2 Jia Liu
                TCGv_i64 td = tcg_temp_local_new_i64();
276 bbe418f2 Jia Liu
                TCGv_i32 res = tcg_temp_local_new_i32();
277 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
278 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(ta, cpu_R[ra]);
279 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(tb, cpu_R[rb]);
280 bbe418f2 Jia Liu
                tcg_gen_add_i64(td, ta, tb);
281 bbe418f2 Jia Liu
                tcg_gen_trunc_i64_i32(res, td);
282 bbe418f2 Jia Liu
                tcg_gen_shri_i64(td, td, 31);
283 bbe418f2 Jia Liu
                tcg_gen_andi_i64(td, td, 0x3);
284 bbe418f2 Jia Liu
                /* Jump to lab when no overflow.  */
285 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x0, lab);
286 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x3, lab);
287 bbe418f2 Jia Liu
                tcg_gen_ori_i32(cpu_sr, cpu_sr, (SR_OV | SR_CY));
288 bbe418f2 Jia Liu
                tcg_gen_andi_i32(sr_ove, cpu_sr, SR_OVE);
289 bbe418f2 Jia Liu
                tcg_gen_brcondi_i32(TCG_COND_NE, sr_ove, SR_OVE, lab);
290 bbe418f2 Jia Liu
                gen_exception(dc, EXCP_RANGE);
291 bbe418f2 Jia Liu
                gen_set_label(lab);
292 bbe418f2 Jia Liu
                tcg_gen_mov_i32(cpu_R[rd], res);
293 bbe418f2 Jia Liu
                tcg_temp_free_i64(ta);
294 bbe418f2 Jia Liu
                tcg_temp_free_i64(tb);
295 bbe418f2 Jia Liu
                tcg_temp_free_i64(td);
296 bbe418f2 Jia Liu
                tcg_temp_free_i32(res);
297 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
298 bbe418f2 Jia Liu
            }
299 bbe418f2 Jia Liu
            break;
300 bbe418f2 Jia Liu
        default:
301 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
302 bbe418f2 Jia Liu
            break;
303 bbe418f2 Jia Liu
        }
304 bbe418f2 Jia Liu
        break;
305 bbe418f2 Jia Liu
306 bbe418f2 Jia Liu
    case 0x0001:    /* l.addc */
307 bbe418f2 Jia Liu
        switch (op1) {
308 bbe418f2 Jia Liu
        case 0x00:
309 bbe418f2 Jia Liu
            LOG_DIS("l.addc r%d, r%d, r%d\n", rd, ra, rb);
310 bbe418f2 Jia Liu
            {
311 bbe418f2 Jia Liu
                int lab = gen_new_label();
312 bbe418f2 Jia Liu
                TCGv_i64 ta = tcg_temp_new_i64();
313 bbe418f2 Jia Liu
                TCGv_i64 tb = tcg_temp_new_i64();
314 bbe418f2 Jia Liu
                TCGv_i64 tcy = tcg_temp_local_new_i64();
315 bbe418f2 Jia Liu
                TCGv_i64 td = tcg_temp_local_new_i64();
316 bbe418f2 Jia Liu
                TCGv_i32 res = tcg_temp_local_new_i32();
317 bbe418f2 Jia Liu
                TCGv_i32 sr_cy = tcg_temp_local_new_i32();
318 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
319 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(ta, cpu_R[ra]);
320 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(tb, cpu_R[rb]);
321 bbe418f2 Jia Liu
                tcg_gen_andi_i32(sr_cy, cpu_sr, SR_CY);
322 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(tcy, sr_cy);
323 bbe418f2 Jia Liu
                tcg_gen_shri_i64(tcy, tcy, 10);
324 bbe418f2 Jia Liu
                tcg_gen_add_i64(td, ta, tb);
325 bbe418f2 Jia Liu
                tcg_gen_add_i64(td, td, tcy);
326 bbe418f2 Jia Liu
                tcg_gen_trunc_i64_i32(res, td);
327 bbe418f2 Jia Liu
                tcg_gen_shri_i64(td, td, 32);
328 bbe418f2 Jia Liu
                tcg_gen_andi_i64(td, td, 0x3);
329 bbe418f2 Jia Liu
                /* Jump to lab when no overflow.  */
330 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x0, lab);
331 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x3, lab);
332 bbe418f2 Jia Liu
                tcg_gen_ori_i32(cpu_sr, cpu_sr, (SR_OV | SR_CY));
333 bbe418f2 Jia Liu
                tcg_gen_andi_i32(sr_ove, cpu_sr, SR_OVE);
334 bbe418f2 Jia Liu
                tcg_gen_brcondi_i32(TCG_COND_NE, sr_ove, SR_OVE, lab);
335 bbe418f2 Jia Liu
                gen_exception(dc, EXCP_RANGE);
336 bbe418f2 Jia Liu
                gen_set_label(lab);
337 bbe418f2 Jia Liu
                tcg_gen_mov_i32(cpu_R[rd], res);
338 bbe418f2 Jia Liu
                tcg_temp_free_i64(ta);
339 bbe418f2 Jia Liu
                tcg_temp_free_i64(tb);
340 bbe418f2 Jia Liu
                tcg_temp_free_i64(tcy);
341 bbe418f2 Jia Liu
                tcg_temp_free_i64(td);
342 bbe418f2 Jia Liu
                tcg_temp_free_i32(res);
343 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_cy);
344 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
345 bbe418f2 Jia Liu
            }
346 bbe418f2 Jia Liu
            break;
347 bbe418f2 Jia Liu
        default:
348 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
349 bbe418f2 Jia Liu
            break;
350 bbe418f2 Jia Liu
        }
351 bbe418f2 Jia Liu
        break;
352 bbe418f2 Jia Liu
353 bbe418f2 Jia Liu
    case 0x0002:    /* l.sub */
354 bbe418f2 Jia Liu
        switch (op1) {
355 bbe418f2 Jia Liu
        case 0x00:
356 bbe418f2 Jia Liu
            LOG_DIS("l.sub r%d, r%d, r%d\n", rd, ra, rb);
357 bbe418f2 Jia Liu
            {
358 bbe418f2 Jia Liu
                int lab = gen_new_label();
359 bbe418f2 Jia Liu
                TCGv_i64 ta = tcg_temp_new_i64();
360 bbe418f2 Jia Liu
                TCGv_i64 tb = tcg_temp_new_i64();
361 bbe418f2 Jia Liu
                TCGv_i64 td = tcg_temp_local_new_i64();
362 bbe418f2 Jia Liu
                TCGv_i32 res = tcg_temp_local_new_i32();
363 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
364 bbe418f2 Jia Liu
365 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(ta, cpu_R[ra]);
366 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(tb, cpu_R[rb]);
367 bbe418f2 Jia Liu
                tcg_gen_sub_i64(td, ta, tb);
368 bbe418f2 Jia Liu
                tcg_gen_trunc_i64_i32(res, td);
369 bbe418f2 Jia Liu
                tcg_gen_shri_i64(td, td, 31);
370 bbe418f2 Jia Liu
                tcg_gen_andi_i64(td, td, 0x3);
371 bbe418f2 Jia Liu
                /* Jump to lab when no overflow.  */
372 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x0, lab);
373 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x3, lab);
374 bbe418f2 Jia Liu
                tcg_gen_ori_i32(cpu_sr, cpu_sr, (SR_OV | SR_CY));
375 bbe418f2 Jia Liu
                tcg_gen_andi_i32(sr_ove, cpu_sr, SR_OVE);
376 bbe418f2 Jia Liu
                tcg_gen_brcondi_i32(TCG_COND_NE, sr_ove, SR_OVE, lab);
377 bbe418f2 Jia Liu
                gen_exception(dc, EXCP_RANGE);
378 bbe418f2 Jia Liu
                gen_set_label(lab);
379 bbe418f2 Jia Liu
                tcg_gen_mov_i32(cpu_R[rd], res);
380 bbe418f2 Jia Liu
                tcg_temp_free_i64(ta);
381 bbe418f2 Jia Liu
                tcg_temp_free_i64(tb);
382 bbe418f2 Jia Liu
                tcg_temp_free_i64(td);
383 bbe418f2 Jia Liu
                tcg_temp_free_i32(res);
384 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
385 bbe418f2 Jia Liu
            }
386 bbe418f2 Jia Liu
            break;
387 bbe418f2 Jia Liu
        default:
388 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
389 bbe418f2 Jia Liu
            break;
390 bbe418f2 Jia Liu
        }
391 bbe418f2 Jia Liu
        break;
392 bbe418f2 Jia Liu
393 bbe418f2 Jia Liu
    case 0x0003:    /* l.and */
394 bbe418f2 Jia Liu
        switch (op1) {
395 bbe418f2 Jia Liu
        case 0x00:
396 bbe418f2 Jia Liu
            LOG_DIS("l.and r%d, r%d, r%d\n", rd, ra, rb);
397 bbe418f2 Jia Liu
            tcg_gen_and_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
398 bbe418f2 Jia Liu
            break;
399 bbe418f2 Jia Liu
        default:
400 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
401 bbe418f2 Jia Liu
            break;
402 bbe418f2 Jia Liu
        }
403 bbe418f2 Jia Liu
        break;
404 bbe418f2 Jia Liu
405 bbe418f2 Jia Liu
    case 0x0004:    /* l.or */
406 bbe418f2 Jia Liu
        switch (op1) {
407 bbe418f2 Jia Liu
        case 0x00:
408 bbe418f2 Jia Liu
            LOG_DIS("l.or r%d, r%d, r%d\n", rd, ra, rb);
409 bbe418f2 Jia Liu
            tcg_gen_or_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
410 bbe418f2 Jia Liu
            break;
411 bbe418f2 Jia Liu
        default:
412 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
413 bbe418f2 Jia Liu
            break;
414 bbe418f2 Jia Liu
        }
415 bbe418f2 Jia Liu
        break;
416 bbe418f2 Jia Liu
417 bbe418f2 Jia Liu
    case 0x0005:
418 bbe418f2 Jia Liu
        switch (op1) {
419 bbe418f2 Jia Liu
        case 0x00:    /* l.xor */
420 bbe418f2 Jia Liu
            LOG_DIS("l.xor r%d, r%d, r%d\n", rd, ra, rb);
421 bbe418f2 Jia Liu
            tcg_gen_xor_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
422 bbe418f2 Jia Liu
            break;
423 bbe418f2 Jia Liu
        default:
424 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
425 bbe418f2 Jia Liu
            break;
426 bbe418f2 Jia Liu
        }
427 bbe418f2 Jia Liu
        break;
428 bbe418f2 Jia Liu
429 bbe418f2 Jia Liu
    case 0x0006:
430 bbe418f2 Jia Liu
        switch (op1) {
431 bbe418f2 Jia Liu
        case 0x03:    /* l.mul */
432 bbe418f2 Jia Liu
            LOG_DIS("l.mul r%d, r%d, r%d\n", rd, ra, rb);
433 bbe418f2 Jia Liu
            if (ra != 0 && rb != 0) {
434 bbe418f2 Jia Liu
                gen_helper_mul32(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
435 bbe418f2 Jia Liu
            } else {
436 bbe418f2 Jia Liu
                tcg_gen_movi_tl(cpu_R[rd], 0x0);
437 bbe418f2 Jia Liu
            }
438 bbe418f2 Jia Liu
            break;
439 bbe418f2 Jia Liu
        default:
440 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
441 bbe418f2 Jia Liu
            break;
442 bbe418f2 Jia Liu
        }
443 bbe418f2 Jia Liu
        break;
444 bbe418f2 Jia Liu
445 bbe418f2 Jia Liu
    case 0x0009:
446 bbe418f2 Jia Liu
        switch (op1) {
447 bbe418f2 Jia Liu
        case 0x03:    /* l.div */
448 bbe418f2 Jia Liu
            LOG_DIS("l.div r%d, r%d, r%d\n", rd, ra, rb);
449 bbe418f2 Jia Liu
            {
450 bbe418f2 Jia Liu
                int lab0 = gen_new_label();
451 bbe418f2 Jia Liu
                int lab1 = gen_new_label();
452 bbe418f2 Jia Liu
                int lab2 = gen_new_label();
453 bbe418f2 Jia Liu
                int lab3 = gen_new_label();
454 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
455 bbe418f2 Jia Liu
                if (rb == 0) {
456 bbe418f2 Jia Liu
                    tcg_gen_ori_tl(cpu_sr, cpu_sr, (SR_OV | SR_CY));
457 bbe418f2 Jia Liu
                    tcg_gen_andi_tl(sr_ove, cpu_sr, SR_OVE);
458 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab0);
459 bbe418f2 Jia Liu
                    gen_exception(dc, EXCP_RANGE);
460 bbe418f2 Jia Liu
                    gen_set_label(lab0);
461 bbe418f2 Jia Liu
                } else {
462 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_R[rb],
463 bbe418f2 Jia Liu
                                       0x00000000, lab1);
464 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, cpu_R[ra],
465 bbe418f2 Jia Liu
                                       0x80000000, lab2);
466 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, cpu_R[rb],
467 bbe418f2 Jia Liu
                                       0xffffffff, lab2);
468 bbe418f2 Jia Liu
                    gen_set_label(lab1);
469 bbe418f2 Jia Liu
                    tcg_gen_ori_tl(cpu_sr, cpu_sr, (SR_OV | SR_CY));
470 bbe418f2 Jia Liu
                    tcg_gen_andi_tl(sr_ove, cpu_sr, SR_OVE);
471 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab3);
472 bbe418f2 Jia Liu
                    gen_exception(dc, EXCP_RANGE);
473 bbe418f2 Jia Liu
                    gen_set_label(lab2);
474 bbe418f2 Jia Liu
                    tcg_gen_div_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
475 bbe418f2 Jia Liu
                    gen_set_label(lab3);
476 bbe418f2 Jia Liu
                }
477 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
478 bbe418f2 Jia Liu
            }
479 bbe418f2 Jia Liu
            break;
480 bbe418f2 Jia Liu
481 bbe418f2 Jia Liu
        default:
482 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
483 bbe418f2 Jia Liu
            break;
484 bbe418f2 Jia Liu
        }
485 bbe418f2 Jia Liu
        break;
486 bbe418f2 Jia Liu
487 bbe418f2 Jia Liu
    case 0x000a:
488 bbe418f2 Jia Liu
        switch (op1) {
489 bbe418f2 Jia Liu
        case 0x03:    /* l.divu */
490 bbe418f2 Jia Liu
            LOG_DIS("l.divu r%d, r%d, r%d\n", rd, ra, rb);
491 bbe418f2 Jia Liu
            {
492 bbe418f2 Jia Liu
                int lab0 = gen_new_label();
493 bbe418f2 Jia Liu
                int lab1 = gen_new_label();
494 bbe418f2 Jia Liu
                int lab2 = gen_new_label();
495 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
496 bbe418f2 Jia Liu
                if (rb == 0) {
497 bbe418f2 Jia Liu
                    tcg_gen_ori_tl(cpu_sr, cpu_sr, (SR_OV | SR_CY));
498 bbe418f2 Jia Liu
                    tcg_gen_andi_tl(sr_ove, cpu_sr, SR_OVE);
499 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab0);
500 bbe418f2 Jia Liu
                    gen_exception(dc, EXCP_RANGE);
501 bbe418f2 Jia Liu
                    gen_set_label(lab0);
502 bbe418f2 Jia Liu
                } else {
503 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, cpu_R[rb],
504 bbe418f2 Jia Liu
                                       0x00000000, lab1);
505 bbe418f2 Jia Liu
                    tcg_gen_ori_tl(cpu_sr, cpu_sr, (SR_OV | SR_CY));
506 bbe418f2 Jia Liu
                    tcg_gen_andi_tl(sr_ove, cpu_sr, SR_OVE);
507 bbe418f2 Jia Liu
                    tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab2);
508 bbe418f2 Jia Liu
                    gen_exception(dc, EXCP_RANGE);
509 bbe418f2 Jia Liu
                    gen_set_label(lab1);
510 bbe418f2 Jia Liu
                    tcg_gen_divu_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
511 bbe418f2 Jia Liu
                    gen_set_label(lab2);
512 bbe418f2 Jia Liu
                }
513 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
514 bbe418f2 Jia Liu
            }
515 bbe418f2 Jia Liu
            break;
516 bbe418f2 Jia Liu
517 bbe418f2 Jia Liu
        default:
518 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
519 bbe418f2 Jia Liu
            break;
520 bbe418f2 Jia Liu
        }
521 bbe418f2 Jia Liu
        break;
522 bbe418f2 Jia Liu
523 bbe418f2 Jia Liu
    case 0x000b:
524 bbe418f2 Jia Liu
        switch (op1) {
525 bbe418f2 Jia Liu
        case 0x03:    /* l.mulu */
526 bbe418f2 Jia Liu
            LOG_DIS("l.mulu r%d, r%d, r%d\n", rd, ra, rb);
527 bbe418f2 Jia Liu
            if (rb != 0 && ra != 0) {
528 bbe418f2 Jia Liu
                TCGv_i64 result = tcg_temp_local_new_i64();
529 bbe418f2 Jia Liu
                TCGv_i64 tra = tcg_temp_local_new_i64();
530 bbe418f2 Jia Liu
                TCGv_i64 trb = tcg_temp_local_new_i64();
531 bbe418f2 Jia Liu
                TCGv_i64 high = tcg_temp_new_i64();
532 bbe418f2 Jia Liu
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
533 bbe418f2 Jia Liu
                int lab = gen_new_label();
534 bbe418f2 Jia Liu
                /* Calculate the each result.  */
535 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(tra, cpu_R[ra]);
536 bbe418f2 Jia Liu
                tcg_gen_extu_i32_i64(trb, cpu_R[rb]);
537 bbe418f2 Jia Liu
                tcg_gen_mul_i64(result, tra, trb);
538 bbe418f2 Jia Liu
                tcg_temp_free_i64(tra);
539 bbe418f2 Jia Liu
                tcg_temp_free_i64(trb);
540 bbe418f2 Jia Liu
                tcg_gen_shri_i64(high, result, TARGET_LONG_BITS);
541 bbe418f2 Jia Liu
                /* Overflow or not.  */
542 bbe418f2 Jia Liu
                tcg_gen_brcondi_i64(TCG_COND_EQ, high, 0x00000000, lab);
543 bbe418f2 Jia Liu
                tcg_gen_ori_tl(cpu_sr, cpu_sr, (SR_OV | SR_CY));
544 bbe418f2 Jia Liu
                tcg_gen_andi_tl(sr_ove, cpu_sr, SR_OVE);
545 bbe418f2 Jia Liu
                tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab);
546 bbe418f2 Jia Liu
                gen_exception(dc, EXCP_RANGE);
547 bbe418f2 Jia Liu
                gen_set_label(lab);
548 bbe418f2 Jia Liu
                tcg_temp_free_i64(high);
549 bbe418f2 Jia Liu
                tcg_gen_trunc_i64_tl(cpu_R[rd], result);
550 bbe418f2 Jia Liu
                tcg_temp_free_i64(result);
551 bbe418f2 Jia Liu
                tcg_temp_free_i32(sr_ove);
552 bbe418f2 Jia Liu
            } else {
553 bbe418f2 Jia Liu
                tcg_gen_movi_tl(cpu_R[rd], 0);
554 bbe418f2 Jia Liu
            }
555 bbe418f2 Jia Liu
            break;
556 bbe418f2 Jia Liu
557 bbe418f2 Jia Liu
        default:
558 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
559 bbe418f2 Jia Liu
            break;
560 bbe418f2 Jia Liu
        }
561 bbe418f2 Jia Liu
        break;
562 bbe418f2 Jia Liu
563 bbe418f2 Jia Liu
    case 0x000e:
564 bbe418f2 Jia Liu
        switch (op1) {
565 bbe418f2 Jia Liu
        case 0x00:    /* l.cmov */
566 bbe418f2 Jia Liu
            LOG_DIS("l.cmov r%d, r%d, r%d\n", rd, ra, rb);
567 bbe418f2 Jia Liu
            {
568 bbe418f2 Jia Liu
                int lab = gen_new_label();
569 bbe418f2 Jia Liu
                TCGv res = tcg_temp_local_new();
570 bbe418f2 Jia Liu
                TCGv sr_f = tcg_temp_new();
571 bbe418f2 Jia Liu
                tcg_gen_andi_tl(sr_f, cpu_sr, SR_F);
572 bbe418f2 Jia Liu
                tcg_gen_mov_tl(res, cpu_R[rb]);
573 bbe418f2 Jia Liu
                tcg_gen_brcondi_tl(TCG_COND_NE, sr_f, SR_F, lab);
574 bbe418f2 Jia Liu
                tcg_gen_mov_tl(res, cpu_R[ra]);
575 bbe418f2 Jia Liu
                gen_set_label(lab);
576 bbe418f2 Jia Liu
                tcg_gen_mov_tl(cpu_R[rd], res);
577 bbe418f2 Jia Liu
                tcg_temp_free(sr_f);
578 bbe418f2 Jia Liu
                tcg_temp_free(res);
579 bbe418f2 Jia Liu
            }
580 bbe418f2 Jia Liu
            break;
581 bbe418f2 Jia Liu
582 bbe418f2 Jia Liu
        default:
583 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
584 bbe418f2 Jia Liu
            break;
585 bbe418f2 Jia Liu
        }
586 bbe418f2 Jia Liu
        break;
587 bbe418f2 Jia Liu
588 bbe418f2 Jia Liu
    case 0x000f:
589 bbe418f2 Jia Liu
        switch (op1) {
590 bbe418f2 Jia Liu
        case 0x00:    /* l.ff1 */
591 bbe418f2 Jia Liu
            LOG_DIS("l.ff1 r%d, r%d, r%d\n", rd, ra, rb);
592 bbe418f2 Jia Liu
            gen_helper_ff1(cpu_R[rd], cpu_R[ra]);
593 bbe418f2 Jia Liu
            break;
594 bbe418f2 Jia Liu
        case 0x01:    /* l.fl1 */
595 bbe418f2 Jia Liu
            LOG_DIS("l.fl1 r%d, r%d, r%d\n", rd, ra, rb);
596 bbe418f2 Jia Liu
            gen_helper_fl1(cpu_R[rd], cpu_R[ra]);
597 bbe418f2 Jia Liu
            break;
598 bbe418f2 Jia Liu
599 bbe418f2 Jia Liu
        default:
600 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
601 bbe418f2 Jia Liu
            break;
602 bbe418f2 Jia Liu
        }
603 bbe418f2 Jia Liu
        break;
604 bbe418f2 Jia Liu
605 bbe418f2 Jia Liu
    case 0x0008:
606 bbe418f2 Jia Liu
        switch (op1) {
607 bbe418f2 Jia Liu
        case 0x00:
608 bbe418f2 Jia Liu
            switch (op2) {
609 bbe418f2 Jia Liu
            case 0x00:    /* l.sll */
610 bbe418f2 Jia Liu
                LOG_DIS("l.sll r%d, r%d, r%d\n", rd, ra, rb);
611 bbe418f2 Jia Liu
                tcg_gen_shl_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
612 bbe418f2 Jia Liu
                break;
613 bbe418f2 Jia Liu
            case 0x01:    /* l.srl */
614 bbe418f2 Jia Liu
                LOG_DIS("l.srl r%d, r%d, r%d\n", rd, ra, rb);
615 bbe418f2 Jia Liu
                tcg_gen_shr_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
616 bbe418f2 Jia Liu
                break;
617 bbe418f2 Jia Liu
            case 0x02:    /* l.sra */
618 bbe418f2 Jia Liu
                LOG_DIS("l.sra r%d, r%d, r%d\n", rd, ra, rb);
619 bbe418f2 Jia Liu
                tcg_gen_sar_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
620 bbe418f2 Jia Liu
                break;
621 bbe418f2 Jia Liu
            case 0x03:    /* l.ror */
622 bbe418f2 Jia Liu
                LOG_DIS("l.ror r%d, r%d, r%d\n", rd, ra, rb);
623 bbe418f2 Jia Liu
                tcg_gen_rotr_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
624 bbe418f2 Jia Liu
                break;
625 bbe418f2 Jia Liu
626 bbe418f2 Jia Liu
            default:
627 bbe418f2 Jia Liu
                gen_illegal_exception(dc);
628 bbe418f2 Jia Liu
                break;
629 bbe418f2 Jia Liu
            }
630 bbe418f2 Jia Liu
            break;
631 bbe418f2 Jia Liu
632 bbe418f2 Jia Liu
        default:
633 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
634 bbe418f2 Jia Liu
            break;
635 bbe418f2 Jia Liu
        }
636 bbe418f2 Jia Liu
        break;
637 bbe418f2 Jia Liu
638 bbe418f2 Jia Liu
    case 0x000c:
639 bbe418f2 Jia Liu
        switch (op1) {
640 bbe418f2 Jia Liu
        case 0x00:
641 bbe418f2 Jia Liu
            switch (op2) {
642 bbe418f2 Jia Liu
            case 0x00:    /* l.exths */
643 bbe418f2 Jia Liu
                LOG_DIS("l.exths r%d, r%d\n", rd, ra);
644 bbe418f2 Jia Liu
                tcg_gen_ext16s_tl(cpu_R[rd], cpu_R[ra]);
645 bbe418f2 Jia Liu
                break;
646 bbe418f2 Jia Liu
            case 0x01:    /* l.extbs */
647 bbe418f2 Jia Liu
                LOG_DIS("l.extbs r%d, r%d\n", rd, ra);
648 bbe418f2 Jia Liu
                tcg_gen_ext8s_tl(cpu_R[rd], cpu_R[ra]);
649 bbe418f2 Jia Liu
                break;
650 bbe418f2 Jia Liu
            case 0x02:    /* l.exthz */
651 bbe418f2 Jia Liu
                LOG_DIS("l.exthz r%d, r%d\n", rd, ra);
652 bbe418f2 Jia Liu
                tcg_gen_ext16u_tl(cpu_R[rd], cpu_R[ra]);
653 bbe418f2 Jia Liu
                break;
654 bbe418f2 Jia Liu
            case 0x03:    /* l.extbz */
655 bbe418f2 Jia Liu
                LOG_DIS("l.extbz r%d, r%d\n", rd, ra);
656 bbe418f2 Jia Liu
                tcg_gen_ext8u_tl(cpu_R[rd], cpu_R[ra]);
657 bbe418f2 Jia Liu
                break;
658 bbe418f2 Jia Liu
659 bbe418f2 Jia Liu
            default:
660 bbe418f2 Jia Liu
                gen_illegal_exception(dc);
661 bbe418f2 Jia Liu
                break;
662 bbe418f2 Jia Liu
            }
663 bbe418f2 Jia Liu
            break;
664 bbe418f2 Jia Liu
665 bbe418f2 Jia Liu
        default:
666 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
667 bbe418f2 Jia Liu
            break;
668 bbe418f2 Jia Liu
        }
669 bbe418f2 Jia Liu
        break;
670 bbe418f2 Jia Liu
671 bbe418f2 Jia Liu
    case 0x000d:
672 bbe418f2 Jia Liu
        switch (op1) {
673 bbe418f2 Jia Liu
        case 0x00:
674 bbe418f2 Jia Liu
            switch (op2) {
675 bbe418f2 Jia Liu
            case 0x00:    /* l.extws */
676 bbe418f2 Jia Liu
                LOG_DIS("l.extws r%d, r%d\n", rd, ra);
677 bbe418f2 Jia Liu
                tcg_gen_ext32s_tl(cpu_R[rd], cpu_R[ra]);
678 bbe418f2 Jia Liu
                break;
679 bbe418f2 Jia Liu
            case 0x01:    /* l.extwz */
680 bbe418f2 Jia Liu
                LOG_DIS("l.extwz r%d, r%d\n", rd, ra);
681 bbe418f2 Jia Liu
                tcg_gen_ext32u_tl(cpu_R[rd], cpu_R[ra]);
682 bbe418f2 Jia Liu
                break;
683 bbe418f2 Jia Liu
684 bbe418f2 Jia Liu
            default:
685 bbe418f2 Jia Liu
                gen_illegal_exception(dc);
686 bbe418f2 Jia Liu
                break;
687 bbe418f2 Jia Liu
            }
688 bbe418f2 Jia Liu
            break;
689 bbe418f2 Jia Liu
690 bbe418f2 Jia Liu
        default:
691 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
692 bbe418f2 Jia Liu
            break;
693 bbe418f2 Jia Liu
        }
694 bbe418f2 Jia Liu
        break;
695 bbe418f2 Jia Liu
696 bbe418f2 Jia Liu
    default:
697 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
698 bbe418f2 Jia Liu
        break;
699 bbe418f2 Jia Liu
    }
700 bbe418f2 Jia Liu
}
701 bbe418f2 Jia Liu
702 bbe418f2 Jia Liu
static void dec_misc(DisasContext *dc, uint32_t insn)
703 bbe418f2 Jia Liu
{
704 bbe418f2 Jia Liu
    uint32_t op0, op1;
705 bbe418f2 Jia Liu
    uint32_t ra, rb, rd;
706 bbe418f2 Jia Liu
#ifdef OPENRISC_DISAS
707 bbe418f2 Jia Liu
    uint32_t L6, K5;
708 bbe418f2 Jia Liu
#endif
709 bbe418f2 Jia Liu
    uint32_t I16, I5, I11, N26, tmp;
710 bbe418f2 Jia Liu
    op0 = extract32(insn, 26, 6);
711 bbe418f2 Jia Liu
    op1 = extract32(insn, 24, 2);
712 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
713 bbe418f2 Jia Liu
    rb = extract32(insn, 11, 5);
714 bbe418f2 Jia Liu
    rd = extract32(insn, 21, 5);
715 bbe418f2 Jia Liu
#ifdef OPENRISC_DISAS
716 bbe418f2 Jia Liu
    L6 = extract32(insn, 5, 6);
717 bbe418f2 Jia Liu
    K5 = extract32(insn, 0, 5);
718 bbe418f2 Jia Liu
#endif
719 bbe418f2 Jia Liu
    I16 = extract32(insn, 0, 16);
720 bbe418f2 Jia Liu
    I5 = extract32(insn, 21, 5);
721 bbe418f2 Jia Liu
    I11 = extract32(insn, 0, 11);
722 bbe418f2 Jia Liu
    N26 = extract32(insn, 0, 26);
723 bbe418f2 Jia Liu
    tmp = (I5<<11) + I11;
724 bbe418f2 Jia Liu
725 bbe418f2 Jia Liu
    switch (op0) {
726 bbe418f2 Jia Liu
    case 0x00:    /* l.j */
727 bbe418f2 Jia Liu
        LOG_DIS("l.j %d\n", N26);
728 bbe418f2 Jia Liu
        gen_jump(dc, N26, 0, op0);
729 bbe418f2 Jia Liu
        break;
730 bbe418f2 Jia Liu
731 bbe418f2 Jia Liu
    case 0x01:    /* l.jal */
732 bbe418f2 Jia Liu
        LOG_DIS("l.jal %d\n", N26);
733 bbe418f2 Jia Liu
        gen_jump(dc, N26, 0, op0);
734 bbe418f2 Jia Liu
        break;
735 bbe418f2 Jia Liu
736 bbe418f2 Jia Liu
    case 0x03:    /* l.bnf */
737 bbe418f2 Jia Liu
        LOG_DIS("l.bnf %d\n", N26);
738 bbe418f2 Jia Liu
        gen_jump(dc, N26, 0, op0);
739 bbe418f2 Jia Liu
        break;
740 bbe418f2 Jia Liu
741 bbe418f2 Jia Liu
    case 0x04:    /* l.bf */
742 bbe418f2 Jia Liu
        LOG_DIS("l.bf %d\n", N26);
743 bbe418f2 Jia Liu
        gen_jump(dc, N26, 0, op0);
744 bbe418f2 Jia Liu
        break;
745 bbe418f2 Jia Liu
746 bbe418f2 Jia Liu
    case 0x05:
747 bbe418f2 Jia Liu
        switch (op1) {
748 bbe418f2 Jia Liu
        case 0x01:    /* l.nop */
749 bbe418f2 Jia Liu
            LOG_DIS("l.nop %d\n", I16);
750 bbe418f2 Jia Liu
            break;
751 bbe418f2 Jia Liu
752 bbe418f2 Jia Liu
        default:
753 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
754 bbe418f2 Jia Liu
            break;
755 bbe418f2 Jia Liu
        }
756 bbe418f2 Jia Liu
        break;
757 bbe418f2 Jia Liu
758 bbe418f2 Jia Liu
    case 0x11:    /* l.jr */
759 bbe418f2 Jia Liu
        LOG_DIS("l.jr r%d\n", rb);
760 bbe418f2 Jia Liu
         gen_jump(dc, 0, rb, op0);
761 bbe418f2 Jia Liu
         break;
762 bbe418f2 Jia Liu
763 bbe418f2 Jia Liu
    case 0x12:    /* l.jalr */
764 bbe418f2 Jia Liu
        LOG_DIS("l.jalr r%d\n", rb);
765 bbe418f2 Jia Liu
        gen_jump(dc, 0, rb, op0);
766 bbe418f2 Jia Liu
        break;
767 bbe418f2 Jia Liu
768 bbe418f2 Jia Liu
    case 0x13:    /* l.maci */
769 bbe418f2 Jia Liu
        LOG_DIS("l.maci %d, r%d, %d\n", I5, ra, I11);
770 bbe418f2 Jia Liu
        {
771 bbe418f2 Jia Liu
            TCGv_i64 t1 = tcg_temp_new_i64();
772 bbe418f2 Jia Liu
            TCGv_i64 t2 = tcg_temp_new_i64();
773 bbe418f2 Jia Liu
            TCGv_i32 dst = tcg_temp_new_i32();
774 bbe418f2 Jia Liu
            TCGv ttmp = tcg_const_tl(tmp);
775 bbe418f2 Jia Liu
            tcg_gen_mul_tl(dst, cpu_R[ra], ttmp);
776 bbe418f2 Jia Liu
            tcg_gen_ext_i32_i64(t1, dst);
777 bbe418f2 Jia Liu
            tcg_gen_concat_i32_i64(t2, maclo, machi);
778 bbe418f2 Jia Liu
            tcg_gen_add_i64(t2, t2, t1);
779 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(maclo, t2);
780 bbe418f2 Jia Liu
            tcg_gen_shri_i64(t2, t2, 32);
781 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(machi, t2);
782 bbe418f2 Jia Liu
            tcg_temp_free_i32(dst);
783 bbe418f2 Jia Liu
            tcg_temp_free(ttmp);
784 bbe418f2 Jia Liu
            tcg_temp_free_i64(t1);
785 bbe418f2 Jia Liu
            tcg_temp_free_i64(t2);
786 bbe418f2 Jia Liu
        }
787 bbe418f2 Jia Liu
        break;
788 bbe418f2 Jia Liu
789 bbe418f2 Jia Liu
    case 0x09:    /* l.rfe */
790 bbe418f2 Jia Liu
        LOG_DIS("l.rfe\n");
791 bbe418f2 Jia Liu
        {
792 bbe418f2 Jia Liu
#if defined(CONFIG_USER_ONLY)
793 bbe418f2 Jia Liu
            return;
794 bbe418f2 Jia Liu
#else
795 bbe418f2 Jia Liu
            if (dc->mem_idx == MMU_USER_IDX) {
796 bbe418f2 Jia Liu
                gen_illegal_exception(dc);
797 bbe418f2 Jia Liu
                return;
798 bbe418f2 Jia Liu
            }
799 bbe418f2 Jia Liu
            gen_helper_rfe(cpu_env);
800 bbe418f2 Jia Liu
            dc->is_jmp = DISAS_UPDATE;
801 bbe418f2 Jia Liu
#endif
802 bbe418f2 Jia Liu
        }
803 bbe418f2 Jia Liu
        break;
804 bbe418f2 Jia Liu
805 bbe418f2 Jia Liu
    case 0x1c:    /* l.cust1 */
806 bbe418f2 Jia Liu
        LOG_DIS("l.cust1\n");
807 bbe418f2 Jia Liu
        break;
808 bbe418f2 Jia Liu
809 bbe418f2 Jia Liu
    case 0x1d:    /* l.cust2 */
810 bbe418f2 Jia Liu
        LOG_DIS("l.cust2\n");
811 bbe418f2 Jia Liu
        break;
812 bbe418f2 Jia Liu
813 bbe418f2 Jia Liu
    case 0x1e:    /* l.cust3 */
814 bbe418f2 Jia Liu
        LOG_DIS("l.cust3\n");
815 bbe418f2 Jia Liu
        break;
816 bbe418f2 Jia Liu
817 bbe418f2 Jia Liu
    case 0x1f:    /* l.cust4 */
818 bbe418f2 Jia Liu
        LOG_DIS("l.cust4\n");
819 bbe418f2 Jia Liu
        break;
820 bbe418f2 Jia Liu
821 bbe418f2 Jia Liu
    case 0x3c:    /* l.cust5 */
822 bbe418f2 Jia Liu
        LOG_DIS("l.cust5 r%d, r%d, r%d, %d, %d\n", rd, ra, rb, L6, K5);
823 bbe418f2 Jia Liu
        break;
824 bbe418f2 Jia Liu
825 bbe418f2 Jia Liu
    case 0x3d:    /* l.cust6 */
826 bbe418f2 Jia Liu
        LOG_DIS("l.cust6\n");
827 bbe418f2 Jia Liu
        break;
828 bbe418f2 Jia Liu
829 bbe418f2 Jia Liu
    case 0x3e:    /* l.cust7 */
830 bbe418f2 Jia Liu
        LOG_DIS("l.cust7\n");
831 bbe418f2 Jia Liu
        break;
832 bbe418f2 Jia Liu
833 bbe418f2 Jia Liu
    case 0x3f:    /* l.cust8 */
834 bbe418f2 Jia Liu
        LOG_DIS("l.cust8\n");
835 bbe418f2 Jia Liu
        break;
836 bbe418f2 Jia Liu
837 bbe418f2 Jia Liu
/* not used yet, open it when we need or64.  */
838 bbe418f2 Jia Liu
/*#ifdef TARGET_OPENRISC64
839 bbe418f2 Jia Liu
    case 0x20:     l.ld
840 bbe418f2 Jia Liu
        LOG_DIS("l.ld r%d, r%d, %d\n", rd, ra, I16);
841 bbe418f2 Jia Liu
        {
842 bbe418f2 Jia Liu
            check_ob64s(dc);
843 bbe418f2 Jia Liu
            TCGv_i64 t0 = tcg_temp_new_i64();
844 bbe418f2 Jia Liu
            tcg_gen_addi_i64(t0, cpu_R[ra], sign_extend(I16, 16));
845 bbe418f2 Jia Liu
            tcg_gen_qemu_ld64(cpu_R[rd], t0, dc->mem_idx);
846 bbe418f2 Jia Liu
            tcg_temp_free_i64(t0);
847 bbe418f2 Jia Liu
        }
848 bbe418f2 Jia Liu
        break;
849 bbe418f2 Jia Liu
#endif*/
850 bbe418f2 Jia Liu
851 bbe418f2 Jia Liu
    case 0x21:    /* l.lwz */
852 bbe418f2 Jia Liu
        LOG_DIS("l.lwz r%d, r%d, %d\n", rd, ra, I16);
853 bbe418f2 Jia Liu
        {
854 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
855 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
856 bbe418f2 Jia Liu
            tcg_gen_qemu_ld32u(cpu_R[rd], t0, dc->mem_idx);
857 bbe418f2 Jia Liu
            tcg_temp_free(t0);
858 bbe418f2 Jia Liu
        }
859 bbe418f2 Jia Liu
        break;
860 bbe418f2 Jia Liu
861 bbe418f2 Jia Liu
    case 0x22:    /* l.lws */
862 bbe418f2 Jia Liu
        LOG_DIS("l.lws r%d, r%d, %d\n", rd, ra, I16);
863 bbe418f2 Jia Liu
        {
864 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
865 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
866 bbe418f2 Jia Liu
            tcg_gen_qemu_ld32s(cpu_R[rd], t0, dc->mem_idx);
867 bbe418f2 Jia Liu
            tcg_temp_free(t0);
868 bbe418f2 Jia Liu
        }
869 bbe418f2 Jia Liu
        break;
870 bbe418f2 Jia Liu
871 bbe418f2 Jia Liu
    case 0x23:    /* l.lbz */
872 bbe418f2 Jia Liu
        LOG_DIS("l.lbz r%d, r%d, %d\n", rd, ra, I16);
873 bbe418f2 Jia Liu
        {
874 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
875 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
876 bbe418f2 Jia Liu
            tcg_gen_qemu_ld8u(cpu_R[rd], t0, dc->mem_idx);
877 bbe418f2 Jia Liu
            tcg_temp_free(t0);
878 bbe418f2 Jia Liu
        }
879 bbe418f2 Jia Liu
        break;
880 bbe418f2 Jia Liu
881 bbe418f2 Jia Liu
    case 0x24:    /* l.lbs */
882 bbe418f2 Jia Liu
        LOG_DIS("l.lbs r%d, r%d, %d\n", rd, ra, I16);
883 bbe418f2 Jia Liu
        {
884 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
885 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
886 bbe418f2 Jia Liu
            tcg_gen_qemu_ld8s(cpu_R[rd], t0, dc->mem_idx);
887 bbe418f2 Jia Liu
            tcg_temp_free(t0);
888 bbe418f2 Jia Liu
        }
889 bbe418f2 Jia Liu
        break;
890 bbe418f2 Jia Liu
891 bbe418f2 Jia Liu
    case 0x25:    /* l.lhz */
892 bbe418f2 Jia Liu
        LOG_DIS("l.lhz r%d, r%d, %d\n", rd, ra, I16);
893 bbe418f2 Jia Liu
        {
894 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
895 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
896 bbe418f2 Jia Liu
            tcg_gen_qemu_ld16u(cpu_R[rd], t0, dc->mem_idx);
897 bbe418f2 Jia Liu
            tcg_temp_free(t0);
898 bbe418f2 Jia Liu
        }
899 bbe418f2 Jia Liu
        break;
900 bbe418f2 Jia Liu
901 bbe418f2 Jia Liu
    case 0x26:    /* l.lhs */
902 bbe418f2 Jia Liu
        LOG_DIS("l.lhs r%d, r%d, %d\n", rd, ra, I16);
903 bbe418f2 Jia Liu
        {
904 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
905 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(I16, 16));
906 bbe418f2 Jia Liu
            tcg_gen_qemu_ld16s(cpu_R[rd], t0, dc->mem_idx);
907 bbe418f2 Jia Liu
            tcg_temp_free(t0);
908 bbe418f2 Jia Liu
        }
909 bbe418f2 Jia Liu
        break;
910 bbe418f2 Jia Liu
911 bbe418f2 Jia Liu
    case 0x27:    /* l.addi */
912 bbe418f2 Jia Liu
        LOG_DIS("l.addi r%d, r%d, %d\n", rd, ra, I16);
913 bbe418f2 Jia Liu
        {
914 352367e8 Sebastian Macke
            if (I16 == 0) {
915 352367e8 Sebastian Macke
                tcg_gen_mov_tl(cpu_R[rd], cpu_R[ra]);
916 352367e8 Sebastian Macke
            } else {
917 352367e8 Sebastian Macke
                int lab = gen_new_label();
918 352367e8 Sebastian Macke
                TCGv_i64 ta = tcg_temp_new_i64();
919 352367e8 Sebastian Macke
                TCGv_i64 td = tcg_temp_local_new_i64();
920 352367e8 Sebastian Macke
                TCGv_i32 res = tcg_temp_local_new_i32();
921 352367e8 Sebastian Macke
                TCGv_i32 sr_ove = tcg_temp_local_new_i32();
922 352367e8 Sebastian Macke
                tcg_gen_extu_i32_i64(ta, cpu_R[ra]);
923 352367e8 Sebastian Macke
                tcg_gen_addi_i64(td, ta, sign_extend(I16, 16));
924 352367e8 Sebastian Macke
                tcg_gen_trunc_i64_i32(res, td);
925 352367e8 Sebastian Macke
                tcg_gen_shri_i64(td, td, 32);
926 352367e8 Sebastian Macke
                tcg_gen_andi_i64(td, td, 0x3);
927 352367e8 Sebastian Macke
                /* Jump to lab when no overflow.  */
928 352367e8 Sebastian Macke
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x0, lab);
929 352367e8 Sebastian Macke
                tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x3, lab);
930 352367e8 Sebastian Macke
                tcg_gen_ori_i32(cpu_sr, cpu_sr, (SR_OV | SR_CY));
931 352367e8 Sebastian Macke
                tcg_gen_andi_i32(sr_ove, cpu_sr, SR_OVE);
932 352367e8 Sebastian Macke
                tcg_gen_brcondi_i32(TCG_COND_NE, sr_ove, SR_OVE, lab);
933 352367e8 Sebastian Macke
                gen_exception(dc, EXCP_RANGE);
934 352367e8 Sebastian Macke
                gen_set_label(lab);
935 352367e8 Sebastian Macke
                tcg_gen_mov_i32(cpu_R[rd], res);
936 352367e8 Sebastian Macke
                tcg_temp_free_i64(ta);
937 352367e8 Sebastian Macke
                tcg_temp_free_i64(td);
938 352367e8 Sebastian Macke
                tcg_temp_free_i32(res);
939 352367e8 Sebastian Macke
                tcg_temp_free_i32(sr_ove);
940 352367e8 Sebastian Macke
            }
941 bbe418f2 Jia Liu
        }
942 bbe418f2 Jia Liu
        break;
943 bbe418f2 Jia Liu
944 bbe418f2 Jia Liu
    case 0x28:    /* l.addic */
945 bbe418f2 Jia Liu
        LOG_DIS("l.addic r%d, r%d, %d\n", rd, ra, I16);
946 bbe418f2 Jia Liu
        {
947 bbe418f2 Jia Liu
            int lab = gen_new_label();
948 bbe418f2 Jia Liu
            TCGv_i64 ta = tcg_temp_new_i64();
949 bbe418f2 Jia Liu
            TCGv_i64 td = tcg_temp_local_new_i64();
950 bbe418f2 Jia Liu
            TCGv_i64 tcy = tcg_temp_local_new_i64();
951 bbe418f2 Jia Liu
            TCGv_i32 res = tcg_temp_local_new_i32();
952 bbe418f2 Jia Liu
            TCGv_i32 sr_cy = tcg_temp_local_new_i32();
953 bbe418f2 Jia Liu
            TCGv_i32 sr_ove = tcg_temp_local_new_i32();
954 bbe418f2 Jia Liu
            tcg_gen_extu_i32_i64(ta, cpu_R[ra]);
955 bbe418f2 Jia Liu
            tcg_gen_andi_i32(sr_cy, cpu_sr, SR_CY);
956 bbe418f2 Jia Liu
            tcg_gen_shri_i32(sr_cy, sr_cy, 10);
957 bbe418f2 Jia Liu
            tcg_gen_extu_i32_i64(tcy, sr_cy);
958 bbe418f2 Jia Liu
            tcg_gen_addi_i64(td, ta, sign_extend(I16, 16));
959 bbe418f2 Jia Liu
            tcg_gen_add_i64(td, td, tcy);
960 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(res, td);
961 bbe418f2 Jia Liu
            tcg_gen_shri_i64(td, td, 32);
962 bbe418f2 Jia Liu
            tcg_gen_andi_i64(td, td, 0x3);
963 bbe418f2 Jia Liu
            /* Jump to lab when no overflow.  */
964 bbe418f2 Jia Liu
            tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x0, lab);
965 bbe418f2 Jia Liu
            tcg_gen_brcondi_i64(TCG_COND_EQ, td, 0x3, lab);
966 bbe418f2 Jia Liu
            tcg_gen_ori_i32(cpu_sr, cpu_sr, (SR_OV | SR_CY));
967 bbe418f2 Jia Liu
            tcg_gen_andi_i32(sr_ove, cpu_sr, SR_OVE);
968 bbe418f2 Jia Liu
            tcg_gen_brcondi_i32(TCG_COND_NE, sr_ove, SR_OVE, lab);
969 bbe418f2 Jia Liu
            gen_exception(dc, EXCP_RANGE);
970 bbe418f2 Jia Liu
            gen_set_label(lab);
971 bbe418f2 Jia Liu
            tcg_gen_mov_i32(cpu_R[rd], res);
972 bbe418f2 Jia Liu
            tcg_temp_free_i64(ta);
973 bbe418f2 Jia Liu
            tcg_temp_free_i64(td);
974 bbe418f2 Jia Liu
            tcg_temp_free_i64(tcy);
975 bbe418f2 Jia Liu
            tcg_temp_free_i32(res);
976 bbe418f2 Jia Liu
            tcg_temp_free_i32(sr_cy);
977 bbe418f2 Jia Liu
            tcg_temp_free_i32(sr_ove);
978 bbe418f2 Jia Liu
        }
979 bbe418f2 Jia Liu
        break;
980 bbe418f2 Jia Liu
981 bbe418f2 Jia Liu
    case 0x29:    /* l.andi */
982 bbe418f2 Jia Liu
        LOG_DIS("l.andi r%d, r%d, %d\n", rd, ra, I16);
983 bbe418f2 Jia Liu
        tcg_gen_andi_tl(cpu_R[rd], cpu_R[ra], zero_extend(I16, 16));
984 bbe418f2 Jia Liu
        break;
985 bbe418f2 Jia Liu
986 bbe418f2 Jia Liu
    case 0x2a:    /* l.ori */
987 bbe418f2 Jia Liu
        LOG_DIS("l.ori r%d, r%d, %d\n", rd, ra, I16);
988 bbe418f2 Jia Liu
        tcg_gen_ori_tl(cpu_R[rd], cpu_R[ra], zero_extend(I16, 16));
989 bbe418f2 Jia Liu
        break;
990 bbe418f2 Jia Liu
991 bbe418f2 Jia Liu
    case 0x2b:    /* l.xori */
992 bbe418f2 Jia Liu
        LOG_DIS("l.xori r%d, r%d, %d\n", rd, ra, I16);
993 bbe418f2 Jia Liu
        tcg_gen_xori_tl(cpu_R[rd], cpu_R[ra], sign_extend(I16, 16));
994 bbe418f2 Jia Liu
        break;
995 bbe418f2 Jia Liu
996 bbe418f2 Jia Liu
    case 0x2c:    /* l.muli */
997 bbe418f2 Jia Liu
        LOG_DIS("l.muli r%d, r%d, %d\n", rd, ra, I16);
998 bbe418f2 Jia Liu
        if (ra != 0 && I16 != 0) {
999 bbe418f2 Jia Liu
            TCGv_i32 im = tcg_const_i32(I16);
1000 bbe418f2 Jia Liu
            gen_helper_mul32(cpu_R[rd], cpu_env, cpu_R[ra], im);
1001 bbe418f2 Jia Liu
            tcg_temp_free_i32(im);
1002 bbe418f2 Jia Liu
        } else {
1003 bbe418f2 Jia Liu
            tcg_gen_movi_tl(cpu_R[rd], 0x0);
1004 bbe418f2 Jia Liu
        }
1005 bbe418f2 Jia Liu
        break;
1006 bbe418f2 Jia Liu
1007 bbe418f2 Jia Liu
    case 0x2d:    /* l.mfspr */
1008 bbe418f2 Jia Liu
        LOG_DIS("l.mfspr r%d, r%d, %d\n", rd, ra, I16);
1009 4dd044c6 Jia Liu
        {
1010 4dd044c6 Jia Liu
#if defined(CONFIG_USER_ONLY)
1011 4dd044c6 Jia Liu
            return;
1012 4dd044c6 Jia Liu
#else
1013 4dd044c6 Jia Liu
            TCGv_i32 ti = tcg_const_i32(I16);
1014 4dd044c6 Jia Liu
            if (dc->mem_idx == MMU_USER_IDX) {
1015 4dd044c6 Jia Liu
                gen_illegal_exception(dc);
1016 4dd044c6 Jia Liu
                return;
1017 4dd044c6 Jia Liu
            }
1018 4dd044c6 Jia Liu
            gen_helper_mfspr(cpu_R[rd], cpu_env, cpu_R[rd], cpu_R[ra], ti);
1019 4dd044c6 Jia Liu
            tcg_temp_free_i32(ti);
1020 4dd044c6 Jia Liu
#endif
1021 4dd044c6 Jia Liu
        }
1022 bbe418f2 Jia Liu
        break;
1023 bbe418f2 Jia Liu
1024 bbe418f2 Jia Liu
    case 0x30:    /* l.mtspr */
1025 bbe418f2 Jia Liu
        LOG_DIS("l.mtspr %d, r%d, r%d, %d\n", I5, ra, rb, I11);
1026 4dd044c6 Jia Liu
        {
1027 4dd044c6 Jia Liu
#if defined(CONFIG_USER_ONLY)
1028 4dd044c6 Jia Liu
            return;
1029 4dd044c6 Jia Liu
#else
1030 4dd044c6 Jia Liu
            TCGv_i32 im = tcg_const_i32(tmp);
1031 4dd044c6 Jia Liu
            if (dc->mem_idx == MMU_USER_IDX) {
1032 4dd044c6 Jia Liu
                gen_illegal_exception(dc);
1033 4dd044c6 Jia Liu
                return;
1034 4dd044c6 Jia Liu
            }
1035 4dd044c6 Jia Liu
            gen_helper_mtspr(cpu_env, cpu_R[ra], cpu_R[rb], im);
1036 4dd044c6 Jia Liu
            tcg_temp_free_i32(im);
1037 4dd044c6 Jia Liu
#endif
1038 4dd044c6 Jia Liu
        }
1039 bbe418f2 Jia Liu
        break;
1040 bbe418f2 Jia Liu
1041 bbe418f2 Jia Liu
/* not used yet, open it when we need or64.  */
1042 bbe418f2 Jia Liu
/*#ifdef TARGET_OPENRISC64
1043 bbe418f2 Jia Liu
    case 0x34:     l.sd
1044 bbe418f2 Jia Liu
        LOG_DIS("l.sd %d, r%d, r%d, %d\n", I5, ra, rb, I11);
1045 bbe418f2 Jia Liu
        {
1046 bbe418f2 Jia Liu
            check_ob64s(dc);
1047 bbe418f2 Jia Liu
            TCGv_i64 t0 = tcg_temp_new_i64();
1048 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(tmp, 16));
1049 bbe418f2 Jia Liu
            tcg_gen_qemu_st64(cpu_R[rb], t0, dc->mem_idx);
1050 bbe418f2 Jia Liu
            tcg_temp_free_i64(t0);
1051 bbe418f2 Jia Liu
        }
1052 bbe418f2 Jia Liu
        break;
1053 bbe418f2 Jia Liu
#endif*/
1054 bbe418f2 Jia Liu
1055 bbe418f2 Jia Liu
    case 0x35:    /* l.sw */
1056 bbe418f2 Jia Liu
        LOG_DIS("l.sw %d, r%d, r%d, %d\n", I5, ra, rb, I11);
1057 bbe418f2 Jia Liu
        {
1058 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
1059 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(tmp, 16));
1060 bbe418f2 Jia Liu
            tcg_gen_qemu_st32(cpu_R[rb], t0, dc->mem_idx);
1061 bbe418f2 Jia Liu
            tcg_temp_free(t0);
1062 bbe418f2 Jia Liu
        }
1063 bbe418f2 Jia Liu
        break;
1064 bbe418f2 Jia Liu
1065 bbe418f2 Jia Liu
    case 0x36:    /* l.sb */
1066 bbe418f2 Jia Liu
        LOG_DIS("l.sb %d, r%d, r%d, %d\n", I5, ra, rb, I11);
1067 bbe418f2 Jia Liu
        {
1068 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
1069 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(tmp, 16));
1070 bbe418f2 Jia Liu
            tcg_gen_qemu_st8(cpu_R[rb], t0, dc->mem_idx);
1071 bbe418f2 Jia Liu
            tcg_temp_free(t0);
1072 bbe418f2 Jia Liu
        }
1073 bbe418f2 Jia Liu
        break;
1074 bbe418f2 Jia Liu
1075 bbe418f2 Jia Liu
    case 0x37:    /* l.sh */
1076 bbe418f2 Jia Liu
        LOG_DIS("l.sh %d, r%d, r%d, %d\n", I5, ra, rb, I11);
1077 bbe418f2 Jia Liu
        {
1078 bbe418f2 Jia Liu
            TCGv t0 = tcg_temp_new();
1079 bbe418f2 Jia Liu
            tcg_gen_addi_tl(t0, cpu_R[ra], sign_extend(tmp, 16));
1080 bbe418f2 Jia Liu
            tcg_gen_qemu_st16(cpu_R[rb], t0, dc->mem_idx);
1081 bbe418f2 Jia Liu
            tcg_temp_free(t0);
1082 bbe418f2 Jia Liu
        }
1083 bbe418f2 Jia Liu
        break;
1084 bbe418f2 Jia Liu
1085 bbe418f2 Jia Liu
    default:
1086 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1087 bbe418f2 Jia Liu
        break;
1088 bbe418f2 Jia Liu
    }
1089 bbe418f2 Jia Liu
}
1090 bbe418f2 Jia Liu
1091 bbe418f2 Jia Liu
static void dec_mac(DisasContext *dc, uint32_t insn)
1092 bbe418f2 Jia Liu
{
1093 bbe418f2 Jia Liu
    uint32_t op0;
1094 bbe418f2 Jia Liu
    uint32_t ra, rb;
1095 bbe418f2 Jia Liu
    op0 = extract32(insn, 0, 4);
1096 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
1097 bbe418f2 Jia Liu
    rb = extract32(insn, 11, 5);
1098 bbe418f2 Jia Liu
1099 bbe418f2 Jia Liu
    switch (op0) {
1100 bbe418f2 Jia Liu
    case 0x0001:    /* l.mac */
1101 bbe418f2 Jia Liu
        LOG_DIS("l.mac r%d, r%d\n", ra, rb);
1102 bbe418f2 Jia Liu
        {
1103 bbe418f2 Jia Liu
            TCGv_i32 t0 = tcg_temp_new_i32();
1104 bbe418f2 Jia Liu
            TCGv_i64 t1 = tcg_temp_new_i64();
1105 bbe418f2 Jia Liu
            TCGv_i64 t2 = tcg_temp_new_i64();
1106 bbe418f2 Jia Liu
            tcg_gen_mul_tl(t0, cpu_R[ra], cpu_R[rb]);
1107 bbe418f2 Jia Liu
            tcg_gen_ext_i32_i64(t1, t0);
1108 bbe418f2 Jia Liu
            tcg_gen_concat_i32_i64(t2, maclo, machi);
1109 bbe418f2 Jia Liu
            tcg_gen_add_i64(t2, t2, t1);
1110 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(maclo, t2);
1111 bbe418f2 Jia Liu
            tcg_gen_shri_i64(t2, t2, 32);
1112 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(machi, t2);
1113 bbe418f2 Jia Liu
            tcg_temp_free_i32(t0);
1114 bbe418f2 Jia Liu
            tcg_temp_free_i64(t1);
1115 bbe418f2 Jia Liu
            tcg_temp_free_i64(t2);
1116 bbe418f2 Jia Liu
        }
1117 bbe418f2 Jia Liu
        break;
1118 bbe418f2 Jia Liu
1119 bbe418f2 Jia Liu
    case 0x0002:    /* l.msb */
1120 bbe418f2 Jia Liu
        LOG_DIS("l.msb r%d, r%d\n", ra, rb);
1121 bbe418f2 Jia Liu
        {
1122 bbe418f2 Jia Liu
            TCGv_i32 t0 = tcg_temp_new_i32();
1123 bbe418f2 Jia Liu
            TCGv_i64 t1 = tcg_temp_new_i64();
1124 bbe418f2 Jia Liu
            TCGv_i64 t2 = tcg_temp_new_i64();
1125 bbe418f2 Jia Liu
            tcg_gen_mul_tl(t0, cpu_R[ra], cpu_R[rb]);
1126 bbe418f2 Jia Liu
            tcg_gen_ext_i32_i64(t1, t0);
1127 bbe418f2 Jia Liu
            tcg_gen_concat_i32_i64(t2, maclo, machi);
1128 bbe418f2 Jia Liu
            tcg_gen_sub_i64(t2, t2, t1);
1129 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(maclo, t2);
1130 bbe418f2 Jia Liu
            tcg_gen_shri_i64(t2, t2, 32);
1131 bbe418f2 Jia Liu
            tcg_gen_trunc_i64_i32(machi, t2);
1132 bbe418f2 Jia Liu
            tcg_temp_free_i32(t0);
1133 bbe418f2 Jia Liu
            tcg_temp_free_i64(t1);
1134 bbe418f2 Jia Liu
            tcg_temp_free_i64(t2);
1135 bbe418f2 Jia Liu
        }
1136 bbe418f2 Jia Liu
        break;
1137 bbe418f2 Jia Liu
1138 bbe418f2 Jia Liu
    default:
1139 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1140 bbe418f2 Jia Liu
        break;
1141 bbe418f2 Jia Liu
   }
1142 bbe418f2 Jia Liu
}
1143 bbe418f2 Jia Liu
1144 bbe418f2 Jia Liu
static void dec_logic(DisasContext *dc, uint32_t insn)
1145 bbe418f2 Jia Liu
{
1146 bbe418f2 Jia Liu
    uint32_t op0;
1147 bbe418f2 Jia Liu
    uint32_t rd, ra, L6;
1148 bbe418f2 Jia Liu
    op0 = extract32(insn, 6, 2);
1149 bbe418f2 Jia Liu
    rd = extract32(insn, 21, 5);
1150 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
1151 bbe418f2 Jia Liu
    L6 = extract32(insn, 0, 6);
1152 bbe418f2 Jia Liu
1153 bbe418f2 Jia Liu
    switch (op0) {
1154 bbe418f2 Jia Liu
    case 0x00:    /* l.slli */
1155 bbe418f2 Jia Liu
        LOG_DIS("l.slli r%d, r%d, %d\n", rd, ra, L6);
1156 bbe418f2 Jia Liu
        tcg_gen_shli_tl(cpu_R[rd], cpu_R[ra], (L6 & 0x1f));
1157 bbe418f2 Jia Liu
        break;
1158 bbe418f2 Jia Liu
1159 bbe418f2 Jia Liu
    case 0x01:    /* l.srli */
1160 bbe418f2 Jia Liu
        LOG_DIS("l.srli r%d, r%d, %d\n", rd, ra, L6);
1161 bbe418f2 Jia Liu
        tcg_gen_shri_tl(cpu_R[rd], cpu_R[ra], (L6 & 0x1f));
1162 bbe418f2 Jia Liu
        break;
1163 bbe418f2 Jia Liu
1164 bbe418f2 Jia Liu
    case 0x02:    /* l.srai */
1165 bbe418f2 Jia Liu
        LOG_DIS("l.srai r%d, r%d, %d\n", rd, ra, L6);
1166 bbe418f2 Jia Liu
        tcg_gen_sari_tl(cpu_R[rd], cpu_R[ra], (L6 & 0x1f)); break;
1167 bbe418f2 Jia Liu
1168 bbe418f2 Jia Liu
    case 0x03:    /* l.rori */
1169 bbe418f2 Jia Liu
        LOG_DIS("l.rori r%d, r%d, %d\n", rd, ra, L6);
1170 bbe418f2 Jia Liu
        tcg_gen_rotri_tl(cpu_R[rd], cpu_R[ra], (L6 & 0x1f));
1171 bbe418f2 Jia Liu
        break;
1172 bbe418f2 Jia Liu
1173 bbe418f2 Jia Liu
    default:
1174 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1175 bbe418f2 Jia Liu
        break;
1176 bbe418f2 Jia Liu
    }
1177 bbe418f2 Jia Liu
}
1178 bbe418f2 Jia Liu
1179 bbe418f2 Jia Liu
static void dec_M(DisasContext *dc, uint32_t insn)
1180 bbe418f2 Jia Liu
{
1181 bbe418f2 Jia Liu
    uint32_t op0;
1182 bbe418f2 Jia Liu
    uint32_t rd;
1183 bbe418f2 Jia Liu
    uint32_t K16;
1184 bbe418f2 Jia Liu
    op0 = extract32(insn, 16, 1);
1185 bbe418f2 Jia Liu
    rd = extract32(insn, 21, 5);
1186 bbe418f2 Jia Liu
    K16 = extract32(insn, 0, 16);
1187 bbe418f2 Jia Liu
1188 bbe418f2 Jia Liu
    switch (op0) {
1189 bbe418f2 Jia Liu
    case 0x0:    /* l.movhi */
1190 bbe418f2 Jia Liu
        LOG_DIS("l.movhi  r%d, %d\n", rd, K16);
1191 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_R[rd], (K16 << 16));
1192 bbe418f2 Jia Liu
        break;
1193 bbe418f2 Jia Liu
1194 bbe418f2 Jia Liu
    case 0x1:    /* l.macrc */
1195 bbe418f2 Jia Liu
        LOG_DIS("l.macrc  r%d\n", rd);
1196 bbe418f2 Jia Liu
        tcg_gen_mov_tl(cpu_R[rd], maclo);
1197 bbe418f2 Jia Liu
        tcg_gen_movi_tl(maclo, 0x0);
1198 bbe418f2 Jia Liu
        tcg_gen_movi_tl(machi, 0x0);
1199 bbe418f2 Jia Liu
        break;
1200 bbe418f2 Jia Liu
1201 bbe418f2 Jia Liu
    default:
1202 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1203 bbe418f2 Jia Liu
        break;
1204 bbe418f2 Jia Liu
    }
1205 bbe418f2 Jia Liu
}
1206 bbe418f2 Jia Liu
1207 bbe418f2 Jia Liu
static void dec_comp(DisasContext *dc, uint32_t insn)
1208 bbe418f2 Jia Liu
{
1209 bbe418f2 Jia Liu
    uint32_t op0;
1210 bbe418f2 Jia Liu
    uint32_t ra, rb;
1211 bbe418f2 Jia Liu
1212 bbe418f2 Jia Liu
    op0 = extract32(insn, 21, 5);
1213 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
1214 bbe418f2 Jia Liu
    rb = extract32(insn, 11, 5);
1215 bbe418f2 Jia Liu
1216 bbe418f2 Jia Liu
    tcg_gen_movi_i32(env_btaken, 0x0);
1217 bbe418f2 Jia Liu
    /* unsigned integers  */
1218 bbe418f2 Jia Liu
    tcg_gen_ext32u_tl(cpu_R[ra], cpu_R[ra]);
1219 bbe418f2 Jia Liu
    tcg_gen_ext32u_tl(cpu_R[rb], cpu_R[rb]);
1220 bbe418f2 Jia Liu
1221 bbe418f2 Jia Liu
    switch (op0) {
1222 bbe418f2 Jia Liu
    case 0x0:    /* l.sfeq */
1223 bbe418f2 Jia Liu
        LOG_DIS("l.sfeq  r%d, r%d\n", ra, rb);
1224 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_EQ, env_btaken, cpu_R[ra], cpu_R[rb]);
1225 bbe418f2 Jia Liu
        break;
1226 bbe418f2 Jia Liu
1227 bbe418f2 Jia Liu
    case 0x1:    /* l.sfne */
1228 bbe418f2 Jia Liu
        LOG_DIS("l.sfne  r%d, r%d\n", ra, rb);
1229 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_NE, env_btaken, cpu_R[ra], cpu_R[rb]);
1230 bbe418f2 Jia Liu
        break;
1231 bbe418f2 Jia Liu
1232 bbe418f2 Jia Liu
    case 0x2:    /* l.sfgtu */
1233 bbe418f2 Jia Liu
        LOG_DIS("l.sfgtu  r%d, r%d\n", ra, rb);
1234 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_GTU, env_btaken, cpu_R[ra], cpu_R[rb]);
1235 bbe418f2 Jia Liu
        break;
1236 bbe418f2 Jia Liu
1237 bbe418f2 Jia Liu
    case 0x3:    /* l.sfgeu */
1238 bbe418f2 Jia Liu
        LOG_DIS("l.sfgeu  r%d, r%d\n", ra, rb);
1239 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_GEU, env_btaken, cpu_R[ra], cpu_R[rb]);
1240 bbe418f2 Jia Liu
        break;
1241 bbe418f2 Jia Liu
1242 bbe418f2 Jia Liu
    case 0x4:    /* l.sfltu */
1243 bbe418f2 Jia Liu
        LOG_DIS("l.sfltu  r%d, r%d\n", ra, rb);
1244 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_LTU, env_btaken, cpu_R[ra], cpu_R[rb]);
1245 bbe418f2 Jia Liu
        break;
1246 bbe418f2 Jia Liu
1247 bbe418f2 Jia Liu
    case 0x5:    /* l.sfleu */
1248 bbe418f2 Jia Liu
        LOG_DIS("l.sfleu  r%d, r%d\n", ra, rb);
1249 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_LEU, env_btaken, cpu_R[ra], cpu_R[rb]);
1250 bbe418f2 Jia Liu
        break;
1251 bbe418f2 Jia Liu
1252 bbe418f2 Jia Liu
    case 0xa:    /* l.sfgts */
1253 bbe418f2 Jia Liu
        LOG_DIS("l.sfgts  r%d, r%d\n", ra, rb);
1254 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_GT, env_btaken, cpu_R[ra], cpu_R[rb]);
1255 bbe418f2 Jia Liu
        break;
1256 bbe418f2 Jia Liu
1257 bbe418f2 Jia Liu
    case 0xb:    /* l.sfges */
1258 bbe418f2 Jia Liu
        LOG_DIS("l.sfges  r%d, r%d\n", ra, rb);
1259 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_GE, env_btaken, cpu_R[ra], cpu_R[rb]);
1260 bbe418f2 Jia Liu
        break;
1261 bbe418f2 Jia Liu
1262 bbe418f2 Jia Liu
    case 0xc:    /* l.sflts */
1263 bbe418f2 Jia Liu
        LOG_DIS("l.sflts  r%d, r%d\n", ra, rb);
1264 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_LT, env_btaken, cpu_R[ra], cpu_R[rb]);
1265 bbe418f2 Jia Liu
        break;
1266 bbe418f2 Jia Liu
1267 bbe418f2 Jia Liu
    case 0xd:    /* l.sfles */
1268 bbe418f2 Jia Liu
        LOG_DIS("l.sfles  r%d, r%d\n", ra, rb);
1269 bbe418f2 Jia Liu
        tcg_gen_setcond_tl(TCG_COND_LE, env_btaken, cpu_R[ra], cpu_R[rb]);
1270 bbe418f2 Jia Liu
        break;
1271 bbe418f2 Jia Liu
1272 bbe418f2 Jia Liu
    default:
1273 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1274 bbe418f2 Jia Liu
        break;
1275 bbe418f2 Jia Liu
    }
1276 bbe418f2 Jia Liu
    wb_SR_F();
1277 bbe418f2 Jia Liu
}
1278 bbe418f2 Jia Liu
1279 bbe418f2 Jia Liu
static void dec_compi(DisasContext *dc, uint32_t insn)
1280 bbe418f2 Jia Liu
{
1281 bbe418f2 Jia Liu
    uint32_t op0;
1282 bbe418f2 Jia Liu
    uint32_t ra, I16;
1283 bbe418f2 Jia Liu
1284 bbe418f2 Jia Liu
    op0 = extract32(insn, 21, 5);
1285 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
1286 bbe418f2 Jia Liu
    I16 = extract32(insn, 0, 16);
1287 bbe418f2 Jia Liu
1288 bbe418f2 Jia Liu
    tcg_gen_movi_i32(env_btaken, 0x0);
1289 bbe418f2 Jia Liu
    I16 = sign_extend(I16, 16);
1290 bbe418f2 Jia Liu
1291 bbe418f2 Jia Liu
    switch (op0) {
1292 bbe418f2 Jia Liu
    case 0x0:    /* l.sfeqi */
1293 bbe418f2 Jia Liu
        LOG_DIS("l.sfeqi  r%d, %d\n", ra, I16);
1294 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_EQ, env_btaken, cpu_R[ra], I16);
1295 bbe418f2 Jia Liu
        break;
1296 bbe418f2 Jia Liu
1297 bbe418f2 Jia Liu
    case 0x1:    /* l.sfnei */
1298 bbe418f2 Jia Liu
        LOG_DIS("l.sfnei  r%d, %d\n", ra, I16);
1299 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_NE, env_btaken, cpu_R[ra], I16);
1300 bbe418f2 Jia Liu
        break;
1301 bbe418f2 Jia Liu
1302 bbe418f2 Jia Liu
    case 0x2:    /* l.sfgtui */
1303 bbe418f2 Jia Liu
        LOG_DIS("l.sfgtui  r%d, %d\n", ra, I16);
1304 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_GTU, env_btaken, cpu_R[ra], I16);
1305 bbe418f2 Jia Liu
        break;
1306 bbe418f2 Jia Liu
1307 bbe418f2 Jia Liu
    case 0x3:    /* l.sfgeui */
1308 bbe418f2 Jia Liu
        LOG_DIS("l.sfgeui  r%d, %d\n", ra, I16);
1309 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_GEU, env_btaken, cpu_R[ra], I16);
1310 bbe418f2 Jia Liu
        break;
1311 bbe418f2 Jia Liu
1312 bbe418f2 Jia Liu
    case 0x4:    /* l.sfltui */
1313 bbe418f2 Jia Liu
        LOG_DIS("l.sfltui  r%d, %d\n", ra, I16);
1314 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_LTU, env_btaken, cpu_R[ra], I16);
1315 bbe418f2 Jia Liu
        break;
1316 bbe418f2 Jia Liu
1317 bbe418f2 Jia Liu
    case 0x5:    /* l.sfleui */
1318 bbe418f2 Jia Liu
        LOG_DIS("l.sfleui  r%d, %d\n", ra, I16);
1319 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_LEU, env_btaken, cpu_R[ra], I16);
1320 bbe418f2 Jia Liu
        break;
1321 bbe418f2 Jia Liu
1322 bbe418f2 Jia Liu
    case 0xa:    /* l.sfgtsi */
1323 bbe418f2 Jia Liu
        LOG_DIS("l.sfgtsi  r%d, %d\n", ra, I16);
1324 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_GT, env_btaken, cpu_R[ra], I16);
1325 bbe418f2 Jia Liu
        break;
1326 bbe418f2 Jia Liu
1327 bbe418f2 Jia Liu
    case 0xb:    /* l.sfgesi */
1328 bbe418f2 Jia Liu
        LOG_DIS("l.sfgesi  r%d, %d\n", ra, I16);
1329 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_GE, env_btaken, cpu_R[ra], I16);
1330 bbe418f2 Jia Liu
        break;
1331 bbe418f2 Jia Liu
1332 bbe418f2 Jia Liu
    case 0xc:    /* l.sfltsi */
1333 bbe418f2 Jia Liu
        LOG_DIS("l.sfltsi  r%d, %d\n", ra, I16);
1334 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_LT, env_btaken, cpu_R[ra], I16);
1335 bbe418f2 Jia Liu
        break;
1336 bbe418f2 Jia Liu
1337 bbe418f2 Jia Liu
    case 0xd:    /* l.sflesi */
1338 bbe418f2 Jia Liu
        LOG_DIS("l.sflesi  r%d, %d\n", ra, I16);
1339 bbe418f2 Jia Liu
        tcg_gen_setcondi_tl(TCG_COND_LE, env_btaken, cpu_R[ra], I16);
1340 bbe418f2 Jia Liu
        break;
1341 bbe418f2 Jia Liu
1342 bbe418f2 Jia Liu
    default:
1343 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1344 bbe418f2 Jia Liu
        break;
1345 bbe418f2 Jia Liu
    }
1346 bbe418f2 Jia Liu
    wb_SR_F();
1347 bbe418f2 Jia Liu
}
1348 bbe418f2 Jia Liu
1349 bbe418f2 Jia Liu
static void dec_sys(DisasContext *dc, uint32_t insn)
1350 bbe418f2 Jia Liu
{
1351 bbe418f2 Jia Liu
    uint32_t op0;
1352 bbe418f2 Jia Liu
#ifdef OPENRISC_DISAS
1353 bbe418f2 Jia Liu
    uint32_t K16;
1354 bbe418f2 Jia Liu
#endif
1355 bbe418f2 Jia Liu
    op0 = extract32(insn, 16, 8);
1356 bbe418f2 Jia Liu
#ifdef OPENRISC_DISAS
1357 bbe418f2 Jia Liu
    K16 = extract32(insn, 0, 16);
1358 bbe418f2 Jia Liu
#endif
1359 bbe418f2 Jia Liu
1360 bbe418f2 Jia Liu
    switch (op0) {
1361 bbe418f2 Jia Liu
    case 0x000:    /* l.sys */
1362 bbe418f2 Jia Liu
        LOG_DIS("l.sys %d\n", K16);
1363 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_pc, dc->pc);
1364 bbe418f2 Jia Liu
        gen_exception(dc, EXCP_SYSCALL);
1365 bbe418f2 Jia Liu
        dc->is_jmp = DISAS_UPDATE;
1366 bbe418f2 Jia Liu
        break;
1367 bbe418f2 Jia Liu
1368 bbe418f2 Jia Liu
    case 0x100:    /* l.trap */
1369 bbe418f2 Jia Liu
        LOG_DIS("l.trap %d\n", K16);
1370 bbe418f2 Jia Liu
#if defined(CONFIG_USER_ONLY)
1371 bbe418f2 Jia Liu
        return;
1372 bbe418f2 Jia Liu
#else
1373 bbe418f2 Jia Liu
        if (dc->mem_idx == MMU_USER_IDX) {
1374 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
1375 bbe418f2 Jia Liu
            return;
1376 bbe418f2 Jia Liu
        }
1377 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_pc, dc->pc);
1378 bbe418f2 Jia Liu
        gen_exception(dc, EXCP_TRAP);
1379 bbe418f2 Jia Liu
#endif
1380 bbe418f2 Jia Liu
        break;
1381 bbe418f2 Jia Liu
1382 bbe418f2 Jia Liu
    case 0x300:    /* l.csync */
1383 bbe418f2 Jia Liu
        LOG_DIS("l.csync\n");
1384 bbe418f2 Jia Liu
#if defined(CONFIG_USER_ONLY)
1385 bbe418f2 Jia Liu
        return;
1386 bbe418f2 Jia Liu
#else
1387 bbe418f2 Jia Liu
        if (dc->mem_idx == MMU_USER_IDX) {
1388 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
1389 bbe418f2 Jia Liu
            return;
1390 bbe418f2 Jia Liu
        }
1391 bbe418f2 Jia Liu
#endif
1392 bbe418f2 Jia Liu
        break;
1393 bbe418f2 Jia Liu
1394 bbe418f2 Jia Liu
    case 0x200:    /* l.msync */
1395 bbe418f2 Jia Liu
        LOG_DIS("l.msync\n");
1396 bbe418f2 Jia Liu
#if defined(CONFIG_USER_ONLY)
1397 bbe418f2 Jia Liu
        return;
1398 bbe418f2 Jia Liu
#else
1399 bbe418f2 Jia Liu
        if (dc->mem_idx == MMU_USER_IDX) {
1400 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
1401 bbe418f2 Jia Liu
            return;
1402 bbe418f2 Jia Liu
        }
1403 bbe418f2 Jia Liu
#endif
1404 bbe418f2 Jia Liu
        break;
1405 bbe418f2 Jia Liu
1406 bbe418f2 Jia Liu
    case 0x270:    /* l.psync */
1407 bbe418f2 Jia Liu
        LOG_DIS("l.psync\n");
1408 bbe418f2 Jia Liu
#if defined(CONFIG_USER_ONLY)
1409 bbe418f2 Jia Liu
        return;
1410 bbe418f2 Jia Liu
#else
1411 bbe418f2 Jia Liu
        if (dc->mem_idx == MMU_USER_IDX) {
1412 bbe418f2 Jia Liu
            gen_illegal_exception(dc);
1413 bbe418f2 Jia Liu
            return;
1414 bbe418f2 Jia Liu
        }
1415 bbe418f2 Jia Liu
#endif
1416 bbe418f2 Jia Liu
        break;
1417 bbe418f2 Jia Liu
1418 bbe418f2 Jia Liu
    default:
1419 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1420 bbe418f2 Jia Liu
        break;
1421 bbe418f2 Jia Liu
    }
1422 bbe418f2 Jia Liu
}
1423 bbe418f2 Jia Liu
1424 bbe418f2 Jia Liu
static void dec_float(DisasContext *dc, uint32_t insn)
1425 bbe418f2 Jia Liu
{
1426 bbe418f2 Jia Liu
    uint32_t op0;
1427 bbe418f2 Jia Liu
    uint32_t ra, rb, rd;
1428 bbe418f2 Jia Liu
    op0 = extract32(insn, 0, 8);
1429 bbe418f2 Jia Liu
    ra = extract32(insn, 16, 5);
1430 bbe418f2 Jia Liu
    rb = extract32(insn, 11, 5);
1431 bbe418f2 Jia Liu
    rd = extract32(insn, 21, 5);
1432 bbe418f2 Jia Liu
1433 bbe418f2 Jia Liu
    switch (op0) {
1434 bbe418f2 Jia Liu
    case 0x00:    /* lf.add.s */
1435 bbe418f2 Jia Liu
        LOG_DIS("lf.add.s r%d, r%d, r%d\n", rd, ra, rb);
1436 bbe418f2 Jia Liu
        gen_helper_float_add_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1437 bbe418f2 Jia Liu
        break;
1438 bbe418f2 Jia Liu
1439 bbe418f2 Jia Liu
    case 0x01:    /* lf.sub.s */
1440 bbe418f2 Jia Liu
        LOG_DIS("lf.sub.s r%d, r%d, r%d\n", rd, ra, rb);
1441 bbe418f2 Jia Liu
        gen_helper_float_sub_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1442 bbe418f2 Jia Liu
        break;
1443 bbe418f2 Jia Liu
1444 bbe418f2 Jia Liu
1445 bbe418f2 Jia Liu
    case 0x02:    /* lf.mul.s */
1446 bbe418f2 Jia Liu
        LOG_DIS("lf.mul.s r%d, r%d, r%d\n", rd, ra, rb);
1447 bbe418f2 Jia Liu
        if (ra != 0 && rb != 0) {
1448 bbe418f2 Jia Liu
            gen_helper_float_mul_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1449 bbe418f2 Jia Liu
        } else {
1450 bbe418f2 Jia Liu
            tcg_gen_ori_tl(fpcsr, fpcsr, FPCSR_ZF);
1451 bbe418f2 Jia Liu
            tcg_gen_movi_i32(cpu_R[rd], 0x0);
1452 bbe418f2 Jia Liu
        }
1453 bbe418f2 Jia Liu
        break;
1454 bbe418f2 Jia Liu
1455 bbe418f2 Jia Liu
    case 0x03:    /* lf.div.s */
1456 bbe418f2 Jia Liu
        LOG_DIS("lf.div.s r%d, r%d, r%d\n", rd, ra, rb);
1457 bbe418f2 Jia Liu
        gen_helper_float_div_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1458 bbe418f2 Jia Liu
        break;
1459 bbe418f2 Jia Liu
1460 bbe418f2 Jia Liu
    case 0x04:    /* lf.itof.s */
1461 bbe418f2 Jia Liu
        LOG_DIS("lf.itof r%d, r%d\n", rd, ra);
1462 bbe418f2 Jia Liu
        gen_helper_itofs(cpu_R[rd], cpu_env, cpu_R[ra]);
1463 bbe418f2 Jia Liu
        break;
1464 bbe418f2 Jia Liu
1465 bbe418f2 Jia Liu
    case 0x05:    /* lf.ftoi.s */
1466 bbe418f2 Jia Liu
        LOG_DIS("lf.ftoi r%d, r%d\n", rd, ra);
1467 bbe418f2 Jia Liu
        gen_helper_ftois(cpu_R[rd], cpu_env, cpu_R[ra]);
1468 bbe418f2 Jia Liu
        break;
1469 bbe418f2 Jia Liu
1470 bbe418f2 Jia Liu
    case 0x06:    /* lf.rem.s */
1471 bbe418f2 Jia Liu
        LOG_DIS("lf.rem.s r%d, r%d, r%d\n", rd, ra, rb);
1472 bbe418f2 Jia Liu
        gen_helper_float_rem_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1473 bbe418f2 Jia Liu
        break;
1474 bbe418f2 Jia Liu
1475 bbe418f2 Jia Liu
    case 0x07:    /* lf.madd.s */
1476 bbe418f2 Jia Liu
        LOG_DIS("lf.madd.s r%d, r%d, r%d\n", rd, ra, rb);
1477 bbe418f2 Jia Liu
        gen_helper_float_muladd_s(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1478 bbe418f2 Jia Liu
        break;
1479 bbe418f2 Jia Liu
1480 bbe418f2 Jia Liu
    case 0x08:    /* lf.sfeq.s */
1481 bbe418f2 Jia Liu
        LOG_DIS("lf.sfeq.s r%d, r%d\n", ra, rb);
1482 bbe418f2 Jia Liu
        gen_helper_float_eq_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1483 bbe418f2 Jia Liu
        break;
1484 bbe418f2 Jia Liu
1485 bbe418f2 Jia Liu
    case 0x09:    /* lf.sfne.s */
1486 bbe418f2 Jia Liu
        LOG_DIS("lf.sfne.s r%d, r%d\n", ra, rb);
1487 bbe418f2 Jia Liu
        gen_helper_float_ne_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1488 bbe418f2 Jia Liu
        break;
1489 bbe418f2 Jia Liu
1490 bbe418f2 Jia Liu
    case 0x0a:    /* lf.sfgt.s */
1491 bbe418f2 Jia Liu
        LOG_DIS("lf.sfgt.s r%d, r%d\n", ra, rb);
1492 bbe418f2 Jia Liu
        gen_helper_float_gt_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1493 bbe418f2 Jia Liu
        break;
1494 bbe418f2 Jia Liu
1495 bbe418f2 Jia Liu
    case 0x0b:    /* lf.sfge.s */
1496 bbe418f2 Jia Liu
        LOG_DIS("lf.sfge.s r%d, r%d\n", ra, rb);
1497 bbe418f2 Jia Liu
        gen_helper_float_ge_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1498 bbe418f2 Jia Liu
        break;
1499 bbe418f2 Jia Liu
1500 bbe418f2 Jia Liu
    case 0x0c:    /* lf.sflt.s */
1501 bbe418f2 Jia Liu
        LOG_DIS("lf.sflt.s r%d, r%d\n", ra, rb);
1502 bbe418f2 Jia Liu
        gen_helper_float_lt_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1503 bbe418f2 Jia Liu
        break;
1504 bbe418f2 Jia Liu
1505 bbe418f2 Jia Liu
    case 0x0d:    /* lf.sfle.s */
1506 bbe418f2 Jia Liu
        LOG_DIS("lf.sfle.s r%d, r%d\n", ra, rb);
1507 bbe418f2 Jia Liu
        gen_helper_float_le_s(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1508 bbe418f2 Jia Liu
        break;
1509 bbe418f2 Jia Liu
1510 bbe418f2 Jia Liu
/* not used yet, open it when we need or64.  */
1511 bbe418f2 Jia Liu
/*#ifdef TARGET_OPENRISC64
1512 bbe418f2 Jia Liu
    case 0x10:     lf.add.d
1513 bbe418f2 Jia Liu
        LOG_DIS("lf.add.d r%d, r%d, r%d\n", rd, ra, rb);
1514 bbe418f2 Jia Liu
        check_of64s(dc);
1515 bbe418f2 Jia Liu
        gen_helper_float_add_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1516 bbe418f2 Jia Liu
        break;
1517 bbe418f2 Jia Liu

1518 bbe418f2 Jia Liu
    case 0x11:     lf.sub.d
1519 bbe418f2 Jia Liu
        LOG_DIS("lf.sub.d r%d, r%d, r%d\n", rd, ra, rb);
1520 bbe418f2 Jia Liu
        check_of64s(dc);
1521 bbe418f2 Jia Liu
        gen_helper_float_sub_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1522 bbe418f2 Jia Liu
        break;
1523 bbe418f2 Jia Liu

1524 bbe418f2 Jia Liu
    case 0x12:     lf.mul.d
1525 bbe418f2 Jia Liu
        LOG_DIS("lf.mul.d r%d, r%d, r%d\n", rd, ra, rb);
1526 bbe418f2 Jia Liu
        check_of64s(dc);
1527 bbe418f2 Jia Liu
        if (ra != 0 && rb != 0) {
1528 bbe418f2 Jia Liu
            gen_helper_float_mul_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1529 bbe418f2 Jia Liu
        } else {
1530 bbe418f2 Jia Liu
            tcg_gen_ori_tl(fpcsr, fpcsr, FPCSR_ZF);
1531 bbe418f2 Jia Liu
            tcg_gen_movi_i64(cpu_R[rd], 0x0);
1532 bbe418f2 Jia Liu
        }
1533 bbe418f2 Jia Liu
        break;
1534 bbe418f2 Jia Liu

1535 bbe418f2 Jia Liu
    case 0x13:     lf.div.d
1536 bbe418f2 Jia Liu
        LOG_DIS("lf.div.d r%d, r%d, r%d\n", rd, ra, rb);
1537 bbe418f2 Jia Liu
        check_of64s(dc);
1538 bbe418f2 Jia Liu
        gen_helper_float_div_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1539 bbe418f2 Jia Liu
        break;
1540 bbe418f2 Jia Liu

1541 bbe418f2 Jia Liu
    case 0x14:     lf.itof.d
1542 bbe418f2 Jia Liu
        LOG_DIS("lf.itof r%d, r%d\n", rd, ra);
1543 bbe418f2 Jia Liu
        check_of64s(dc);
1544 bbe418f2 Jia Liu
        gen_helper_itofd(cpu_R[rd], cpu_env, cpu_R[ra]);
1545 bbe418f2 Jia Liu
        break;
1546 bbe418f2 Jia Liu

1547 bbe418f2 Jia Liu
    case 0x15:     lf.ftoi.d
1548 bbe418f2 Jia Liu
        LOG_DIS("lf.ftoi r%d, r%d\n", rd, ra);
1549 bbe418f2 Jia Liu
        check_of64s(dc);
1550 bbe418f2 Jia Liu
        gen_helper_ftoid(cpu_R[rd], cpu_env, cpu_R[ra]);
1551 bbe418f2 Jia Liu
        break;
1552 bbe418f2 Jia Liu

1553 bbe418f2 Jia Liu
    case 0x16:     lf.rem.d
1554 bbe418f2 Jia Liu
        LOG_DIS("lf.rem.d r%d, r%d, r%d\n", rd, ra, rb);
1555 bbe418f2 Jia Liu
        check_of64s(dc);
1556 bbe418f2 Jia Liu
        gen_helper_float_rem_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1557 bbe418f2 Jia Liu
        break;
1558 bbe418f2 Jia Liu

1559 bbe418f2 Jia Liu
    case 0x17:     lf.madd.d
1560 bbe418f2 Jia Liu
        LOG_DIS("lf.madd.d r%d, r%d, r%d\n", rd, ra, rb);
1561 bbe418f2 Jia Liu
        check_of64s(dc);
1562 bbe418f2 Jia Liu
        gen_helper_float_muladd_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1563 bbe418f2 Jia Liu
        break;
1564 bbe418f2 Jia Liu

1565 bbe418f2 Jia Liu
    case 0x18:     lf.sfeq.d
1566 bbe418f2 Jia Liu
        LOG_DIS("lf.sfeq.d r%d, r%d\n", ra, rb);
1567 bbe418f2 Jia Liu
        check_of64s(dc);
1568 bbe418f2 Jia Liu
        gen_helper_float_eq_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1569 bbe418f2 Jia Liu
        break;
1570 bbe418f2 Jia Liu

1571 bbe418f2 Jia Liu
    case 0x1a:     lf.sfgt.d
1572 bbe418f2 Jia Liu
        LOG_DIS("lf.sfgt.d r%d, r%d\n", ra, rb);
1573 bbe418f2 Jia Liu
        check_of64s(dc);
1574 bbe418f2 Jia Liu
        gen_helper_float_gt_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1575 bbe418f2 Jia Liu
        break;
1576 bbe418f2 Jia Liu

1577 bbe418f2 Jia Liu
    case 0x1b:     lf.sfge.d
1578 bbe418f2 Jia Liu
        LOG_DIS("lf.sfge.d r%d, r%d\n", ra, rb);
1579 bbe418f2 Jia Liu
        check_of64s(dc);
1580 bbe418f2 Jia Liu
        gen_helper_float_ge_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1581 bbe418f2 Jia Liu
        break;
1582 bbe418f2 Jia Liu

1583 bbe418f2 Jia Liu
    case 0x19:     lf.sfne.d
1584 bbe418f2 Jia Liu
        LOG_DIS("lf.sfne.d r%d, r%d\n", ra, rb);
1585 bbe418f2 Jia Liu
        check_of64s(dc);
1586 bbe418f2 Jia Liu
        gen_helper_float_ne_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1587 bbe418f2 Jia Liu
        break;
1588 bbe418f2 Jia Liu

1589 bbe418f2 Jia Liu
    case 0x1c:     lf.sflt.d
1590 bbe418f2 Jia Liu
        LOG_DIS("lf.sflt.d r%d, r%d\n", ra, rb);
1591 bbe418f2 Jia Liu
        check_of64s(dc);
1592 bbe418f2 Jia Liu
        gen_helper_float_lt_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1593 bbe418f2 Jia Liu
        break;
1594 bbe418f2 Jia Liu

1595 bbe418f2 Jia Liu
    case 0x1d:     lf.sfle.d
1596 bbe418f2 Jia Liu
        LOG_DIS("lf.sfle.d r%d, r%d\n", ra, rb);
1597 bbe418f2 Jia Liu
        check_of64s(dc);
1598 bbe418f2 Jia Liu
        gen_helper_float_le_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1599 bbe418f2 Jia Liu
        break;
1600 bbe418f2 Jia Liu
#endif*/
1601 bbe418f2 Jia Liu
1602 bbe418f2 Jia Liu
    default:
1603 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
1604 bbe418f2 Jia Liu
        break;
1605 bbe418f2 Jia Liu
    }
1606 bbe418f2 Jia Liu
    wb_SR_F();
1607 bbe418f2 Jia Liu
}
1608 bbe418f2 Jia Liu
1609 bbe418f2 Jia Liu
static void disas_openrisc_insn(DisasContext *dc, OpenRISCCPU *cpu)
1610 bbe418f2 Jia Liu
{
1611 bbe418f2 Jia Liu
    uint32_t op0;
1612 bbe418f2 Jia Liu
    uint32_t insn;
1613 bbe418f2 Jia Liu
    insn = cpu_ldl_code(&cpu->env, dc->pc);
1614 bbe418f2 Jia Liu
    op0 = extract32(insn, 26, 6);
1615 bbe418f2 Jia Liu
1616 bbe418f2 Jia Liu
    switch (op0) {
1617 bbe418f2 Jia Liu
    case 0x06:
1618 bbe418f2 Jia Liu
        dec_M(dc, insn);
1619 bbe418f2 Jia Liu
        break;
1620 bbe418f2 Jia Liu
1621 bbe418f2 Jia Liu
    case 0x08:
1622 bbe418f2 Jia Liu
        dec_sys(dc, insn);
1623 bbe418f2 Jia Liu
        break;
1624 bbe418f2 Jia Liu
1625 bbe418f2 Jia Liu
    case 0x2e:
1626 bbe418f2 Jia Liu
        dec_logic(dc, insn);
1627 bbe418f2 Jia Liu
        break;
1628 bbe418f2 Jia Liu
1629 bbe418f2 Jia Liu
    case 0x2f:
1630 bbe418f2 Jia Liu
        dec_compi(dc, insn);
1631 bbe418f2 Jia Liu
        break;
1632 bbe418f2 Jia Liu
1633 bbe418f2 Jia Liu
    case 0x31:
1634 bbe418f2 Jia Liu
        dec_mac(dc, insn);
1635 bbe418f2 Jia Liu
        break;
1636 bbe418f2 Jia Liu
1637 bbe418f2 Jia Liu
    case 0x32:
1638 bbe418f2 Jia Liu
        dec_float(dc, insn);
1639 bbe418f2 Jia Liu
        break;
1640 bbe418f2 Jia Liu
1641 bbe418f2 Jia Liu
    case 0x38:
1642 bbe418f2 Jia Liu
        dec_calc(dc, insn);
1643 bbe418f2 Jia Liu
        break;
1644 bbe418f2 Jia Liu
1645 bbe418f2 Jia Liu
    case 0x39:
1646 bbe418f2 Jia Liu
        dec_comp(dc, insn);
1647 bbe418f2 Jia Liu
        break;
1648 bbe418f2 Jia Liu
1649 bbe418f2 Jia Liu
    default:
1650 bbe418f2 Jia Liu
        dec_misc(dc, insn);
1651 bbe418f2 Jia Liu
        break;
1652 bbe418f2 Jia Liu
    }
1653 bbe418f2 Jia Liu
}
1654 bbe418f2 Jia Liu
1655 bbe418f2 Jia Liu
static void check_breakpoint(OpenRISCCPU *cpu, DisasContext *dc)
1656 bbe418f2 Jia Liu
{
1657 bbe418f2 Jia Liu
    CPUBreakpoint *bp;
1658 bbe418f2 Jia Liu
1659 bbe418f2 Jia Liu
    if (unlikely(!QTAILQ_EMPTY(&cpu->env.breakpoints))) {
1660 bbe418f2 Jia Liu
        QTAILQ_FOREACH(bp, &cpu->env.breakpoints, entry) {
1661 bbe418f2 Jia Liu
            if (bp->pc == dc->pc) {
1662 bbe418f2 Jia Liu
                tcg_gen_movi_tl(cpu_pc, dc->pc);
1663 bbe418f2 Jia Liu
                gen_exception(dc, EXCP_DEBUG);
1664 bbe418f2 Jia Liu
                dc->is_jmp = DISAS_UPDATE;
1665 bbe418f2 Jia Liu
            }
1666 bbe418f2 Jia Liu
        }
1667 bbe418f2 Jia Liu
    }
1668 e67db06e Jia Liu
}
1669 e67db06e Jia Liu
1670 e67db06e Jia Liu
static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
1671 e67db06e Jia Liu
                                                  TranslationBlock *tb,
1672 e67db06e Jia Liu
                                                  int search_pc)
1673 e67db06e Jia Liu
{
1674 ed2803da Andreas Färber
    CPUState *cs = CPU(cpu);
1675 bbe418f2 Jia Liu
    struct DisasContext ctx, *dc = &ctx;
1676 bbe418f2 Jia Liu
    uint16_t *gen_opc_end;
1677 bbe418f2 Jia Liu
    uint32_t pc_start;
1678 bbe418f2 Jia Liu
    int j, k;
1679 bbe418f2 Jia Liu
    uint32_t next_page_start;
1680 bbe418f2 Jia Liu
    int num_insns;
1681 bbe418f2 Jia Liu
    int max_insns;
1682 bbe418f2 Jia Liu
1683 bbe418f2 Jia Liu
    pc_start = tb->pc;
1684 bbe418f2 Jia Liu
    dc->tb = tb;
1685 bbe418f2 Jia Liu
1686 92414b31 Evgeny Voevodin
    gen_opc_end = tcg_ctx.gen_opc_buf + OPC_MAX_SIZE;
1687 bbe418f2 Jia Liu
    dc->is_jmp = DISAS_NEXT;
1688 bbe418f2 Jia Liu
    dc->ppc = pc_start;
1689 bbe418f2 Jia Liu
    dc->pc = pc_start;
1690 bbe418f2 Jia Liu
    dc->flags = cpu->env.cpucfgr;
1691 bbe418f2 Jia Liu
    dc->mem_idx = cpu_mmu_index(&cpu->env);
1692 bbe418f2 Jia Liu
    dc->synced_flags = dc->tb_flags = tb->flags;
1693 bbe418f2 Jia Liu
    dc->delayed_branch = !!(dc->tb_flags & D_FLAG);
1694 ed2803da Andreas Färber
    dc->singlestep_enabled = cs->singlestep_enabled;
1695 bbe418f2 Jia Liu
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
1696 bbe418f2 Jia Liu
        qemu_log("-----------------------------------------\n");
1697 a0762859 Andreas Färber
        log_cpu_state(CPU(cpu), 0);
1698 bbe418f2 Jia Liu
    }
1699 bbe418f2 Jia Liu
1700 bbe418f2 Jia Liu
    next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
1701 bbe418f2 Jia Liu
    k = -1;
1702 bbe418f2 Jia Liu
    num_insns = 0;
1703 bbe418f2 Jia Liu
    max_insns = tb->cflags & CF_COUNT_MASK;
1704 bbe418f2 Jia Liu
1705 bbe418f2 Jia Liu
    if (max_insns == 0) {
1706 bbe418f2 Jia Liu
        max_insns = CF_COUNT_MASK;
1707 bbe418f2 Jia Liu
    }
1708 bbe418f2 Jia Liu
1709 806f352d Peter Maydell
    gen_tb_start();
1710 bbe418f2 Jia Liu
1711 bbe418f2 Jia Liu
    do {
1712 bbe418f2 Jia Liu
        check_breakpoint(cpu, dc);
1713 bbe418f2 Jia Liu
        if (search_pc) {
1714 92414b31 Evgeny Voevodin
            j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
1715 bbe418f2 Jia Liu
            if (k < j) {
1716 bbe418f2 Jia Liu
                k++;
1717 bbe418f2 Jia Liu
                while (k < j) {
1718 ab1103de Evgeny Voevodin
                    tcg_ctx.gen_opc_instr_start[k++] = 0;
1719 bbe418f2 Jia Liu
                }
1720 bbe418f2 Jia Liu
            }
1721 25983cad Evgeny Voevodin
            tcg_ctx.gen_opc_pc[k] = dc->pc;
1722 ab1103de Evgeny Voevodin
            tcg_ctx.gen_opc_instr_start[k] = 1;
1723 c9c99c22 Evgeny Voevodin
            tcg_ctx.gen_opc_icount[k] = num_insns;
1724 bbe418f2 Jia Liu
        }
1725 bbe418f2 Jia Liu
1726 fdefe51c Richard Henderson
        if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
1727 bbe418f2 Jia Liu
            tcg_gen_debug_insn_start(dc->pc);
1728 bbe418f2 Jia Liu
        }
1729 bbe418f2 Jia Liu
1730 bbe418f2 Jia Liu
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) {
1731 bbe418f2 Jia Liu
            gen_io_start();
1732 bbe418f2 Jia Liu
        }
1733 bbe418f2 Jia Liu
        dc->ppc = dc->pc - 4;
1734 bbe418f2 Jia Liu
        dc->npc = dc->pc + 4;
1735 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_ppc, dc->ppc);
1736 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_npc, dc->npc);
1737 bbe418f2 Jia Liu
        disas_openrisc_insn(dc, cpu);
1738 bbe418f2 Jia Liu
        dc->pc = dc->npc;
1739 bbe418f2 Jia Liu
        num_insns++;
1740 bbe418f2 Jia Liu
        /* delay slot */
1741 bbe418f2 Jia Liu
        if (dc->delayed_branch) {
1742 bbe418f2 Jia Liu
            dc->delayed_branch--;
1743 bbe418f2 Jia Liu
            if (!dc->delayed_branch) {
1744 bbe418f2 Jia Liu
                dc->tb_flags &= ~D_FLAG;
1745 bbe418f2 Jia Liu
                gen_sync_flags(dc);
1746 bbe418f2 Jia Liu
                tcg_gen_mov_tl(cpu_pc, jmp_pc);
1747 bbe418f2 Jia Liu
                tcg_gen_mov_tl(cpu_npc, jmp_pc);
1748 bbe418f2 Jia Liu
                tcg_gen_movi_tl(jmp_pc, 0);
1749 bbe418f2 Jia Liu
                tcg_gen_exit_tb(0);
1750 bbe418f2 Jia Liu
                dc->is_jmp = DISAS_JUMP;
1751 bbe418f2 Jia Liu
                break;
1752 bbe418f2 Jia Liu
            }
1753 bbe418f2 Jia Liu
        }
1754 bbe418f2 Jia Liu
    } while (!dc->is_jmp
1755 efd7f486 Evgeny Voevodin
             && tcg_ctx.gen_opc_ptr < gen_opc_end
1756 ed2803da Andreas Färber
             && !cs->singlestep_enabled
1757 bbe418f2 Jia Liu
             && !singlestep
1758 bbe418f2 Jia Liu
             && (dc->pc < next_page_start)
1759 bbe418f2 Jia Liu
             && num_insns < max_insns);
1760 bbe418f2 Jia Liu
1761 bbe418f2 Jia Liu
    if (tb->cflags & CF_LAST_IO) {
1762 bbe418f2 Jia Liu
        gen_io_end();
1763 bbe418f2 Jia Liu
    }
1764 bbe418f2 Jia Liu
    if (dc->is_jmp == DISAS_NEXT) {
1765 bbe418f2 Jia Liu
        dc->is_jmp = DISAS_UPDATE;
1766 bbe418f2 Jia Liu
        tcg_gen_movi_tl(cpu_pc, dc->pc);
1767 bbe418f2 Jia Liu
    }
1768 ed2803da Andreas Färber
    if (unlikely(cs->singlestep_enabled)) {
1769 bbe418f2 Jia Liu
        if (dc->is_jmp == DISAS_NEXT) {
1770 bbe418f2 Jia Liu
            tcg_gen_movi_tl(cpu_pc, dc->pc);
1771 bbe418f2 Jia Liu
        }
1772 bbe418f2 Jia Liu
        gen_exception(dc, EXCP_DEBUG);
1773 bbe418f2 Jia Liu
    } else {
1774 bbe418f2 Jia Liu
        switch (dc->is_jmp) {
1775 bbe418f2 Jia Liu
        case DISAS_NEXT:
1776 bbe418f2 Jia Liu
            gen_goto_tb(dc, 0, dc->pc);
1777 bbe418f2 Jia Liu
            break;
1778 bbe418f2 Jia Liu
        default:
1779 bbe418f2 Jia Liu
        case DISAS_JUMP:
1780 bbe418f2 Jia Liu
            break;
1781 bbe418f2 Jia Liu
        case DISAS_UPDATE:
1782 bbe418f2 Jia Liu
            /* indicate that the hash table must be used
1783 bbe418f2 Jia Liu
               to find the next TB */
1784 bbe418f2 Jia Liu
            tcg_gen_exit_tb(0);
1785 bbe418f2 Jia Liu
            break;
1786 bbe418f2 Jia Liu
        case DISAS_TB_JUMP:
1787 bbe418f2 Jia Liu
            /* nothing more to generate */
1788 bbe418f2 Jia Liu
            break;
1789 bbe418f2 Jia Liu
        }
1790 bbe418f2 Jia Liu
    }
1791 bbe418f2 Jia Liu
1792 806f352d Peter Maydell
    gen_tb_end(tb, num_insns);
1793 efd7f486 Evgeny Voevodin
    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
1794 bbe418f2 Jia Liu
    if (search_pc) {
1795 92414b31 Evgeny Voevodin
        j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
1796 bbe418f2 Jia Liu
        k++;
1797 bbe418f2 Jia Liu
        while (k <= j) {
1798 ab1103de Evgeny Voevodin
            tcg_ctx.gen_opc_instr_start[k++] = 0;
1799 bbe418f2 Jia Liu
        }
1800 bbe418f2 Jia Liu
    } else {
1801 bbe418f2 Jia Liu
        tb->size = dc->pc - pc_start;
1802 bbe418f2 Jia Liu
        tb->icount = num_insns;
1803 bbe418f2 Jia Liu
    }
1804 bbe418f2 Jia Liu
1805 bbe418f2 Jia Liu
#ifdef DEBUG_DISAS
1806 bbe418f2 Jia Liu
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
1807 bbe418f2 Jia Liu
        qemu_log("\n");
1808 f4359b9f Blue Swirl
        log_target_disas(&cpu->env, pc_start, dc->pc - pc_start, 0);
1809 bbe418f2 Jia Liu
        qemu_log("\nisize=%d osize=%td\n",
1810 92414b31 Evgeny Voevodin
            dc->pc - pc_start, tcg_ctx.gen_opc_ptr -
1811 92414b31 Evgeny Voevodin
            tcg_ctx.gen_opc_buf);
1812 bbe418f2 Jia Liu
    }
1813 bbe418f2 Jia Liu
#endif
1814 e67db06e Jia Liu
}
1815 e67db06e Jia Liu
1816 e67db06e Jia Liu
void gen_intermediate_code(CPUOpenRISCState *env, struct TranslationBlock *tb)
1817 e67db06e Jia Liu
{
1818 e67db06e Jia Liu
    gen_intermediate_code_internal(openrisc_env_get_cpu(env), tb, 0);
1819 e67db06e Jia Liu
}
1820 e67db06e Jia Liu
1821 e67db06e Jia Liu
void gen_intermediate_code_pc(CPUOpenRISCState *env,
1822 e67db06e Jia Liu
                              struct TranslationBlock *tb)
1823 e67db06e Jia Liu
{
1824 e67db06e Jia Liu
    gen_intermediate_code_internal(openrisc_env_get_cpu(env), tb, 1);
1825 e67db06e Jia Liu
}
1826 e67db06e Jia Liu
1827 878096ee Andreas Färber
void openrisc_cpu_dump_state(CPUState *cs, FILE *f,
1828 878096ee Andreas Färber
                             fprintf_function cpu_fprintf,
1829 878096ee Andreas Färber
                             int flags)
1830 e67db06e Jia Liu
{
1831 878096ee Andreas Färber
    OpenRISCCPU *cpu = OPENRISC_CPU(cs);
1832 878096ee Andreas Färber
    CPUOpenRISCState *env = &cpu->env;
1833 e67db06e Jia Liu
    int i;
1834 878096ee Andreas Färber
1835 e67db06e Jia Liu
    cpu_fprintf(f, "PC=%08x\n", env->pc);
1836 e67db06e Jia Liu
    for (i = 0; i < 32; ++i) {
1837 878096ee Andreas Färber
        cpu_fprintf(f, "R%02d=%08x%c", i, env->gpr[i],
1838 e67db06e Jia Liu
                    (i % 4) == 3 ? '\n' : ' ');
1839 e67db06e Jia Liu
    }
1840 e67db06e Jia Liu
}
1841 e67db06e Jia Liu
1842 e67db06e Jia Liu
void restore_state_to_opc(CPUOpenRISCState *env, TranslationBlock *tb,
1843 e67db06e Jia Liu
                          int pc_pos)
1844 e67db06e Jia Liu
{
1845 25983cad Evgeny Voevodin
    env->pc = tcg_ctx.gen_opc_pc[pc_pos];
1846 e67db06e Jia Liu
}