Statistics
| Branch: | Revision:

root / target-openrisc / translate.c @ bd039ce0

History | View | Annotate | Download (55.3 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
#define GEN_HELPER 2
114 bbe418f2 Jia Liu
#include "helper.h"
115 bbe418f2 Jia Liu
}
116 bbe418f2 Jia Liu
117 bbe418f2 Jia Liu
/* Writeback SR_F transaltion-space to execution-space.  */
118 bbe418f2 Jia Liu
static inline void wb_SR_F(void)
119 bbe418f2 Jia Liu
{
120 bbe418f2 Jia Liu
    int label;
121 bbe418f2 Jia Liu
122 bbe418f2 Jia Liu
    label = gen_new_label();
123 bbe418f2 Jia Liu
    tcg_gen_andi_tl(cpu_sr, cpu_sr, ~SR_F);
124 bbe418f2 Jia Liu
    tcg_gen_brcondi_tl(TCG_COND_EQ, env_btaken, 0, label);
125 bbe418f2 Jia Liu
    tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_F);
126 bbe418f2 Jia Liu
    gen_set_label(label);
127 bbe418f2 Jia Liu
}
128 bbe418f2 Jia Liu
129 bbe418f2 Jia Liu
static inline int zero_extend(unsigned int val, int width)
130 bbe418f2 Jia Liu
{
131 bbe418f2 Jia Liu
    return val & ((1 << width) - 1);
132 bbe418f2 Jia Liu
}
133 bbe418f2 Jia Liu
134 bbe418f2 Jia Liu
static inline int sign_extend(unsigned int val, int width)
135 bbe418f2 Jia Liu
{
136 bbe418f2 Jia Liu
    int sval;
137 bbe418f2 Jia Liu
138 bbe418f2 Jia Liu
    /* LSL */
139 bbe418f2 Jia Liu
    val <<= TARGET_LONG_BITS - width;
140 bbe418f2 Jia Liu
    sval = val;
141 bbe418f2 Jia Liu
    /* ASR.  */
142 bbe418f2 Jia Liu
    sval >>= TARGET_LONG_BITS - width;
143 bbe418f2 Jia Liu
    return sval;
144 bbe418f2 Jia Liu
}
145 bbe418f2 Jia Liu
146 bbe418f2 Jia Liu
static inline void gen_sync_flags(DisasContext *dc)
147 bbe418f2 Jia Liu
{
148 bbe418f2 Jia Liu
    /* Sync the tb dependent flag between translate and runtime.  */
149 bbe418f2 Jia Liu
    if (dc->tb_flags != dc->synced_flags) {
150 bbe418f2 Jia Liu
        tcg_gen_movi_tl(env_flags, dc->tb_flags);
151 bbe418f2 Jia Liu
        dc->synced_flags = dc->tb_flags;
152 bbe418f2 Jia Liu
    }
153 bbe418f2 Jia Liu
}
154 bbe418f2 Jia Liu
155 bbe418f2 Jia Liu
static void gen_exception(DisasContext *dc, unsigned int excp)
156 bbe418f2 Jia Liu
{
157 bbe418f2 Jia Liu
    TCGv_i32 tmp = tcg_const_i32(excp);
158 bbe418f2 Jia Liu
    gen_helper_exception(cpu_env, tmp);
159 bbe418f2 Jia Liu
    tcg_temp_free_i32(tmp);
160 bbe418f2 Jia Liu
}
161 bbe418f2 Jia Liu
162 bbe418f2 Jia Liu
static void gen_illegal_exception(DisasContext *dc)
163 bbe418f2 Jia Liu
{
164 bbe418f2 Jia Liu
    tcg_gen_movi_tl(cpu_pc, dc->pc);
165 bbe418f2 Jia Liu
    gen_exception(dc, EXCP_ILLEGAL);
166 bbe418f2 Jia Liu
    dc->is_jmp = DISAS_UPDATE;
167 bbe418f2 Jia Liu
}
168 bbe418f2 Jia Liu
169 bbe418f2 Jia Liu
/* not used yet, open it when we need or64.  */
170 bbe418f2 Jia Liu
/*#ifdef TARGET_OPENRISC64
171 bbe418f2 Jia Liu
static void check_ob64s(DisasContext *dc)
172 bbe418f2 Jia Liu
{
173 bbe418f2 Jia Liu
    if (!(dc->flags & CPUCFGR_OB64S)) {
174 bbe418f2 Jia Liu
        gen_illegal_exception(dc);
175 bbe418f2 Jia Liu
    }
176 bbe418f2 Jia Liu
}
177 bbe418f2 Jia Liu

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

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

1509 bbe418f2 Jia Liu
    case 0x11:     lf.sub.d
1510 bbe418f2 Jia Liu
        LOG_DIS("lf.sub.d r%d, r%d, r%d\n", rd, ra, rb);
1511 bbe418f2 Jia Liu
        check_of64s(dc);
1512 bbe418f2 Jia Liu
        gen_helper_float_sub_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1513 bbe418f2 Jia Liu
        break;
1514 bbe418f2 Jia Liu

1515 bbe418f2 Jia Liu
    case 0x12:     lf.mul.d
1516 bbe418f2 Jia Liu
        LOG_DIS("lf.mul.d r%d, r%d, r%d\n", rd, ra, rb);
1517 bbe418f2 Jia Liu
        check_of64s(dc);
1518 bbe418f2 Jia Liu
        if (ra != 0 && rb != 0) {
1519 bbe418f2 Jia Liu
            gen_helper_float_mul_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1520 bbe418f2 Jia Liu
        } else {
1521 bbe418f2 Jia Liu
            tcg_gen_ori_tl(fpcsr, fpcsr, FPCSR_ZF);
1522 bbe418f2 Jia Liu
            tcg_gen_movi_i64(cpu_R[rd], 0x0);
1523 bbe418f2 Jia Liu
        }
1524 bbe418f2 Jia Liu
        break;
1525 bbe418f2 Jia Liu

1526 bbe418f2 Jia Liu
    case 0x13:     lf.div.d
1527 bbe418f2 Jia Liu
        LOG_DIS("lf.div.d r%d, r%d, r%d\n", rd, ra, rb);
1528 bbe418f2 Jia Liu
        check_of64s(dc);
1529 bbe418f2 Jia Liu
        gen_helper_float_div_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1530 bbe418f2 Jia Liu
        break;
1531 bbe418f2 Jia Liu

1532 bbe418f2 Jia Liu
    case 0x14:     lf.itof.d
1533 bbe418f2 Jia Liu
        LOG_DIS("lf.itof r%d, r%d\n", rd, ra);
1534 bbe418f2 Jia Liu
        check_of64s(dc);
1535 bbe418f2 Jia Liu
        gen_helper_itofd(cpu_R[rd], cpu_env, cpu_R[ra]);
1536 bbe418f2 Jia Liu
        break;
1537 bbe418f2 Jia Liu

1538 bbe418f2 Jia Liu
    case 0x15:     lf.ftoi.d
1539 bbe418f2 Jia Liu
        LOG_DIS("lf.ftoi r%d, r%d\n", rd, ra);
1540 bbe418f2 Jia Liu
        check_of64s(dc);
1541 bbe418f2 Jia Liu
        gen_helper_ftoid(cpu_R[rd], cpu_env, cpu_R[ra]);
1542 bbe418f2 Jia Liu
        break;
1543 bbe418f2 Jia Liu

1544 bbe418f2 Jia Liu
    case 0x16:     lf.rem.d
1545 bbe418f2 Jia Liu
        LOG_DIS("lf.rem.d r%d, r%d, r%d\n", rd, ra, rb);
1546 bbe418f2 Jia Liu
        check_of64s(dc);
1547 bbe418f2 Jia Liu
        gen_helper_float_rem_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1548 bbe418f2 Jia Liu
        break;
1549 bbe418f2 Jia Liu

1550 bbe418f2 Jia Liu
    case 0x17:     lf.madd.d
1551 bbe418f2 Jia Liu
        LOG_DIS("lf.madd.d r%d, r%d, r%d\n", rd, ra, rb);
1552 bbe418f2 Jia Liu
        check_of64s(dc);
1553 bbe418f2 Jia Liu
        gen_helper_float_muladd_d(cpu_R[rd], cpu_env, cpu_R[ra], cpu_R[rb]);
1554 bbe418f2 Jia Liu
        break;
1555 bbe418f2 Jia Liu

1556 bbe418f2 Jia Liu
    case 0x18:     lf.sfeq.d
1557 bbe418f2 Jia Liu
        LOG_DIS("lf.sfeq.d r%d, r%d\n", ra, rb);
1558 bbe418f2 Jia Liu
        check_of64s(dc);
1559 bbe418f2 Jia Liu
        gen_helper_float_eq_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1560 bbe418f2 Jia Liu
        break;
1561 bbe418f2 Jia Liu

1562 bbe418f2 Jia Liu
    case 0x1a:     lf.sfgt.d
1563 bbe418f2 Jia Liu
        LOG_DIS("lf.sfgt.d r%d, r%d\n", ra, rb);
1564 bbe418f2 Jia Liu
        check_of64s(dc);
1565 bbe418f2 Jia Liu
        gen_helper_float_gt_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1566 bbe418f2 Jia Liu
        break;
1567 bbe418f2 Jia Liu

1568 bbe418f2 Jia Liu
    case 0x1b:     lf.sfge.d
1569 bbe418f2 Jia Liu
        LOG_DIS("lf.sfge.d r%d, r%d\n", ra, rb);
1570 bbe418f2 Jia Liu
        check_of64s(dc);
1571 bbe418f2 Jia Liu
        gen_helper_float_ge_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1572 bbe418f2 Jia Liu
        break;
1573 bbe418f2 Jia Liu

1574 bbe418f2 Jia Liu
    case 0x19:     lf.sfne.d
1575 bbe418f2 Jia Liu
        LOG_DIS("lf.sfne.d r%d, r%d\n", ra, rb);
1576 bbe418f2 Jia Liu
        check_of64s(dc);
1577 bbe418f2 Jia Liu
        gen_helper_float_ne_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1578 bbe418f2 Jia Liu
        break;
1579 bbe418f2 Jia Liu

1580 bbe418f2 Jia Liu
    case 0x1c:     lf.sflt.d
1581 bbe418f2 Jia Liu
        LOG_DIS("lf.sflt.d r%d, r%d\n", ra, rb);
1582 bbe418f2 Jia Liu
        check_of64s(dc);
1583 bbe418f2 Jia Liu
        gen_helper_float_lt_d(env_btaken, cpu_env, cpu_R[ra], cpu_R[rb]);
1584 bbe418f2 Jia Liu
        break;
1585 bbe418f2 Jia Liu

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