Statistics
| Branch: | Revision:

root / target-sh4 / translate.c @ 5cd8f621

History | View | Annotate | Download (62.2 kB)

1
/*
2
 *  SH4 translation
3
 *
4
 *  Copyright (c) 2005 Samuel Tardieu
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18
 */
19

    
20
#define DEBUG_DISAS
21
//#define SH4_SINGLE_STEP
22

    
23
#include "cpu.h"
24
#include "disas/disas.h"
25
#include "tcg-op.h"
26

    
27
#include "helper.h"
28
#define GEN_HELPER 1
29
#include "helper.h"
30

    
31
typedef struct DisasContext {
32
    struct TranslationBlock *tb;
33
    target_ulong pc;
34
    uint16_t opcode;
35
    uint32_t flags;
36
    int bstate;
37
    int memidx;
38
    uint32_t delayed_pc;
39
    int singlestep_enabled;
40
    uint32_t features;
41
    int has_movcal;
42
} DisasContext;
43

    
44
#if defined(CONFIG_USER_ONLY)
45
#define IS_USER(ctx) 1
46
#else
47
#define IS_USER(ctx) (!(ctx->flags & SR_MD))
48
#endif
49

    
50
enum {
51
    BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
52
                      * exception condition
53
                      */
54
    BS_STOP     = 1, /* We want to stop translation for any reason */
55
    BS_BRANCH   = 2, /* We reached a branch condition     */
56
    BS_EXCP     = 3, /* We reached an exception condition */
57
};
58

    
59
/* global register indexes */
60
static TCGv_ptr cpu_env;
61
static TCGv cpu_gregs[24];
62
static TCGv cpu_pc, cpu_sr, cpu_ssr, cpu_spc, cpu_gbr;
63
static TCGv cpu_vbr, cpu_sgr, cpu_dbr, cpu_mach, cpu_macl;
64
static TCGv cpu_pr, cpu_fpscr, cpu_fpul, cpu_ldst;
65
static TCGv cpu_fregs[32];
66

    
67
/* internal register indexes */
68
static TCGv cpu_flags, cpu_delayed_pc;
69

    
70
static uint32_t gen_opc_hflags[OPC_BUF_SIZE];
71

    
72
#include "exec/gen-icount.h"
73

    
74
void sh4_translate_init(void)
75
{
76
    int i;
77
    static int done_init = 0;
78
    static const char * const gregnames[24] = {
79
        "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
80
        "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
81
        "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
82
        "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
83
        "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
84
    };
85
    static const char * const fregnames[32] = {
86
         "FPR0_BANK0",  "FPR1_BANK0",  "FPR2_BANK0",  "FPR3_BANK0",
87
         "FPR4_BANK0",  "FPR5_BANK0",  "FPR6_BANK0",  "FPR7_BANK0",
88
         "FPR8_BANK0",  "FPR9_BANK0", "FPR10_BANK0", "FPR11_BANK0",
89
        "FPR12_BANK0", "FPR13_BANK0", "FPR14_BANK0", "FPR15_BANK0",
90
         "FPR0_BANK1",  "FPR1_BANK1",  "FPR2_BANK1",  "FPR3_BANK1",
91
         "FPR4_BANK1",  "FPR5_BANK1",  "FPR6_BANK1",  "FPR7_BANK1",
92
         "FPR8_BANK1",  "FPR9_BANK1", "FPR10_BANK1", "FPR11_BANK1",
93
        "FPR12_BANK1", "FPR13_BANK1", "FPR14_BANK1", "FPR15_BANK1",
94
    };
95

    
96
    if (done_init)
97
        return;
98

    
99
    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
100

    
101
    for (i = 0; i < 24; i++)
102
        cpu_gregs[i] = tcg_global_mem_new_i32(TCG_AREG0,
103
                                              offsetof(CPUSH4State, gregs[i]),
104
                                              gregnames[i]);
105

    
106
    cpu_pc = tcg_global_mem_new_i32(TCG_AREG0,
107
                                    offsetof(CPUSH4State, pc), "PC");
108
    cpu_sr = tcg_global_mem_new_i32(TCG_AREG0,
109
                                    offsetof(CPUSH4State, sr), "SR");
110
    cpu_ssr = tcg_global_mem_new_i32(TCG_AREG0,
111
                                     offsetof(CPUSH4State, ssr), "SSR");
112
    cpu_spc = tcg_global_mem_new_i32(TCG_AREG0,
113
                                     offsetof(CPUSH4State, spc), "SPC");
114
    cpu_gbr = tcg_global_mem_new_i32(TCG_AREG0,
115
                                     offsetof(CPUSH4State, gbr), "GBR");
116
    cpu_vbr = tcg_global_mem_new_i32(TCG_AREG0,
117
                                     offsetof(CPUSH4State, vbr), "VBR");
118
    cpu_sgr = tcg_global_mem_new_i32(TCG_AREG0,
119
                                     offsetof(CPUSH4State, sgr), "SGR");
120
    cpu_dbr = tcg_global_mem_new_i32(TCG_AREG0,
121
                                     offsetof(CPUSH4State, dbr), "DBR");
122
    cpu_mach = tcg_global_mem_new_i32(TCG_AREG0,
123
                                      offsetof(CPUSH4State, mach), "MACH");
124
    cpu_macl = tcg_global_mem_new_i32(TCG_AREG0,
125
                                      offsetof(CPUSH4State, macl), "MACL");
126
    cpu_pr = tcg_global_mem_new_i32(TCG_AREG0,
127
                                    offsetof(CPUSH4State, pr), "PR");
128
    cpu_fpscr = tcg_global_mem_new_i32(TCG_AREG0,
129
                                       offsetof(CPUSH4State, fpscr), "FPSCR");
130
    cpu_fpul = tcg_global_mem_new_i32(TCG_AREG0,
131
                                      offsetof(CPUSH4State, fpul), "FPUL");
132

    
133
    cpu_flags = tcg_global_mem_new_i32(TCG_AREG0,
134
                                       offsetof(CPUSH4State, flags), "_flags_");
135
    cpu_delayed_pc = tcg_global_mem_new_i32(TCG_AREG0,
136
                                            offsetof(CPUSH4State, delayed_pc),
137
                                            "_delayed_pc_");
138
    cpu_ldst = tcg_global_mem_new_i32(TCG_AREG0,
139
                                      offsetof(CPUSH4State, ldst), "_ldst_");
140

    
141
    for (i = 0; i < 32; i++)
142
        cpu_fregs[i] = tcg_global_mem_new_i32(TCG_AREG0,
143
                                              offsetof(CPUSH4State, fregs[i]),
144
                                              fregnames[i]);
145

    
146
    done_init = 1;
147
}
148

    
149
void superh_cpu_dump_state(CPUState *cs, FILE *f,
150
                           fprintf_function cpu_fprintf, int flags)
151
{
152
    SuperHCPU *cpu = SUPERH_CPU(cs);
153
    CPUSH4State *env = &cpu->env;
154
    int i;
155
    cpu_fprintf(f, "pc=0x%08x sr=0x%08x pr=0x%08x fpscr=0x%08x\n",
156
                env->pc, env->sr, env->pr, env->fpscr);
157
    cpu_fprintf(f, "spc=0x%08x ssr=0x%08x gbr=0x%08x vbr=0x%08x\n",
158
                env->spc, env->ssr, env->gbr, env->vbr);
159
    cpu_fprintf(f, "sgr=0x%08x dbr=0x%08x delayed_pc=0x%08x fpul=0x%08x\n",
160
                env->sgr, env->dbr, env->delayed_pc, env->fpul);
161
    for (i = 0; i < 24; i += 4) {
162
        cpu_fprintf(f, "r%d=0x%08x r%d=0x%08x r%d=0x%08x r%d=0x%08x\n",
163
                    i, env->gregs[i], i + 1, env->gregs[i + 1],
164
                    i + 2, env->gregs[i + 2], i + 3, env->gregs[i + 3]);
165
    }
166
    if (env->flags & DELAY_SLOT) {
167
        cpu_fprintf(f, "in delay slot (delayed_pc=0x%08x)\n",
168
                    env->delayed_pc);
169
    } else if (env->flags & DELAY_SLOT_CONDITIONAL) {
170
        cpu_fprintf(f, "in conditional delay slot (delayed_pc=0x%08x)\n",
171
                    env->delayed_pc);
172
    }
173
}
174

    
175
static void gen_goto_tb(DisasContext * ctx, int n, target_ulong dest)
176
{
177
    TranslationBlock *tb;
178
    tb = ctx->tb;
179

    
180
    if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
181
        !ctx->singlestep_enabled) {
182
        /* Use a direct jump if in same page and singlestep not enabled */
183
        tcg_gen_goto_tb(n);
184
        tcg_gen_movi_i32(cpu_pc, dest);
185
        tcg_gen_exit_tb((uintptr_t)tb + n);
186
    } else {
187
        tcg_gen_movi_i32(cpu_pc, dest);
188
        if (ctx->singlestep_enabled)
189
            gen_helper_debug(cpu_env);
190
        tcg_gen_exit_tb(0);
191
    }
192
}
193

    
194
static void gen_jump(DisasContext * ctx)
195
{
196
    if (ctx->delayed_pc == (uint32_t) - 1) {
197
        /* Target is not statically known, it comes necessarily from a
198
           delayed jump as immediate jump are conditinal jumps */
199
        tcg_gen_mov_i32(cpu_pc, cpu_delayed_pc);
200
        if (ctx->singlestep_enabled)
201
            gen_helper_debug(cpu_env);
202
        tcg_gen_exit_tb(0);
203
    } else {
204
        gen_goto_tb(ctx, 0, ctx->delayed_pc);
205
    }
206
}
207

    
208
static inline void gen_branch_slot(uint32_t delayed_pc, int t)
209
{
210
    TCGv sr;
211
    int label = gen_new_label();
212
    tcg_gen_movi_i32(cpu_delayed_pc, delayed_pc);
213
    sr = tcg_temp_new();
214
    tcg_gen_andi_i32(sr, cpu_sr, SR_T);
215
    tcg_gen_brcondi_i32(t ? TCG_COND_EQ:TCG_COND_NE, sr, 0, label);
216
    tcg_gen_ori_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
217
    gen_set_label(label);
218
}
219

    
220
/* Immediate conditional jump (bt or bf) */
221
static void gen_conditional_jump(DisasContext * ctx,
222
                                 target_ulong ift, target_ulong ifnott)
223
{
224
    int l1;
225
    TCGv sr;
226

    
227
    l1 = gen_new_label();
228
    sr = tcg_temp_new();
229
    tcg_gen_andi_i32(sr, cpu_sr, SR_T);
230
    tcg_gen_brcondi_i32(TCG_COND_NE, sr, 0, l1);
231
    gen_goto_tb(ctx, 0, ifnott);
232
    gen_set_label(l1);
233
    gen_goto_tb(ctx, 1, ift);
234
}
235

    
236
/* Delayed conditional jump (bt or bf) */
237
static void gen_delayed_conditional_jump(DisasContext * ctx)
238
{
239
    int l1;
240
    TCGv ds;
241

    
242
    l1 = gen_new_label();
243
    ds = tcg_temp_new();
244
    tcg_gen_andi_i32(ds, cpu_flags, DELAY_SLOT_TRUE);
245
    tcg_gen_brcondi_i32(TCG_COND_NE, ds, 0, l1);
246
    gen_goto_tb(ctx, 1, ctx->pc + 2);
247
    gen_set_label(l1);
248
    tcg_gen_andi_i32(cpu_flags, cpu_flags, ~DELAY_SLOT_TRUE);
249
    gen_jump(ctx);
250
}
251

    
252
static inline void gen_cmp(int cond, TCGv t0, TCGv t1)
253
{
254
    TCGv t;
255

    
256
    t = tcg_temp_new();
257
    tcg_gen_setcond_i32(cond, t, t1, t0);
258
    tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
259
    tcg_gen_or_i32(cpu_sr, cpu_sr, t);
260

    
261
    tcg_temp_free(t);
262
}
263

    
264
static inline void gen_cmp_imm(int cond, TCGv t0, int32_t imm)
265
{
266
    TCGv t;
267

    
268
    t = tcg_temp_new();
269
    tcg_gen_setcondi_i32(cond, t, t0, imm);
270
    tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
271
    tcg_gen_or_i32(cpu_sr, cpu_sr, t);
272

    
273
    tcg_temp_free(t);
274
}
275

    
276
static inline void gen_store_flags(uint32_t flags)
277
{
278
    tcg_gen_andi_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
279
    tcg_gen_ori_i32(cpu_flags, cpu_flags, flags);
280
}
281

    
282
static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1)
283
{
284
    TCGv tmp = tcg_temp_new();
285

    
286
    p0 &= 0x1f;
287
    p1 &= 0x1f;
288

    
289
    tcg_gen_andi_i32(tmp, t1, (1 << p1));
290
    tcg_gen_andi_i32(t0, t0, ~(1 << p0));
291
    if (p0 < p1)
292
        tcg_gen_shri_i32(tmp, tmp, p1 - p0);
293
    else if (p0 > p1)
294
        tcg_gen_shli_i32(tmp, tmp, p0 - p1);
295
    tcg_gen_or_i32(t0, t0, tmp);
296

    
297
    tcg_temp_free(tmp);
298
}
299

    
300
static inline void gen_load_fpr64(TCGv_i64 t, int reg)
301
{
302
    tcg_gen_concat_i32_i64(t, cpu_fregs[reg + 1], cpu_fregs[reg]);
303
}
304

    
305
static inline void gen_store_fpr64 (TCGv_i64 t, int reg)
306
{
307
    TCGv_i32 tmp = tcg_temp_new_i32();
308
    tcg_gen_trunc_i64_i32(tmp, t);
309
    tcg_gen_mov_i32(cpu_fregs[reg + 1], tmp);
310
    tcg_gen_shri_i64(t, t, 32);
311
    tcg_gen_trunc_i64_i32(tmp, t);
312
    tcg_gen_mov_i32(cpu_fregs[reg], tmp);
313
    tcg_temp_free_i32(tmp);
314
}
315

    
316
#define B3_0 (ctx->opcode & 0xf)
317
#define B6_4 ((ctx->opcode >> 4) & 0x7)
318
#define B7_4 ((ctx->opcode >> 4) & 0xf)
319
#define B7_0 (ctx->opcode & 0xff)
320
#define B7_0s ((int32_t) (int8_t) (ctx->opcode & 0xff))
321
#define B11_0s (ctx->opcode & 0x800 ? 0xfffff000 | (ctx->opcode & 0xfff) : \
322
  (ctx->opcode & 0xfff))
323
#define B11_8 ((ctx->opcode >> 8) & 0xf)
324
#define B15_12 ((ctx->opcode >> 12) & 0xf)
325

    
326
#define REG(x) ((x) < 8 && (ctx->flags & (SR_MD | SR_RB)) == (SR_MD | SR_RB) \
327
                ? (cpu_gregs[x + 16]) : (cpu_gregs[x]))
328

    
329
#define ALTREG(x) ((x) < 8 && (ctx->flags & (SR_MD | SR_RB)) != (SR_MD | SR_RB)\
330
                ? (cpu_gregs[x + 16]) : (cpu_gregs[x]))
331

    
332
#define FREG(x) (ctx->flags & FPSCR_FR ? (x) ^ 0x10 : (x))
333
#define XHACK(x) ((((x) & 1 ) << 4) | ((x) & 0xe))
334
#define XREG(x) (ctx->flags & FPSCR_FR ? XHACK(x) ^ 0x10 : XHACK(x))
335
#define DREG(x) FREG(x) /* Assumes lsb of (x) is always 0 */
336

    
337
#define CHECK_NOT_DELAY_SLOT \
338
  if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))     \
339
  {                                                           \
340
      tcg_gen_movi_i32(cpu_pc, ctx->pc);                      \
341
      gen_helper_raise_slot_illegal_instruction(cpu_env);     \
342
      ctx->bstate = BS_BRANCH;                                \
343
      return;                                                 \
344
  }
345

    
346
#define CHECK_PRIVILEGED                                        \
347
  if (IS_USER(ctx)) {                                           \
348
      tcg_gen_movi_i32(cpu_pc, ctx->pc);                        \
349
      if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \
350
          gen_helper_raise_slot_illegal_instruction(cpu_env);   \
351
      } else {                                                  \
352
          gen_helper_raise_illegal_instruction(cpu_env);        \
353
      }                                                         \
354
      ctx->bstate = BS_BRANCH;                                  \
355
      return;                                                   \
356
  }
357

    
358
#define CHECK_FPU_ENABLED                                       \
359
  if (ctx->flags & SR_FD) {                                     \
360
      tcg_gen_movi_i32(cpu_pc, ctx->pc);                        \
361
      if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \
362
          gen_helper_raise_slot_fpu_disable(cpu_env);           \
363
      } else {                                                  \
364
          gen_helper_raise_fpu_disable(cpu_env);                \
365
      }                                                         \
366
      ctx->bstate = BS_BRANCH;                                  \
367
      return;                                                   \
368
  }
369

    
370
static void _decode_opc(DisasContext * ctx)
371
{
372
    /* This code tries to make movcal emulation sufficiently
373
       accurate for Linux purposes.  This instruction writes
374
       memory, and prior to that, always allocates a cache line.
375
       It is used in two contexts:
376
       - in memcpy, where data is copied in blocks, the first write
377
       of to a block uses movca.l for performance.
378
       - in arch/sh/mm/cache-sh4.c, movcal.l + ocbi combination is used
379
       to flush the cache. Here, the data written by movcal.l is never
380
       written to memory, and the data written is just bogus.
381

382
       To simulate this, we simulate movcal.l, we store the value to memory,
383
       but we also remember the previous content. If we see ocbi, we check
384
       if movcal.l for that address was done previously. If so, the write should
385
       not have hit the memory, so we restore the previous content.
386
       When we see an instruction that is neither movca.l
387
       nor ocbi, the previous content is discarded.
388

389
       To optimize, we only try to flush stores when we're at the start of
390
       TB, or if we already saw movca.l in this TB and did not flush stores
391
       yet.  */
392
    if (ctx->has_movcal)
393
        {
394
          int opcode = ctx->opcode & 0xf0ff;
395
          if (opcode != 0x0093 /* ocbi */
396
              && opcode != 0x00c3 /* movca.l */)
397
              {
398
                  gen_helper_discard_movcal_backup(cpu_env);
399
                  ctx->has_movcal = 0;
400
              }
401
        }
402

    
403
#if 0
404
    fprintf(stderr, "Translating opcode 0x%04x\n", ctx->opcode);
405
#endif
406

    
407
    switch (ctx->opcode) {
408
    case 0x0019:                /* div0u */
409
        tcg_gen_andi_i32(cpu_sr, cpu_sr, ~(SR_M | SR_Q | SR_T));
410
        return;
411
    case 0x000b:                /* rts */
412
        CHECK_NOT_DELAY_SLOT
413
        tcg_gen_mov_i32(cpu_delayed_pc, cpu_pr);
414
        ctx->flags |= DELAY_SLOT;
415
        ctx->delayed_pc = (uint32_t) - 1;
416
        return;
417
    case 0x0028:                /* clrmac */
418
        tcg_gen_movi_i32(cpu_mach, 0);
419
        tcg_gen_movi_i32(cpu_macl, 0);
420
        return;
421
    case 0x0048:                /* clrs */
422
        tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_S);
423
        return;
424
    case 0x0008:                /* clrt */
425
        tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
426
        return;
427
    case 0x0038:                /* ldtlb */
428
        CHECK_PRIVILEGED
429
        gen_helper_ldtlb(cpu_env);
430
        return;
431
    case 0x002b:                /* rte */
432
        CHECK_PRIVILEGED
433
        CHECK_NOT_DELAY_SLOT
434
        tcg_gen_mov_i32(cpu_sr, cpu_ssr);
435
        tcg_gen_mov_i32(cpu_delayed_pc, cpu_spc);
436
        ctx->flags |= DELAY_SLOT;
437
        ctx->delayed_pc = (uint32_t) - 1;
438
        return;
439
    case 0x0058:                /* sets */
440
        tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_S);
441
        return;
442
    case 0x0018:                /* sett */
443
        tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T);
444
        return;
445
    case 0xfbfd:                /* frchg */
446
        tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_FR);
447
        ctx->bstate = BS_STOP;
448
        return;
449
    case 0xf3fd:                /* fschg */
450
        tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_SZ);
451
        ctx->bstate = BS_STOP;
452
        return;
453
    case 0x0009:                /* nop */
454
        return;
455
    case 0x001b:                /* sleep */
456
        CHECK_PRIVILEGED
457
        tcg_gen_movi_i32(cpu_pc, ctx->pc + 2);
458
        gen_helper_sleep(cpu_env);
459
        return;
460
    }
461

    
462
    switch (ctx->opcode & 0xf000) {
463
    case 0x1000:                /* mov.l Rm,@(disp,Rn) */
464
        {
465
            TCGv addr = tcg_temp_new();
466
            tcg_gen_addi_i32(addr, REG(B11_8), B3_0 * 4);
467
            tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
468
            tcg_temp_free(addr);
469
        }
470
        return;
471
    case 0x5000:                /* mov.l @(disp,Rm),Rn */
472
        {
473
            TCGv addr = tcg_temp_new();
474
            tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 4);
475
            tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
476
            tcg_temp_free(addr);
477
        }
478
        return;
479
    case 0xe000:                /* mov #imm,Rn */
480
        tcg_gen_movi_i32(REG(B11_8), B7_0s);
481
        return;
482
    case 0x9000:                /* mov.w @(disp,PC),Rn */
483
        {
484
            TCGv addr = tcg_const_i32(ctx->pc + 4 + B7_0 * 2);
485
            tcg_gen_qemu_ld16s(REG(B11_8), addr, ctx->memidx);
486
            tcg_temp_free(addr);
487
        }
488
        return;
489
    case 0xd000:                /* mov.l @(disp,PC),Rn */
490
        {
491
            TCGv addr = tcg_const_i32((ctx->pc + 4 + B7_0 * 4) & ~3);
492
            tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
493
            tcg_temp_free(addr);
494
        }
495
        return;
496
    case 0x7000:                /* add #imm,Rn */
497
        tcg_gen_addi_i32(REG(B11_8), REG(B11_8), B7_0s);
498
        return;
499
    case 0xa000:                /* bra disp */
500
        CHECK_NOT_DELAY_SLOT
501
        ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
502
        tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
503
        ctx->flags |= DELAY_SLOT;
504
        return;
505
    case 0xb000:                /* bsr disp */
506
        CHECK_NOT_DELAY_SLOT
507
        tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
508
        ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
509
        tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
510
        ctx->flags |= DELAY_SLOT;
511
        return;
512
    }
513

    
514
    switch (ctx->opcode & 0xf00f) {
515
    case 0x6003:                /* mov Rm,Rn */
516
        tcg_gen_mov_i32(REG(B11_8), REG(B7_4));
517
        return;
518
    case 0x2000:                /* mov.b Rm,@Rn */
519
        tcg_gen_qemu_st8(REG(B7_4), REG(B11_8), ctx->memidx);
520
        return;
521
    case 0x2001:                /* mov.w Rm,@Rn */
522
        tcg_gen_qemu_st16(REG(B7_4), REG(B11_8), ctx->memidx);
523
        return;
524
    case 0x2002:                /* mov.l Rm,@Rn */
525
        tcg_gen_qemu_st32(REG(B7_4), REG(B11_8), ctx->memidx);
526
        return;
527
    case 0x6000:                /* mov.b @Rm,Rn */
528
        tcg_gen_qemu_ld8s(REG(B11_8), REG(B7_4), ctx->memidx);
529
        return;
530
    case 0x6001:                /* mov.w @Rm,Rn */
531
        tcg_gen_qemu_ld16s(REG(B11_8), REG(B7_4), ctx->memidx);
532
        return;
533
    case 0x6002:                /* mov.l @Rm,Rn */
534
        tcg_gen_qemu_ld32s(REG(B11_8), REG(B7_4), ctx->memidx);
535
        return;
536
    case 0x2004:                /* mov.b Rm,@-Rn */
537
        {
538
            TCGv addr = tcg_temp_new();
539
            tcg_gen_subi_i32(addr, REG(B11_8), 1);
540
            tcg_gen_qemu_st8(REG(B7_4), addr, ctx->memidx);        /* might cause re-execution */
541
            tcg_gen_mov_i32(REG(B11_8), addr);                        /* modify register status */
542
            tcg_temp_free(addr);
543
        }
544
        return;
545
    case 0x2005:                /* mov.w Rm,@-Rn */
546
        {
547
            TCGv addr = tcg_temp_new();
548
            tcg_gen_subi_i32(addr, REG(B11_8), 2);
549
            tcg_gen_qemu_st16(REG(B7_4), addr, ctx->memidx);
550
            tcg_gen_mov_i32(REG(B11_8), addr);
551
            tcg_temp_free(addr);
552
        }
553
        return;
554
    case 0x2006:                /* mov.l Rm,@-Rn */
555
        {
556
            TCGv addr = tcg_temp_new();
557
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
558
            tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
559
            tcg_gen_mov_i32(REG(B11_8), addr);
560
        }
561
        return;
562
    case 0x6004:                /* mov.b @Rm+,Rn */
563
        tcg_gen_qemu_ld8s(REG(B11_8), REG(B7_4), ctx->memidx);
564
        if ( B11_8 != B7_4 )
565
                tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 1);
566
        return;
567
    case 0x6005:                /* mov.w @Rm+,Rn */
568
        tcg_gen_qemu_ld16s(REG(B11_8), REG(B7_4), ctx->memidx);
569
        if ( B11_8 != B7_4 )
570
                tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
571
        return;
572
    case 0x6006:                /* mov.l @Rm+,Rn */
573
        tcg_gen_qemu_ld32s(REG(B11_8), REG(B7_4), ctx->memidx);
574
        if ( B11_8 != B7_4 )
575
                tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
576
        return;
577
    case 0x0004:                /* mov.b Rm,@(R0,Rn) */
578
        {
579
            TCGv addr = tcg_temp_new();
580
            tcg_gen_add_i32(addr, REG(B11_8), REG(0));
581
            tcg_gen_qemu_st8(REG(B7_4), addr, ctx->memidx);
582
            tcg_temp_free(addr);
583
        }
584
        return;
585
    case 0x0005:                /* mov.w Rm,@(R0,Rn) */
586
        {
587
            TCGv addr = tcg_temp_new();
588
            tcg_gen_add_i32(addr, REG(B11_8), REG(0));
589
            tcg_gen_qemu_st16(REG(B7_4), addr, ctx->memidx);
590
            tcg_temp_free(addr);
591
        }
592
        return;
593
    case 0x0006:                /* mov.l Rm,@(R0,Rn) */
594
        {
595
            TCGv addr = tcg_temp_new();
596
            tcg_gen_add_i32(addr, REG(B11_8), REG(0));
597
            tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
598
            tcg_temp_free(addr);
599
        }
600
        return;
601
    case 0x000c:                /* mov.b @(R0,Rm),Rn */
602
        {
603
            TCGv addr = tcg_temp_new();
604
            tcg_gen_add_i32(addr, REG(B7_4), REG(0));
605
            tcg_gen_qemu_ld8s(REG(B11_8), addr, ctx->memidx);
606
            tcg_temp_free(addr);
607
        }
608
        return;
609
    case 0x000d:                /* mov.w @(R0,Rm),Rn */
610
        {
611
            TCGv addr = tcg_temp_new();
612
            tcg_gen_add_i32(addr, REG(B7_4), REG(0));
613
            tcg_gen_qemu_ld16s(REG(B11_8), addr, ctx->memidx);
614
            tcg_temp_free(addr);
615
        }
616
        return;
617
    case 0x000e:                /* mov.l @(R0,Rm),Rn */
618
        {
619
            TCGv addr = tcg_temp_new();
620
            tcg_gen_add_i32(addr, REG(B7_4), REG(0));
621
            tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
622
            tcg_temp_free(addr);
623
        }
624
        return;
625
    case 0x6008:                /* swap.b Rm,Rn */
626
        {
627
            TCGv high, low;
628
            high = tcg_temp_new();
629
            tcg_gen_andi_i32(high, REG(B7_4), 0xffff0000);
630
            low = tcg_temp_new();
631
            tcg_gen_ext16u_i32(low, REG(B7_4));
632
            tcg_gen_bswap16_i32(low, low);
633
            tcg_gen_or_i32(REG(B11_8), high, low);
634
            tcg_temp_free(low);
635
            tcg_temp_free(high);
636
        }
637
        return;
638
    case 0x6009:                /* swap.w Rm,Rn */
639
        tcg_gen_rotli_i32(REG(B11_8), REG(B7_4), 16);
640
        return;
641
    case 0x200d:                /* xtrct Rm,Rn */
642
        {
643
            TCGv high, low;
644
            high = tcg_temp_new();
645
            tcg_gen_shli_i32(high, REG(B7_4), 16);
646
            low = tcg_temp_new();
647
            tcg_gen_shri_i32(low, REG(B11_8), 16);
648
            tcg_gen_or_i32(REG(B11_8), high, low);
649
            tcg_temp_free(low);
650
            tcg_temp_free(high);
651
        }
652
        return;
653
    case 0x300c:                /* add Rm,Rn */
654
        tcg_gen_add_i32(REG(B11_8), REG(B11_8), REG(B7_4));
655
        return;
656
    case 0x300e:                /* addc Rm,Rn */
657
        {
658
            TCGv t0, t1, t2;
659
            t0 = tcg_temp_new();
660
            tcg_gen_andi_i32(t0, cpu_sr, SR_T);
661
            t1 = tcg_temp_new();
662
            tcg_gen_add_i32(t1, REG(B7_4), REG(B11_8));
663
            tcg_gen_add_i32(t0, t0, t1);
664
            t2 = tcg_temp_new();
665
            tcg_gen_setcond_i32(TCG_COND_GTU, t2, REG(B11_8), t1);
666
            tcg_gen_setcond_i32(TCG_COND_GTU, t1, t1, t0);
667
            tcg_gen_or_i32(t1, t1, t2);
668
            tcg_temp_free(t2);
669
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
670
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
671
            tcg_temp_free(t1);
672
            tcg_gen_mov_i32(REG(B11_8), t0);
673
            tcg_temp_free(t0);
674
        }
675
        return;
676
    case 0x300f:                /* addv Rm,Rn */
677
        {
678
            TCGv t0, t1, t2;
679
            t0 = tcg_temp_new();
680
            tcg_gen_add_i32(t0, REG(B7_4), REG(B11_8));
681
            t1 = tcg_temp_new();
682
            tcg_gen_xor_i32(t1, t0, REG(B11_8));
683
            t2 = tcg_temp_new();
684
            tcg_gen_xor_i32(t2, REG(B7_4), REG(B11_8));
685
            tcg_gen_andc_i32(t1, t1, t2);
686
            tcg_temp_free(t2);
687
            tcg_gen_shri_i32(t1, t1, 31);
688
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
689
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
690
            tcg_temp_free(t1);
691
            tcg_gen_mov_i32(REG(B7_4), t0);
692
            tcg_temp_free(t0);
693
        }
694
        return;
695
    case 0x2009:                /* and Rm,Rn */
696
        tcg_gen_and_i32(REG(B11_8), REG(B11_8), REG(B7_4));
697
        return;
698
    case 0x3000:                /* cmp/eq Rm,Rn */
699
        gen_cmp(TCG_COND_EQ, REG(B7_4), REG(B11_8));
700
        return;
701
    case 0x3003:                /* cmp/ge Rm,Rn */
702
        gen_cmp(TCG_COND_GE, REG(B7_4), REG(B11_8));
703
        return;
704
    case 0x3007:                /* cmp/gt Rm,Rn */
705
        gen_cmp(TCG_COND_GT, REG(B7_4), REG(B11_8));
706
        return;
707
    case 0x3006:                /* cmp/hi Rm,Rn */
708
        gen_cmp(TCG_COND_GTU, REG(B7_4), REG(B11_8));
709
        return;
710
    case 0x3002:                /* cmp/hs Rm,Rn */
711
        gen_cmp(TCG_COND_GEU, REG(B7_4), REG(B11_8));
712
        return;
713
    case 0x200c:                /* cmp/str Rm,Rn */
714
        {
715
            TCGv cmp1 = tcg_temp_new();
716
            TCGv cmp2 = tcg_temp_new();
717
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
718
            tcg_gen_xor_i32(cmp1, REG(B7_4), REG(B11_8));
719
            tcg_gen_andi_i32(cmp2, cmp1, 0xff000000);
720
            tcg_gen_setcondi_i32(TCG_COND_EQ, cmp2, cmp2, 0);
721
            tcg_gen_or_i32(cpu_sr, cpu_sr, cmp2);
722
            tcg_gen_andi_i32(cmp2, cmp1, 0x00ff0000);
723
            tcg_gen_setcondi_i32(TCG_COND_EQ, cmp2, cmp2, 0);
724
            tcg_gen_or_i32(cpu_sr, cpu_sr, cmp2);
725
            tcg_gen_andi_i32(cmp2, cmp1, 0x0000ff00);
726
            tcg_gen_setcondi_i32(TCG_COND_EQ, cmp2, cmp2, 0);
727
            tcg_gen_or_i32(cpu_sr, cpu_sr, cmp2);
728
            tcg_gen_andi_i32(cmp2, cmp1, 0x000000ff);
729
            tcg_gen_setcondi_i32(TCG_COND_EQ, cmp2, cmp2, 0);
730
            tcg_gen_or_i32(cpu_sr, cpu_sr, cmp2);
731
            tcg_temp_free(cmp2);
732
            tcg_temp_free(cmp1);
733
        }
734
        return;
735
    case 0x2007:                /* div0s Rm,Rn */
736
        {
737
            gen_copy_bit_i32(cpu_sr, 8, REG(B11_8), 31);        /* SR_Q */
738
            gen_copy_bit_i32(cpu_sr, 9, REG(B7_4), 31);                /* SR_M */
739
            TCGv val = tcg_temp_new();
740
            tcg_gen_xor_i32(val, REG(B7_4), REG(B11_8));
741
            gen_copy_bit_i32(cpu_sr, 0, val, 31);                /* SR_T */
742
            tcg_temp_free(val);
743
        }
744
        return;
745
    case 0x3004:                /* div1 Rm,Rn */
746
        gen_helper_div1(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8));
747
        return;
748
    case 0x300d:                /* dmuls.l Rm,Rn */
749
        tcg_gen_muls2_i32(cpu_macl, cpu_mach, REG(B7_4), REG(B11_8));
750
        return;
751
    case 0x3005:                /* dmulu.l Rm,Rn */
752
        tcg_gen_mulu2_i32(cpu_macl, cpu_mach, REG(B7_4), REG(B11_8));
753
        return;
754
    case 0x600e:                /* exts.b Rm,Rn */
755
        tcg_gen_ext8s_i32(REG(B11_8), REG(B7_4));
756
        return;
757
    case 0x600f:                /* exts.w Rm,Rn */
758
        tcg_gen_ext16s_i32(REG(B11_8), REG(B7_4));
759
        return;
760
    case 0x600c:                /* extu.b Rm,Rn */
761
        tcg_gen_ext8u_i32(REG(B11_8), REG(B7_4));
762
        return;
763
    case 0x600d:                /* extu.w Rm,Rn */
764
        tcg_gen_ext16u_i32(REG(B11_8), REG(B7_4));
765
        return;
766
    case 0x000f:                /* mac.l @Rm+,@Rn+ */
767
        {
768
            TCGv arg0, arg1;
769
            arg0 = tcg_temp_new();
770
            tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx);
771
            arg1 = tcg_temp_new();
772
            tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx);
773
            gen_helper_macl(cpu_env, arg0, arg1);
774
            tcg_temp_free(arg1);
775
            tcg_temp_free(arg0);
776
            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
777
            tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
778
        }
779
        return;
780
    case 0x400f:                /* mac.w @Rm+,@Rn+ */
781
        {
782
            TCGv arg0, arg1;
783
            arg0 = tcg_temp_new();
784
            tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx);
785
            arg1 = tcg_temp_new();
786
            tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx);
787
            gen_helper_macw(cpu_env, arg0, arg1);
788
            tcg_temp_free(arg1);
789
            tcg_temp_free(arg0);
790
            tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
791
            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
792
        }
793
        return;
794
    case 0x0007:                /* mul.l Rm,Rn */
795
        tcg_gen_mul_i32(cpu_macl, REG(B7_4), REG(B11_8));
796
        return;
797
    case 0x200f:                /* muls.w Rm,Rn */
798
        {
799
            TCGv arg0, arg1;
800
            arg0 = tcg_temp_new();
801
            tcg_gen_ext16s_i32(arg0, REG(B7_4));
802
            arg1 = tcg_temp_new();
803
            tcg_gen_ext16s_i32(arg1, REG(B11_8));
804
            tcg_gen_mul_i32(cpu_macl, arg0, arg1);
805
            tcg_temp_free(arg1);
806
            tcg_temp_free(arg0);
807
        }
808
        return;
809
    case 0x200e:                /* mulu.w Rm,Rn */
810
        {
811
            TCGv arg0, arg1;
812
            arg0 = tcg_temp_new();
813
            tcg_gen_ext16u_i32(arg0, REG(B7_4));
814
            arg1 = tcg_temp_new();
815
            tcg_gen_ext16u_i32(arg1, REG(B11_8));
816
            tcg_gen_mul_i32(cpu_macl, arg0, arg1);
817
            tcg_temp_free(arg1);
818
            tcg_temp_free(arg0);
819
        }
820
        return;
821
    case 0x600b:                /* neg Rm,Rn */
822
        tcg_gen_neg_i32(REG(B11_8), REG(B7_4));
823
        return;
824
    case 0x600a:                /* negc Rm,Rn */
825
        {
826
            TCGv t0, t1;
827
            t0 = tcg_temp_new();
828
            tcg_gen_neg_i32(t0, REG(B7_4));
829
            t1 = tcg_temp_new();
830
            tcg_gen_andi_i32(t1, cpu_sr, SR_T);
831
            tcg_gen_sub_i32(REG(B11_8), t0, t1);
832
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
833
            tcg_gen_setcondi_i32(TCG_COND_GTU, t1, t0, 0);
834
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
835
            tcg_gen_setcond_i32(TCG_COND_GTU, t1, REG(B11_8), t0);
836
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
837
            tcg_temp_free(t0);
838
            tcg_temp_free(t1);
839
        }
840
        return;
841
    case 0x6007:                /* not Rm,Rn */
842
        tcg_gen_not_i32(REG(B11_8), REG(B7_4));
843
        return;
844
    case 0x200b:                /* or Rm,Rn */
845
        tcg_gen_or_i32(REG(B11_8), REG(B11_8), REG(B7_4));
846
        return;
847
    case 0x400c:                /* shad Rm,Rn */
848
        {
849
            int label1 = gen_new_label();
850
            int label2 = gen_new_label();
851
            int label3 = gen_new_label();
852
            int label4 = gen_new_label();
853
            TCGv shift;
854
            tcg_gen_brcondi_i32(TCG_COND_LT, REG(B7_4), 0, label1);
855
            /* Rm positive, shift to the left */
856
            shift = tcg_temp_new();
857
            tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
858
            tcg_gen_shl_i32(REG(B11_8), REG(B11_8), shift);
859
            tcg_temp_free(shift);
860
            tcg_gen_br(label4);
861
            /* Rm negative, shift to the right */
862
            gen_set_label(label1);
863
            shift = tcg_temp_new();
864
            tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
865
            tcg_gen_brcondi_i32(TCG_COND_EQ, shift, 0, label2);
866
            tcg_gen_not_i32(shift, REG(B7_4));
867
            tcg_gen_andi_i32(shift, shift, 0x1f);
868
            tcg_gen_addi_i32(shift, shift, 1);
869
            tcg_gen_sar_i32(REG(B11_8), REG(B11_8), shift);
870
            tcg_temp_free(shift);
871
            tcg_gen_br(label4);
872
            /* Rm = -32 */
873
            gen_set_label(label2);
874
            tcg_gen_brcondi_i32(TCG_COND_LT, REG(B11_8), 0, label3);
875
            tcg_gen_movi_i32(REG(B11_8), 0);
876
            tcg_gen_br(label4);
877
            gen_set_label(label3);
878
            tcg_gen_movi_i32(REG(B11_8), 0xffffffff);
879
            gen_set_label(label4);
880
        }
881
        return;
882
    case 0x400d:                /* shld Rm,Rn */
883
        {
884
            int label1 = gen_new_label();
885
            int label2 = gen_new_label();
886
            int label3 = gen_new_label();
887
            TCGv shift;
888
            tcg_gen_brcondi_i32(TCG_COND_LT, REG(B7_4), 0, label1);
889
            /* Rm positive, shift to the left */
890
            shift = tcg_temp_new();
891
            tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
892
            tcg_gen_shl_i32(REG(B11_8), REG(B11_8), shift);
893
            tcg_temp_free(shift);
894
            tcg_gen_br(label3);
895
            /* Rm negative, shift to the right */
896
            gen_set_label(label1);
897
            shift = tcg_temp_new();
898
            tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
899
            tcg_gen_brcondi_i32(TCG_COND_EQ, shift, 0, label2);
900
            tcg_gen_not_i32(shift, REG(B7_4));
901
            tcg_gen_andi_i32(shift, shift, 0x1f);
902
            tcg_gen_addi_i32(shift, shift, 1);
903
            tcg_gen_shr_i32(REG(B11_8), REG(B11_8), shift);
904
            tcg_temp_free(shift);
905
            tcg_gen_br(label3);
906
            /* Rm = -32 */
907
            gen_set_label(label2);
908
            tcg_gen_movi_i32(REG(B11_8), 0);
909
            gen_set_label(label3);
910
        }
911
        return;
912
    case 0x3008:                /* sub Rm,Rn */
913
        tcg_gen_sub_i32(REG(B11_8), REG(B11_8), REG(B7_4));
914
        return;
915
    case 0x300a:                /* subc Rm,Rn */
916
        {
917
            TCGv t0, t1, t2;
918
            t0 = tcg_temp_new();
919
            tcg_gen_andi_i32(t0, cpu_sr, SR_T);
920
            t1 = tcg_temp_new();
921
            tcg_gen_sub_i32(t1, REG(B11_8), REG(B7_4));
922
            tcg_gen_sub_i32(t0, t1, t0);
923
            t2 = tcg_temp_new();
924
            tcg_gen_setcond_i32(TCG_COND_LTU, t2, REG(B11_8), t1);
925
            tcg_gen_setcond_i32(TCG_COND_LTU, t1, t1, t0);
926
            tcg_gen_or_i32(t1, t1, t2);
927
            tcg_temp_free(t2);
928
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
929
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
930
            tcg_temp_free(t1);
931
            tcg_gen_mov_i32(REG(B11_8), t0);
932
            tcg_temp_free(t0);
933
        }
934
        return;
935
    case 0x300b:                /* subv Rm,Rn */
936
        {
937
            TCGv t0, t1, t2;
938
            t0 = tcg_temp_new();
939
            tcg_gen_sub_i32(t0, REG(B11_8), REG(B7_4));
940
            t1 = tcg_temp_new();
941
            tcg_gen_xor_i32(t1, t0, REG(B7_4));
942
            t2 = tcg_temp_new();
943
            tcg_gen_xor_i32(t2, REG(B11_8), REG(B7_4));
944
            tcg_gen_and_i32(t1, t1, t2);
945
            tcg_temp_free(t2);
946
            tcg_gen_shri_i32(t1, t1, 31);
947
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
948
            tcg_gen_or_i32(cpu_sr, cpu_sr, t1);
949
            tcg_temp_free(t1);
950
            tcg_gen_mov_i32(REG(B11_8), t0);
951
            tcg_temp_free(t0);
952
        }
953
        return;
954
    case 0x2008:                /* tst Rm,Rn */
955
        {
956
            TCGv val = tcg_temp_new();
957
            tcg_gen_and_i32(val, REG(B7_4), REG(B11_8));
958
            gen_cmp_imm(TCG_COND_EQ, val, 0);
959
            tcg_temp_free(val);
960
        }
961
        return;
962
    case 0x200a:                /* xor Rm,Rn */
963
        tcg_gen_xor_i32(REG(B11_8), REG(B11_8), REG(B7_4));
964
        return;
965
    case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
966
        CHECK_FPU_ENABLED
967
        if (ctx->flags & FPSCR_SZ) {
968
            TCGv_i64 fp = tcg_temp_new_i64();
969
            gen_load_fpr64(fp, XREG(B7_4));
970
            gen_store_fpr64(fp, XREG(B11_8));
971
            tcg_temp_free_i64(fp);
972
        } else {
973
            tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]);
974
        }
975
        return;
976
    case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
977
        CHECK_FPU_ENABLED
978
        if (ctx->flags & FPSCR_SZ) {
979
            TCGv addr_hi = tcg_temp_new();
980
            int fr = XREG(B7_4);
981
            tcg_gen_addi_i32(addr_hi, REG(B11_8), 4);
982
            tcg_gen_qemu_st32(cpu_fregs[fr  ], REG(B11_8), ctx->memidx);
983
            tcg_gen_qemu_st32(cpu_fregs[fr+1], addr_hi,           ctx->memidx);
984
            tcg_temp_free(addr_hi);
985
        } else {
986
            tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], REG(B11_8), ctx->memidx);
987
        }
988
        return;
989
    case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
990
        CHECK_FPU_ENABLED
991
        if (ctx->flags & FPSCR_SZ) {
992
            TCGv addr_hi = tcg_temp_new();
993
            int fr = XREG(B11_8);
994
            tcg_gen_addi_i32(addr_hi, REG(B7_4), 4);
995
            tcg_gen_qemu_ld32u(cpu_fregs[fr  ], REG(B7_4), ctx->memidx);
996
            tcg_gen_qemu_ld32u(cpu_fregs[fr+1], addr_hi,   ctx->memidx);
997
            tcg_temp_free(addr_hi);
998
        } else {
999
            tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], REG(B7_4), ctx->memidx);
1000
        }
1001
        return;
1002
    case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
1003
        CHECK_FPU_ENABLED
1004
        if (ctx->flags & FPSCR_SZ) {
1005
            TCGv addr_hi = tcg_temp_new();
1006
            int fr = XREG(B11_8);
1007
            tcg_gen_addi_i32(addr_hi, REG(B7_4), 4);
1008
            tcg_gen_qemu_ld32u(cpu_fregs[fr  ], REG(B7_4), ctx->memidx);
1009
            tcg_gen_qemu_ld32u(cpu_fregs[fr+1], addr_hi,   ctx->memidx);
1010
            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 8);
1011
            tcg_temp_free(addr_hi);
1012
        } else {
1013
            tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], REG(B7_4), ctx->memidx);
1014
            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
1015
        }
1016
        return;
1017
    case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
1018
        CHECK_FPU_ENABLED
1019
        if (ctx->flags & FPSCR_SZ) {
1020
            TCGv addr = tcg_temp_new_i32();
1021
            int fr = XREG(B7_4);
1022
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
1023
            tcg_gen_qemu_st32(cpu_fregs[fr+1], addr, ctx->memidx);
1024
            tcg_gen_subi_i32(addr, addr, 4);
1025
            tcg_gen_qemu_st32(cpu_fregs[fr  ], addr, ctx->memidx);
1026
            tcg_gen_mov_i32(REG(B11_8), addr);
1027
            tcg_temp_free(addr);
1028
        } else {
1029
            TCGv addr;
1030
            addr = tcg_temp_new_i32();
1031
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
1032
            tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], addr, ctx->memidx);
1033
            tcg_gen_mov_i32(REG(B11_8), addr);
1034
            tcg_temp_free(addr);
1035
        }
1036
        return;
1037
    case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
1038
        CHECK_FPU_ENABLED
1039
        {
1040
            TCGv addr = tcg_temp_new_i32();
1041
            tcg_gen_add_i32(addr, REG(B7_4), REG(0));
1042
            if (ctx->flags & FPSCR_SZ) {
1043
                int fr = XREG(B11_8);
1044
                tcg_gen_qemu_ld32u(cpu_fregs[fr         ], addr, ctx->memidx);
1045
                tcg_gen_addi_i32(addr, addr, 4);
1046
                tcg_gen_qemu_ld32u(cpu_fregs[fr+1], addr, ctx->memidx);
1047
            } else {
1048
                tcg_gen_qemu_ld32u(cpu_fregs[FREG(B11_8)], addr, ctx->memidx);
1049
            }
1050
            tcg_temp_free(addr);
1051
        }
1052
        return;
1053
    case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
1054
        CHECK_FPU_ENABLED
1055
        {
1056
            TCGv addr = tcg_temp_new();
1057
            tcg_gen_add_i32(addr, REG(B11_8), REG(0));
1058
            if (ctx->flags & FPSCR_SZ) {
1059
                int fr = XREG(B7_4);
1060
                tcg_gen_qemu_ld32u(cpu_fregs[fr         ], addr, ctx->memidx);
1061
                tcg_gen_addi_i32(addr, addr, 4);
1062
                tcg_gen_qemu_ld32u(cpu_fregs[fr+1], addr, ctx->memidx);
1063
            } else {
1064
                tcg_gen_qemu_st32(cpu_fregs[FREG(B7_4)], addr, ctx->memidx);
1065
            }
1066
            tcg_temp_free(addr);
1067
        }
1068
        return;
1069
    case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1070
    case 0xf001: /* fsub Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1071
    case 0xf002: /* fmul Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1072
    case 0xf003: /* fdiv Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1073
    case 0xf004: /* fcmp/eq Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1074
    case 0xf005: /* fcmp/gt Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1075
        {
1076
            CHECK_FPU_ENABLED
1077
            if (ctx->flags & FPSCR_PR) {
1078
                TCGv_i64 fp0, fp1;
1079

    
1080
                if (ctx->opcode & 0x0110)
1081
                    break; /* illegal instruction */
1082
                fp0 = tcg_temp_new_i64();
1083
                fp1 = tcg_temp_new_i64();
1084
                gen_load_fpr64(fp0, DREG(B11_8));
1085
                gen_load_fpr64(fp1, DREG(B7_4));
1086
                switch (ctx->opcode & 0xf00f) {
1087
                case 0xf000:                /* fadd Rm,Rn */
1088
                    gen_helper_fadd_DT(fp0, cpu_env, fp0, fp1);
1089
                    break;
1090
                case 0xf001:                /* fsub Rm,Rn */
1091
                    gen_helper_fsub_DT(fp0, cpu_env, fp0, fp1);
1092
                    break;
1093
                case 0xf002:                /* fmul Rm,Rn */
1094
                    gen_helper_fmul_DT(fp0, cpu_env, fp0, fp1);
1095
                    break;
1096
                case 0xf003:                /* fdiv Rm,Rn */
1097
                    gen_helper_fdiv_DT(fp0, cpu_env, fp0, fp1);
1098
                    break;
1099
                case 0xf004:                /* fcmp/eq Rm,Rn */
1100
                    gen_helper_fcmp_eq_DT(cpu_env, fp0, fp1);
1101
                    return;
1102
                case 0xf005:                /* fcmp/gt Rm,Rn */
1103
                    gen_helper_fcmp_gt_DT(cpu_env, fp0, fp1);
1104
                    return;
1105
                }
1106
                gen_store_fpr64(fp0, DREG(B11_8));
1107
                tcg_temp_free_i64(fp0);
1108
                tcg_temp_free_i64(fp1);
1109
            } else {
1110
                switch (ctx->opcode & 0xf00f) {
1111
                case 0xf000:                /* fadd Rm,Rn */
1112
                    gen_helper_fadd_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1113
                                       cpu_fregs[FREG(B11_8)],
1114
                                       cpu_fregs[FREG(B7_4)]);
1115
                    break;
1116
                case 0xf001:                /* fsub Rm,Rn */
1117
                    gen_helper_fsub_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1118
                                       cpu_fregs[FREG(B11_8)],
1119
                                       cpu_fregs[FREG(B7_4)]);
1120
                    break;
1121
                case 0xf002:                /* fmul Rm,Rn */
1122
                    gen_helper_fmul_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1123
                                       cpu_fregs[FREG(B11_8)],
1124
                                       cpu_fregs[FREG(B7_4)]);
1125
                    break;
1126
                case 0xf003:                /* fdiv Rm,Rn */
1127
                    gen_helper_fdiv_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1128
                                       cpu_fregs[FREG(B11_8)],
1129
                                       cpu_fregs[FREG(B7_4)]);
1130
                    break;
1131
                case 0xf004:                /* fcmp/eq Rm,Rn */
1132
                    gen_helper_fcmp_eq_FT(cpu_env, cpu_fregs[FREG(B11_8)],
1133
                                          cpu_fregs[FREG(B7_4)]);
1134
                    return;
1135
                case 0xf005:                /* fcmp/gt Rm,Rn */
1136
                    gen_helper_fcmp_gt_FT(cpu_env, cpu_fregs[FREG(B11_8)],
1137
                                          cpu_fregs[FREG(B7_4)]);
1138
                    return;
1139
                }
1140
            }
1141
        }
1142
        return;
1143
    case 0xf00e: /* fmac FR0,RM,Rn */
1144
        {
1145
            CHECK_FPU_ENABLED
1146
            if (ctx->flags & FPSCR_PR) {
1147
                break; /* illegal instruction */
1148
            } else {
1149
                gen_helper_fmac_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1150
                                   cpu_fregs[FREG(0)], cpu_fregs[FREG(B7_4)],
1151
                                   cpu_fregs[FREG(B11_8)]);
1152
                return;
1153
            }
1154
        }
1155
    }
1156

    
1157
    switch (ctx->opcode & 0xff00) {
1158
    case 0xc900:                /* and #imm,R0 */
1159
        tcg_gen_andi_i32(REG(0), REG(0), B7_0);
1160
        return;
1161
    case 0xcd00:                /* and.b #imm,@(R0,GBR) */
1162
        {
1163
            TCGv addr, val;
1164
            addr = tcg_temp_new();
1165
            tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1166
            val = tcg_temp_new();
1167
            tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1168
            tcg_gen_andi_i32(val, val, B7_0);
1169
            tcg_gen_qemu_st8(val, addr, ctx->memidx);
1170
            tcg_temp_free(val);
1171
            tcg_temp_free(addr);
1172
        }
1173
        return;
1174
    case 0x8b00:                /* bf label */
1175
        CHECK_NOT_DELAY_SLOT
1176
            gen_conditional_jump(ctx, ctx->pc + 2,
1177
                                 ctx->pc + 4 + B7_0s * 2);
1178
        ctx->bstate = BS_BRANCH;
1179
        return;
1180
    case 0x8f00:                /* bf/s label */
1181
        CHECK_NOT_DELAY_SLOT
1182
        gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 0);
1183
        ctx->flags |= DELAY_SLOT_CONDITIONAL;
1184
        return;
1185
    case 0x8900:                /* bt label */
1186
        CHECK_NOT_DELAY_SLOT
1187
            gen_conditional_jump(ctx, ctx->pc + 4 + B7_0s * 2,
1188
                                 ctx->pc + 2);
1189
        ctx->bstate = BS_BRANCH;
1190
        return;
1191
    case 0x8d00:                /* bt/s label */
1192
        CHECK_NOT_DELAY_SLOT
1193
        gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 1);
1194
        ctx->flags |= DELAY_SLOT_CONDITIONAL;
1195
        return;
1196
    case 0x8800:                /* cmp/eq #imm,R0 */
1197
        gen_cmp_imm(TCG_COND_EQ, REG(0), B7_0s);
1198
        return;
1199
    case 0xc400:                /* mov.b @(disp,GBR),R0 */
1200
        {
1201
            TCGv addr = tcg_temp_new();
1202
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1203
            tcg_gen_qemu_ld8s(REG(0), addr, ctx->memidx);
1204
            tcg_temp_free(addr);
1205
        }
1206
        return;
1207
    case 0xc500:                /* mov.w @(disp,GBR),R0 */
1208
        {
1209
            TCGv addr = tcg_temp_new();
1210
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1211
            tcg_gen_qemu_ld16s(REG(0), addr, ctx->memidx);
1212
            tcg_temp_free(addr);
1213
        }
1214
        return;
1215
    case 0xc600:                /* mov.l @(disp,GBR),R0 */
1216
        {
1217
            TCGv addr = tcg_temp_new();
1218
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1219
            tcg_gen_qemu_ld32s(REG(0), addr, ctx->memidx);
1220
            tcg_temp_free(addr);
1221
        }
1222
        return;
1223
    case 0xc000:                /* mov.b R0,@(disp,GBR) */
1224
        {
1225
            TCGv addr = tcg_temp_new();
1226
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1227
            tcg_gen_qemu_st8(REG(0), addr, ctx->memidx);
1228
            tcg_temp_free(addr);
1229
        }
1230
        return;
1231
    case 0xc100:                /* mov.w R0,@(disp,GBR) */
1232
        {
1233
            TCGv addr = tcg_temp_new();
1234
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1235
            tcg_gen_qemu_st16(REG(0), addr, ctx->memidx);
1236
            tcg_temp_free(addr);
1237
        }
1238
        return;
1239
    case 0xc200:                /* mov.l R0,@(disp,GBR) */
1240
        {
1241
            TCGv addr = tcg_temp_new();
1242
            tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1243
            tcg_gen_qemu_st32(REG(0), addr, ctx->memidx);
1244
            tcg_temp_free(addr);
1245
        }
1246
        return;
1247
    case 0x8000:                /* mov.b R0,@(disp,Rn) */
1248
        {
1249
            TCGv addr = tcg_temp_new();
1250
            tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1251
            tcg_gen_qemu_st8(REG(0), addr, ctx->memidx);
1252
            tcg_temp_free(addr);
1253
        }
1254
        return;
1255
    case 0x8100:                /* mov.w R0,@(disp,Rn) */
1256
        {
1257
            TCGv addr = tcg_temp_new();
1258
            tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1259
            tcg_gen_qemu_st16(REG(0), addr, ctx->memidx);
1260
            tcg_temp_free(addr);
1261
        }
1262
        return;
1263
    case 0x8400:                /* mov.b @(disp,Rn),R0 */
1264
        {
1265
            TCGv addr = tcg_temp_new();
1266
            tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1267
            tcg_gen_qemu_ld8s(REG(0), addr, ctx->memidx);
1268
            tcg_temp_free(addr);
1269
        }
1270
        return;
1271
    case 0x8500:                /* mov.w @(disp,Rn),R0 */
1272
        {
1273
            TCGv addr = tcg_temp_new();
1274
            tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1275
            tcg_gen_qemu_ld16s(REG(0), addr, ctx->memidx);
1276
            tcg_temp_free(addr);
1277
        }
1278
        return;
1279
    case 0xc700:                /* mova @(disp,PC),R0 */
1280
        tcg_gen_movi_i32(REG(0), ((ctx->pc & 0xfffffffc) + 4 + B7_0 * 4) & ~3);
1281
        return;
1282
    case 0xcb00:                /* or #imm,R0 */
1283
        tcg_gen_ori_i32(REG(0), REG(0), B7_0);
1284
        return;
1285
    case 0xcf00:                /* or.b #imm,@(R0,GBR) */
1286
        {
1287
            TCGv addr, val;
1288
            addr = tcg_temp_new();
1289
            tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1290
            val = tcg_temp_new();
1291
            tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1292
            tcg_gen_ori_i32(val, val, B7_0);
1293
            tcg_gen_qemu_st8(val, addr, ctx->memidx);
1294
            tcg_temp_free(val);
1295
            tcg_temp_free(addr);
1296
        }
1297
        return;
1298
    case 0xc300:                /* trapa #imm */
1299
        {
1300
            TCGv imm;
1301
            CHECK_NOT_DELAY_SLOT
1302
            tcg_gen_movi_i32(cpu_pc, ctx->pc);
1303
            imm = tcg_const_i32(B7_0);
1304
            gen_helper_trapa(cpu_env, imm);
1305
            tcg_temp_free(imm);
1306
            ctx->bstate = BS_BRANCH;
1307
        }
1308
        return;
1309
    case 0xc800:                /* tst #imm,R0 */
1310
        {
1311
            TCGv val = tcg_temp_new();
1312
            tcg_gen_andi_i32(val, REG(0), B7_0);
1313
            gen_cmp_imm(TCG_COND_EQ, val, 0);
1314
            tcg_temp_free(val);
1315
        }
1316
        return;
1317
    case 0xcc00:                /* tst.b #imm,@(R0,GBR) */
1318
        {
1319
            TCGv val = tcg_temp_new();
1320
            tcg_gen_add_i32(val, REG(0), cpu_gbr);
1321
            tcg_gen_qemu_ld8u(val, val, ctx->memidx);
1322
            tcg_gen_andi_i32(val, val, B7_0);
1323
            gen_cmp_imm(TCG_COND_EQ, val, 0);
1324
            tcg_temp_free(val);
1325
        }
1326
        return;
1327
    case 0xca00:                /* xor #imm,R0 */
1328
        tcg_gen_xori_i32(REG(0), REG(0), B7_0);
1329
        return;
1330
    case 0xce00:                /* xor.b #imm,@(R0,GBR) */
1331
        {
1332
            TCGv addr, val;
1333
            addr = tcg_temp_new();
1334
            tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1335
            val = tcg_temp_new();
1336
            tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1337
            tcg_gen_xori_i32(val, val, B7_0);
1338
            tcg_gen_qemu_st8(val, addr, ctx->memidx);
1339
            tcg_temp_free(val);
1340
            tcg_temp_free(addr);
1341
        }
1342
        return;
1343
    }
1344

    
1345
    switch (ctx->opcode & 0xf08f) {
1346
    case 0x408e:                /* ldc Rm,Rn_BANK */
1347
        CHECK_PRIVILEGED
1348
        tcg_gen_mov_i32(ALTREG(B6_4), REG(B11_8));
1349
        return;
1350
    case 0x4087:                /* ldc.l @Rm+,Rn_BANK */
1351
        CHECK_PRIVILEGED
1352
        tcg_gen_qemu_ld32s(ALTREG(B6_4), REG(B11_8), ctx->memidx);
1353
        tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1354
        return;
1355
    case 0x0082:                /* stc Rm_BANK,Rn */
1356
        CHECK_PRIVILEGED
1357
        tcg_gen_mov_i32(REG(B11_8), ALTREG(B6_4));
1358
        return;
1359
    case 0x4083:                /* stc.l Rm_BANK,@-Rn */
1360
        CHECK_PRIVILEGED
1361
        {
1362
            TCGv addr = tcg_temp_new();
1363
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
1364
            tcg_gen_qemu_st32(ALTREG(B6_4), addr, ctx->memidx);
1365
            tcg_gen_mov_i32(REG(B11_8), addr);
1366
            tcg_temp_free(addr);
1367
        }
1368
        return;
1369
    }
1370

    
1371
    switch (ctx->opcode & 0xf0ff) {
1372
    case 0x0023:                /* braf Rn */
1373
        CHECK_NOT_DELAY_SLOT
1374
        tcg_gen_addi_i32(cpu_delayed_pc, REG(B11_8), ctx->pc + 4);
1375
        ctx->flags |= DELAY_SLOT;
1376
        ctx->delayed_pc = (uint32_t) - 1;
1377
        return;
1378
    case 0x0003:                /* bsrf Rn */
1379
        CHECK_NOT_DELAY_SLOT
1380
        tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1381
        tcg_gen_add_i32(cpu_delayed_pc, REG(B11_8), cpu_pr);
1382
        ctx->flags |= DELAY_SLOT;
1383
        ctx->delayed_pc = (uint32_t) - 1;
1384
        return;
1385
    case 0x4015:                /* cmp/pl Rn */
1386
        gen_cmp_imm(TCG_COND_GT, REG(B11_8), 0);
1387
        return;
1388
    case 0x4011:                /* cmp/pz Rn */
1389
        gen_cmp_imm(TCG_COND_GE, REG(B11_8), 0);
1390
        return;
1391
    case 0x4010:                /* dt Rn */
1392
        tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 1);
1393
        gen_cmp_imm(TCG_COND_EQ, REG(B11_8), 0);
1394
        return;
1395
    case 0x402b:                /* jmp @Rn */
1396
        CHECK_NOT_DELAY_SLOT
1397
        tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1398
        ctx->flags |= DELAY_SLOT;
1399
        ctx->delayed_pc = (uint32_t) - 1;
1400
        return;
1401
    case 0x400b:                /* jsr @Rn */
1402
        CHECK_NOT_DELAY_SLOT
1403
        tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1404
        tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1405
        ctx->flags |= DELAY_SLOT;
1406
        ctx->delayed_pc = (uint32_t) - 1;
1407
        return;
1408
    case 0x400e:                /* ldc Rm,SR */
1409
        CHECK_PRIVILEGED
1410
        tcg_gen_andi_i32(cpu_sr, REG(B11_8), 0x700083f3);
1411
        ctx->bstate = BS_STOP;
1412
        return;
1413
    case 0x4007:                /* ldc.l @Rm+,SR */
1414
        CHECK_PRIVILEGED
1415
        {
1416
            TCGv val = tcg_temp_new();
1417
            tcg_gen_qemu_ld32s(val, REG(B11_8), ctx->memidx);
1418
            tcg_gen_andi_i32(cpu_sr, val, 0x700083f3);
1419
            tcg_temp_free(val);
1420
            tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1421
            ctx->bstate = BS_STOP;
1422
        }
1423
        return;
1424
    case 0x0002:                /* stc SR,Rn */
1425
        CHECK_PRIVILEGED
1426
        tcg_gen_mov_i32(REG(B11_8), cpu_sr);
1427
        return;
1428
    case 0x4003:                /* stc SR,@-Rn */
1429
        CHECK_PRIVILEGED
1430
        {
1431
            TCGv addr = tcg_temp_new();
1432
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
1433
            tcg_gen_qemu_st32(cpu_sr, addr, ctx->memidx);
1434
            tcg_gen_mov_i32(REG(B11_8), addr);
1435
            tcg_temp_free(addr);
1436
        }
1437
        return;
1438
#define LD(reg,ldnum,ldpnum,prechk)                \
1439
  case ldnum:                                                        \
1440
    prechk                                                            \
1441
    tcg_gen_mov_i32 (cpu_##reg, REG(B11_8));                        \
1442
    return;                                                        \
1443
  case ldpnum:                                                        \
1444
    prechk                                                            \
1445
    tcg_gen_qemu_ld32s (cpu_##reg, REG(B11_8), ctx->memidx);        \
1446
    tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);                \
1447
    return;
1448
#define ST(reg,stnum,stpnum,prechk)                \
1449
  case stnum:                                                        \
1450
    prechk                                                            \
1451
    tcg_gen_mov_i32 (REG(B11_8), cpu_##reg);                        \
1452
    return;                                                        \
1453
  case stpnum:                                                        \
1454
    prechk                                                            \
1455
    {                                                                \
1456
        TCGv addr = tcg_temp_new();                                \
1457
        tcg_gen_subi_i32(addr, REG(B11_8), 4);                        \
1458
        tcg_gen_qemu_st32 (cpu_##reg, addr, ctx->memidx);        \
1459
        tcg_gen_mov_i32(REG(B11_8), addr);                        \
1460
        tcg_temp_free(addr);                                        \
1461
    }                                                                \
1462
    return;
1463
#define LDST(reg,ldnum,ldpnum,stnum,stpnum,prechk)                \
1464
        LD(reg,ldnum,ldpnum,prechk)                                \
1465
        ST(reg,stnum,stpnum,prechk)
1466
        LDST(gbr,  0x401e, 0x4017, 0x0012, 0x4013, {})
1467
        LDST(vbr,  0x402e, 0x4027, 0x0022, 0x4023, CHECK_PRIVILEGED)
1468
        LDST(ssr,  0x403e, 0x4037, 0x0032, 0x4033, CHECK_PRIVILEGED)
1469
        LDST(spc,  0x404e, 0x4047, 0x0042, 0x4043, CHECK_PRIVILEGED)
1470
        ST(sgr,  0x003a, 0x4032, CHECK_PRIVILEGED)
1471
        LD(sgr,  0x403a, 0x4036, CHECK_PRIVILEGED if (!(ctx->features & SH_FEATURE_SH4A)) break;)
1472
        LDST(dbr,  0x40fa, 0x40f6, 0x00fa, 0x40f2, CHECK_PRIVILEGED)
1473
        LDST(mach, 0x400a, 0x4006, 0x000a, 0x4002, {})
1474
        LDST(macl, 0x401a, 0x4016, 0x001a, 0x4012, {})
1475
        LDST(pr,   0x402a, 0x4026, 0x002a, 0x4022, {})
1476
        LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052, {CHECK_FPU_ENABLED})
1477
    case 0x406a:                /* lds Rm,FPSCR */
1478
        CHECK_FPU_ENABLED
1479
        gen_helper_ld_fpscr(cpu_env, REG(B11_8));
1480
        ctx->bstate = BS_STOP;
1481
        return;
1482
    case 0x4066:                /* lds.l @Rm+,FPSCR */
1483
        CHECK_FPU_ENABLED
1484
        {
1485
            TCGv addr = tcg_temp_new();
1486
            tcg_gen_qemu_ld32s(addr, REG(B11_8), ctx->memidx);
1487
            tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1488
            gen_helper_ld_fpscr(cpu_env, addr);
1489
            tcg_temp_free(addr);
1490
            ctx->bstate = BS_STOP;
1491
        }
1492
        return;
1493
    case 0x006a:                /* sts FPSCR,Rn */
1494
        CHECK_FPU_ENABLED
1495
        tcg_gen_andi_i32(REG(B11_8), cpu_fpscr, 0x003fffff);
1496
        return;
1497
    case 0x4062:                /* sts FPSCR,@-Rn */
1498
        CHECK_FPU_ENABLED
1499
        {
1500
            TCGv addr, val;
1501
            val = tcg_temp_new();
1502
            tcg_gen_andi_i32(val, cpu_fpscr, 0x003fffff);
1503
            addr = tcg_temp_new();
1504
            tcg_gen_subi_i32(addr, REG(B11_8), 4);
1505
            tcg_gen_qemu_st32(val, addr, ctx->memidx);
1506
            tcg_gen_mov_i32(REG(B11_8), addr);
1507
            tcg_temp_free(addr);
1508
            tcg_temp_free(val);
1509
        }
1510
        return;
1511
    case 0x00c3:                /* movca.l R0,@Rm */
1512
        {
1513
            TCGv val = tcg_temp_new();
1514
            tcg_gen_qemu_ld32u(val, REG(B11_8), ctx->memidx);
1515
            gen_helper_movcal(cpu_env, REG(B11_8), val);
1516
            tcg_gen_qemu_st32(REG(0), REG(B11_8), ctx->memidx);
1517
        }
1518
        ctx->has_movcal = 1;
1519
        return;
1520
    case 0x40a9:
1521
        /* MOVUA.L @Rm,R0 (Rm) -> R0
1522
           Load non-boundary-aligned data */
1523
        tcg_gen_qemu_ld32u(REG(0), REG(B11_8), ctx->memidx);
1524
        return;
1525
    case 0x40e9:
1526
        /* MOVUA.L @Rm+,R0   (Rm) -> R0, Rm + 4 -> Rm
1527
           Load non-boundary-aligned data */
1528
        tcg_gen_qemu_ld32u(REG(0), REG(B11_8), ctx->memidx);
1529
        tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1530
        return;
1531
    case 0x0029:                /* movt Rn */
1532
        tcg_gen_andi_i32(REG(B11_8), cpu_sr, SR_T);
1533
        return;
1534
    case 0x0073:
1535
        /* MOVCO.L
1536
               LDST -> T
1537
               If (T == 1) R0 -> (Rn)
1538
               0 -> LDST
1539
        */
1540
        if (ctx->features & SH_FEATURE_SH4A) {
1541
            int label = gen_new_label();
1542
            tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
1543
            tcg_gen_or_i32(cpu_sr, cpu_sr, cpu_ldst);
1544
            tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_ldst, 0, label);
1545
            tcg_gen_qemu_st32(REG(0), REG(B11_8), ctx->memidx);
1546
            gen_set_label(label);
1547
            tcg_gen_movi_i32(cpu_ldst, 0);
1548
            return;
1549
        } else
1550
            break;
1551
    case 0x0063:
1552
        /* MOVLI.L @Rm,R0
1553
               1 -> LDST
1554
               (Rm) -> R0
1555
               When interrupt/exception
1556
               occurred 0 -> LDST
1557
        */
1558
        if (ctx->features & SH_FEATURE_SH4A) {
1559
            tcg_gen_movi_i32(cpu_ldst, 0);
1560
            tcg_gen_qemu_ld32s(REG(0), REG(B11_8), ctx->memidx);
1561
            tcg_gen_movi_i32(cpu_ldst, 1);
1562
            return;
1563
        } else
1564
            break;
1565
    case 0x0093:                /* ocbi @Rn */
1566
        {
1567
            gen_helper_ocbi(cpu_env, REG(B11_8));
1568
        }
1569
        return;
1570
    case 0x00a3:                /* ocbp @Rn */
1571
    case 0x00b3:                /* ocbwb @Rn */
1572
        /* These instructions are supposed to do nothing in case of
1573
           a cache miss. Given that we only partially emulate caches
1574
           it is safe to simply ignore them. */
1575
        return;
1576
    case 0x0083:                /* pref @Rn */
1577
        return;
1578
    case 0x00d3:                /* prefi @Rn */
1579
        if (ctx->features & SH_FEATURE_SH4A)
1580
            return;
1581
        else
1582
            break;
1583
    case 0x00e3:                /* icbi @Rn */
1584
        if (ctx->features & SH_FEATURE_SH4A)
1585
            return;
1586
        else
1587
            break;
1588
    case 0x00ab:                /* synco */
1589
        if (ctx->features & SH_FEATURE_SH4A)
1590
            return;
1591
        else
1592
            break;
1593
    case 0x4024:                /* rotcl Rn */
1594
        {
1595
            TCGv tmp = tcg_temp_new();
1596
            tcg_gen_mov_i32(tmp, cpu_sr);
1597
            gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 31);
1598
            tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1599
            gen_copy_bit_i32(REG(B11_8), 0, tmp, 0);
1600
            tcg_temp_free(tmp);
1601
        }
1602
        return;
1603
    case 0x4025:                /* rotcr Rn */
1604
        {
1605
            TCGv tmp = tcg_temp_new();
1606
            tcg_gen_mov_i32(tmp, cpu_sr);
1607
            gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1608
            tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1609
            gen_copy_bit_i32(REG(B11_8), 31, tmp, 0);
1610
            tcg_temp_free(tmp);
1611
        }
1612
        return;
1613
    case 0x4004:                /* rotl Rn */
1614
        tcg_gen_rotli_i32(REG(B11_8), REG(B11_8), 1);
1615
        gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1616
        return;
1617
    case 0x4005:                /* rotr Rn */
1618
        gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1619
        tcg_gen_rotri_i32(REG(B11_8), REG(B11_8), 1);
1620
        return;
1621
    case 0x4000:                /* shll Rn */
1622
    case 0x4020:                /* shal Rn */
1623
        gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 31);
1624
        tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1625
        return;
1626
    case 0x4021:                /* shar Rn */
1627
        gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1628
        tcg_gen_sari_i32(REG(B11_8), REG(B11_8), 1);
1629
        return;
1630
    case 0x4001:                /* shlr Rn */
1631
        gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1632
        tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1633
        return;
1634
    case 0x4008:                /* shll2 Rn */
1635
        tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 2);
1636
        return;
1637
    case 0x4018:                /* shll8 Rn */
1638
        tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 8);
1639
        return;
1640
    case 0x4028:                /* shll16 Rn */
1641
        tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 16);
1642
        return;
1643
    case 0x4009:                /* shlr2 Rn */
1644
        tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 2);
1645
        return;
1646
    case 0x4019:                /* shlr8 Rn */
1647
        tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 8);
1648
        return;
1649
    case 0x4029:                /* shlr16 Rn */
1650
        tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 16);
1651
        return;
1652
    case 0x401b:                /* tas.b @Rn */
1653
        {
1654
            TCGv addr, val;
1655
            addr = tcg_temp_local_new();
1656
            tcg_gen_mov_i32(addr, REG(B11_8));
1657
            val = tcg_temp_local_new();
1658
            tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1659
            gen_cmp_imm(TCG_COND_EQ, val, 0);
1660
            tcg_gen_ori_i32(val, val, 0x80);
1661
            tcg_gen_qemu_st8(val, addr, ctx->memidx);
1662
            tcg_temp_free(val);
1663
            tcg_temp_free(addr);
1664
        }
1665
        return;
1666
    case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
1667
        CHECK_FPU_ENABLED
1668
        tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fpul);
1669
        return;
1670
    case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */
1671
        CHECK_FPU_ENABLED
1672
        tcg_gen_mov_i32(cpu_fpul, cpu_fregs[FREG(B11_8)]);
1673
        return;
1674
    case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1675
        CHECK_FPU_ENABLED
1676
        if (ctx->flags & FPSCR_PR) {
1677
            TCGv_i64 fp;
1678
            if (ctx->opcode & 0x0100)
1679
                break; /* illegal instruction */
1680
            fp = tcg_temp_new_i64();
1681
            gen_helper_float_DT(fp, cpu_env, cpu_fpul);
1682
            gen_store_fpr64(fp, DREG(B11_8));
1683
            tcg_temp_free_i64(fp);
1684
        }
1685
        else {
1686
            gen_helper_float_FT(cpu_fregs[FREG(B11_8)], cpu_env, cpu_fpul);
1687
        }
1688
        return;
1689
    case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1690
        CHECK_FPU_ENABLED
1691
        if (ctx->flags & FPSCR_PR) {
1692
            TCGv_i64 fp;
1693
            if (ctx->opcode & 0x0100)
1694
                break; /* illegal instruction */
1695
            fp = tcg_temp_new_i64();
1696
            gen_load_fpr64(fp, DREG(B11_8));
1697
            gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp);
1698
            tcg_temp_free_i64(fp);
1699
        }
1700
        else {
1701
            gen_helper_ftrc_FT(cpu_fpul, cpu_env, cpu_fregs[FREG(B11_8)]);
1702
        }
1703
        return;
1704
    case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
1705
        CHECK_FPU_ENABLED
1706
        {
1707
            gen_helper_fneg_T(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]);
1708
        }
1709
        return;
1710
    case 0xf05d: /* fabs FRn/DRn */
1711
        CHECK_FPU_ENABLED
1712
        if (ctx->flags & FPSCR_PR) {
1713
            if (ctx->opcode & 0x0100)
1714
                break; /* illegal instruction */
1715
            TCGv_i64 fp = tcg_temp_new_i64();
1716
            gen_load_fpr64(fp, DREG(B11_8));
1717
            gen_helper_fabs_DT(fp, fp);
1718
            gen_store_fpr64(fp, DREG(B11_8));
1719
            tcg_temp_free_i64(fp);
1720
        } else {
1721
            gen_helper_fabs_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]);
1722
        }
1723
        return;
1724
    case 0xf06d: /* fsqrt FRn */
1725
        CHECK_FPU_ENABLED
1726
        if (ctx->flags & FPSCR_PR) {
1727
            if (ctx->opcode & 0x0100)
1728
                break; /* illegal instruction */
1729
            TCGv_i64 fp = tcg_temp_new_i64();
1730
            gen_load_fpr64(fp, DREG(B11_8));
1731
            gen_helper_fsqrt_DT(fp, cpu_env, fp);
1732
            gen_store_fpr64(fp, DREG(B11_8));
1733
            tcg_temp_free_i64(fp);
1734
        } else {
1735
            gen_helper_fsqrt_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1736
                                cpu_fregs[FREG(B11_8)]);
1737
        }
1738
        return;
1739
    case 0xf07d: /* fsrra FRn */
1740
        CHECK_FPU_ENABLED
1741
        break;
1742
    case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1743
        CHECK_FPU_ENABLED
1744
        if (!(ctx->flags & FPSCR_PR)) {
1745
            tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0);
1746
        }
1747
        return;
1748
    case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */
1749
        CHECK_FPU_ENABLED
1750
        if (!(ctx->flags & FPSCR_PR)) {
1751
            tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0x3f800000);
1752
        }
1753
        return;
1754
    case 0xf0ad: /* fcnvsd FPUL,DRn */
1755
        CHECK_FPU_ENABLED
1756
        {
1757
            TCGv_i64 fp = tcg_temp_new_i64();
1758
            gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul);
1759
            gen_store_fpr64(fp, DREG(B11_8));
1760
            tcg_temp_free_i64(fp);
1761
        }
1762
        return;
1763
    case 0xf0bd: /* fcnvds DRn,FPUL */
1764
        CHECK_FPU_ENABLED
1765
        {
1766
            TCGv_i64 fp = tcg_temp_new_i64();
1767
            gen_load_fpr64(fp, DREG(B11_8));
1768
            gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp);
1769
            tcg_temp_free_i64(fp);
1770
        }
1771
        return;
1772
    case 0xf0ed: /* fipr FVm,FVn */
1773
        CHECK_FPU_ENABLED
1774
        if ((ctx->flags & FPSCR_PR) == 0) {
1775
            TCGv m, n;
1776
            m = tcg_const_i32((ctx->opcode >> 8) & 3);
1777
            n = tcg_const_i32((ctx->opcode >> 10) & 3);
1778
            gen_helper_fipr(cpu_env, m, n);
1779
            tcg_temp_free(m);
1780
            tcg_temp_free(n);
1781
            return;
1782
        }
1783
        break;
1784
    case 0xf0fd: /* ftrv XMTRX,FVn */
1785
        CHECK_FPU_ENABLED
1786
        if ((ctx->opcode & 0x0300) == 0x0100 &&
1787
            (ctx->flags & FPSCR_PR) == 0) {
1788
            TCGv n;
1789
            n = tcg_const_i32((ctx->opcode >> 10) & 3);
1790
            gen_helper_ftrv(cpu_env, n);
1791
            tcg_temp_free(n);
1792
            return;
1793
        }
1794
        break;
1795
    }
1796
#if 0
1797
    fprintf(stderr, "unknown instruction 0x%04x at pc 0x%08x\n",
1798
            ctx->opcode, ctx->pc);
1799
    fflush(stderr);
1800
#endif
1801
    tcg_gen_movi_i32(cpu_pc, ctx->pc);
1802
    if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) {
1803
        gen_helper_raise_slot_illegal_instruction(cpu_env);
1804
    } else {
1805
        gen_helper_raise_illegal_instruction(cpu_env);
1806
    }
1807
    ctx->bstate = BS_BRANCH;
1808
}
1809

    
1810
static void decode_opc(DisasContext * ctx)
1811
{
1812
    uint32_t old_flags = ctx->flags;
1813

    
1814
    if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
1815
        tcg_gen_debug_insn_start(ctx->pc);
1816
    }
1817

    
1818
    _decode_opc(ctx);
1819

    
1820
    if (old_flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) {
1821
        if (ctx->flags & DELAY_SLOT_CLEARME) {
1822
            gen_store_flags(0);
1823
        } else {
1824
            /* go out of the delay slot */
1825
            uint32_t new_flags = ctx->flags;
1826
            new_flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
1827
            gen_store_flags(new_flags);
1828
        }
1829
        ctx->flags = 0;
1830
        ctx->bstate = BS_BRANCH;
1831
        if (old_flags & DELAY_SLOT_CONDITIONAL) {
1832
            gen_delayed_conditional_jump(ctx);
1833
        } else if (old_flags & DELAY_SLOT) {
1834
            gen_jump(ctx);
1835
        }
1836

    
1837
    }
1838

    
1839
    /* go into a delay slot */
1840
    if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))
1841
        gen_store_flags(ctx->flags);
1842
}
1843

    
1844
static inline void
1845
gen_intermediate_code_internal(SuperHCPU *cpu, TranslationBlock *tb,
1846
                               bool search_pc)
1847
{
1848
    CPUState *cs = CPU(cpu);
1849
    CPUSH4State *env = &cpu->env;
1850
    DisasContext ctx;
1851
    target_ulong pc_start;
1852
    static uint16_t *gen_opc_end;
1853
    CPUBreakpoint *bp;
1854
    int i, ii;
1855
    int num_insns;
1856
    int max_insns;
1857

    
1858
    pc_start = tb->pc;
1859
    gen_opc_end = tcg_ctx.gen_opc_buf + OPC_MAX_SIZE;
1860
    ctx.pc = pc_start;
1861
    ctx.flags = (uint32_t)tb->flags;
1862
    ctx.bstate = BS_NONE;
1863
    ctx.memidx = (ctx.flags & SR_MD) == 0 ? 1 : 0;
1864
    /* We don't know if the delayed pc came from a dynamic or static branch,
1865
       so assume it is a dynamic branch.  */
1866
    ctx.delayed_pc = -1; /* use delayed pc from env pointer */
1867
    ctx.tb = tb;
1868
    ctx.singlestep_enabled = cs->singlestep_enabled;
1869
    ctx.features = env->features;
1870
    ctx.has_movcal = (ctx.flags & TB_FLAG_PENDING_MOVCA);
1871

    
1872
    ii = -1;
1873
    num_insns = 0;
1874
    max_insns = tb->cflags & CF_COUNT_MASK;
1875
    if (max_insns == 0)
1876
        max_insns = CF_COUNT_MASK;
1877
    gen_tb_start();
1878
    while (ctx.bstate == BS_NONE && tcg_ctx.gen_opc_ptr < gen_opc_end) {
1879
        if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
1880
            QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1881
                if (ctx.pc == bp->pc) {
1882
                    /* We have hit a breakpoint - make sure PC is up-to-date */
1883
                    tcg_gen_movi_i32(cpu_pc, ctx.pc);
1884
                    gen_helper_debug(cpu_env);
1885
                    ctx.bstate = BS_BRANCH;
1886
                    break;
1887
                }
1888
            }
1889
        }
1890
        if (search_pc) {
1891
            i = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
1892
            if (ii < i) {
1893
                ii++;
1894
                while (ii < i)
1895
                    tcg_ctx.gen_opc_instr_start[ii++] = 0;
1896
            }
1897
            tcg_ctx.gen_opc_pc[ii] = ctx.pc;
1898
            gen_opc_hflags[ii] = ctx.flags;
1899
            tcg_ctx.gen_opc_instr_start[ii] = 1;
1900
            tcg_ctx.gen_opc_icount[ii] = num_insns;
1901
        }
1902
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
1903
            gen_io_start();
1904
#if 0
1905
        fprintf(stderr, "Loading opcode at address 0x%08x\n", ctx.pc);
1906
        fflush(stderr);
1907
#endif
1908
        ctx.opcode = cpu_lduw_code(env, ctx.pc);
1909
        decode_opc(&ctx);
1910
        num_insns++;
1911
        ctx.pc += 2;
1912
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
1913
            break;
1914
        if (cs->singlestep_enabled) {
1915
            break;
1916
        }
1917
        if (num_insns >= max_insns)
1918
            break;
1919
        if (singlestep)
1920
            break;
1921
    }
1922
    if (tb->cflags & CF_LAST_IO)
1923
        gen_io_end();
1924
    if (cs->singlestep_enabled) {
1925
        tcg_gen_movi_i32(cpu_pc, ctx.pc);
1926
        gen_helper_debug(cpu_env);
1927
    } else {
1928
        switch (ctx.bstate) {
1929
        case BS_STOP:
1930
            /* gen_op_interrupt_restart(); */
1931
            /* fall through */
1932
        case BS_NONE:
1933
            if (ctx.flags) {
1934
                gen_store_flags(ctx.flags | DELAY_SLOT_CLEARME);
1935
            }
1936
            gen_goto_tb(&ctx, 0, ctx.pc);
1937
            break;
1938
        case BS_EXCP:
1939
            /* gen_op_interrupt_restart(); */
1940
            tcg_gen_exit_tb(0);
1941
            break;
1942
        case BS_BRANCH:
1943
        default:
1944
            break;
1945
        }
1946
    }
1947

    
1948
    gen_tb_end(tb, num_insns);
1949
    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
1950
    if (search_pc) {
1951
        i = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
1952
        ii++;
1953
        while (ii <= i)
1954
            tcg_ctx.gen_opc_instr_start[ii++] = 0;
1955
    } else {
1956
        tb->size = ctx.pc - pc_start;
1957
        tb->icount = num_insns;
1958
    }
1959

    
1960
#ifdef DEBUG_DISAS
1961
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
1962
        qemu_log("IN:\n");        /* , lookup_symbol(pc_start)); */
1963
        log_target_disas(env, pc_start, ctx.pc - pc_start, 0);
1964
        qemu_log("\n");
1965
    }
1966
#endif
1967
}
1968

    
1969
void gen_intermediate_code(CPUSH4State * env, struct TranslationBlock *tb)
1970
{
1971
    gen_intermediate_code_internal(sh_env_get_cpu(env), tb, false);
1972
}
1973

    
1974
void gen_intermediate_code_pc(CPUSH4State * env, struct TranslationBlock *tb)
1975
{
1976
    gen_intermediate_code_internal(sh_env_get_cpu(env), tb, true);
1977
}
1978

    
1979
void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb, int pc_pos)
1980
{
1981
    env->pc = tcg_ctx.gen_opc_pc[pc_pos];
1982
    env->flags = gen_opc_hflags[pc_pos];
1983
}