Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 3761035f

History | View | Annotate | Download (58.1 kB)

1
/*
2
 *  Alpha emulation cpu translation for qemu.
3
 *
4
 *  Copyright (c) 2007 Jocelyn Mayer
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, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20

    
21
#include <stdint.h>
22
#include <stdlib.h>
23
#include <stdio.h>
24

    
25
#include "cpu.h"
26
#include "exec-all.h"
27
#include "disas.h"
28
#include "helper.h"
29
#include "tcg-op.h"
30
#include "qemu-common.h"
31

    
32
#define DO_SINGLE_STEP
33
#define GENERATE_NOP
34
#define ALPHA_DEBUG_DISAS
35
#define DO_TB_FLUSH
36

    
37
typedef struct DisasContext DisasContext;
38
struct DisasContext {
39
    uint64_t pc;
40
    int mem_idx;
41
#if !defined (CONFIG_USER_ONLY)
42
    int pal_mode;
43
#endif
44
    uint32_t amask;
45
};
46

    
47
/* global register indexes */
48
static TCGv cpu_env;
49
static TCGv cpu_ir[31];
50
static TCGv cpu_pc;
51

    
52
/* dyngen register indexes */
53
static TCGv cpu_T[3];
54

    
55
/* register names */
56
static char cpu_reg_names[5*31];
57

    
58
#include "gen-icount.h"
59

    
60
static void alpha_translate_init(void)
61
{
62
    int i;
63
    char *p;
64
    static int done_init = 0;
65

    
66
    if (done_init)
67
        return;
68

    
69
    cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
70

    
71
#if TARGET_LONG_BITS > HOST_LONG_BITS
72
    cpu_T[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
73
                                  offsetof(CPUState, t0), "T0");
74
    cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
75
                                  offsetof(CPUState, t1), "T1");
76
    cpu_T[2] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
77
                                  offsetof(CPUState, t2), "T2");
78
#else
79
    cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
80
    cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
81
    cpu_T[2] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG3, "T2");
82
#endif
83

    
84
    p = cpu_reg_names;
85
    for (i = 0; i < 31; i++) {
86
        sprintf(p, "ir%d", i);
87
        cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
88
                                       offsetof(CPUState, ir[i]), p);
89
        p += 4;
90
    }
91

    
92
    cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
93
                                offsetof(CPUState, pc), "pc");
94

    
95
    /* register helpers */
96
#undef DEF_HELPER
97
#define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
98
#include "helper.h"
99

    
100
    done_init = 1;
101
}
102

    
103
static always_inline void gen_op_nop (void)
104
{
105
#if defined(GENERATE_NOP)
106
    gen_op_no_op();
107
#endif
108
}
109

    
110
#define GEN32(func, NAME) \
111
static GenOpFunc *NAME ## _table [32] = {                                     \
112
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
113
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
114
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
115
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
116
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
117
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
118
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
119
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
120
};                                                                            \
121
static always_inline void func (int n)                                        \
122
{                                                                             \
123
    NAME ## _table[n]();                                                      \
124
}
125

    
126
/* IR moves */
127
/* Special hacks for ir31 */
128
#define gen_op_cmov_ir31 gen_op_nop
129
GEN32(gen_op_cmov_ir, gen_op_cmov_ir);
130

    
131
/* FIR moves */
132
/* Special hacks for fir31 */
133
#define gen_op_load_FT0_fir31 gen_op_reset_FT0
134
#define gen_op_load_FT1_fir31 gen_op_reset_FT1
135
#define gen_op_load_FT2_fir31 gen_op_reset_FT2
136
#define gen_op_store_FT0_fir31 gen_op_nop
137
#define gen_op_store_FT1_fir31 gen_op_nop
138
#define gen_op_store_FT2_fir31 gen_op_nop
139
#define gen_op_cmov_fir31 gen_op_nop
140
GEN32(gen_op_load_FT0_fir, gen_op_load_FT0_fir);
141
GEN32(gen_op_load_FT1_fir, gen_op_load_FT1_fir);
142
GEN32(gen_op_load_FT2_fir, gen_op_load_FT2_fir);
143
GEN32(gen_op_store_FT0_fir, gen_op_store_FT0_fir);
144
GEN32(gen_op_store_FT1_fir, gen_op_store_FT1_fir);
145
GEN32(gen_op_store_FT2_fir, gen_op_store_FT2_fir);
146
GEN32(gen_op_cmov_fir, gen_op_cmov_fir);
147

    
148
static always_inline void gen_load_fir (DisasContext *ctx, int firn, int Tn)
149
{
150
    switch (Tn) {
151
    case 0:
152
        gen_op_load_FT0_fir(firn);
153
        break;
154
    case 1:
155
        gen_op_load_FT1_fir(firn);
156
        break;
157
    case 2:
158
        gen_op_load_FT2_fir(firn);
159
        break;
160
    }
161
}
162

    
163
static always_inline void gen_store_fir (DisasContext *ctx, int firn, int Tn)
164
{
165
    switch (Tn) {
166
    case 0:
167
        gen_op_store_FT0_fir(firn);
168
        break;
169
    case 1:
170
        gen_op_store_FT1_fir(firn);
171
        break;
172
    case 2:
173
        gen_op_store_FT2_fir(firn);
174
        break;
175
    }
176
}
177

    
178
/* Memory moves */
179
#if defined(CONFIG_USER_ONLY)
180
#define OP_LD_TABLE(width)                                                    \
181
static GenOpFunc *gen_op_ld##width[] = {                                      \
182
    &gen_op_ld##width##_raw,                                                  \
183
}
184
#define OP_ST_TABLE(width)                                                    \
185
static GenOpFunc *gen_op_st##width[] = {                                      \
186
    &gen_op_st##width##_raw,                                                  \
187
}
188
#else
189
#define OP_LD_TABLE(width)                                                    \
190
static GenOpFunc *gen_op_ld##width[] = {                                      \
191
    &gen_op_ld##width##_kernel,                                               \
192
    &gen_op_ld##width##_executive,                                            \
193
    &gen_op_ld##width##_supervisor,                                           \
194
    &gen_op_ld##width##_user,                                                 \
195
}
196
#define OP_ST_TABLE(width)                                                    \
197
static GenOpFunc *gen_op_st##width[] = {                                      \
198
    &gen_op_st##width##_kernel,                                               \
199
    &gen_op_st##width##_executive,                                            \
200
    &gen_op_st##width##_supervisor,                                           \
201
    &gen_op_st##width##_user,                                                 \
202
}
203
#endif
204

    
205
#define GEN_LD(width)                                                         \
206
OP_LD_TABLE(width);                                                           \
207
static always_inline void gen_ld##width (DisasContext *ctx)                   \
208
{                                                                             \
209
    (*gen_op_ld##width[ctx->mem_idx])();                                      \
210
}
211

    
212
#define GEN_ST(width)                                                         \
213
OP_ST_TABLE(width);                                                           \
214
static always_inline void gen_st##width (DisasContext *ctx)                   \
215
{                                                                             \
216
    (*gen_op_st##width[ctx->mem_idx])();                                      \
217
}
218

    
219
GEN_LD(bu);
220
GEN_ST(b);
221
GEN_LD(wu);
222
GEN_ST(w);
223
GEN_LD(l);
224
GEN_ST(l);
225
GEN_LD(q);
226
GEN_ST(q);
227
GEN_LD(q_u);
228
GEN_ST(q_u);
229
GEN_LD(l_l);
230
GEN_ST(l_c);
231
GEN_LD(q_l);
232
GEN_ST(q_c);
233

    
234
#if 0 /* currently unused */
235
GEN_LD(f);
236
GEN_ST(f);
237
GEN_LD(g);
238
GEN_ST(g);
239
#endif /* 0 */
240
GEN_LD(s);
241
GEN_ST(s);
242
GEN_LD(t);
243
GEN_ST(t);
244

    
245
static always_inline void _gen_op_bcond (DisasContext *ctx)
246
{
247
#if 0 // Qemu does not know how to do this...
248
    gen_op_bcond(ctx->pc);
249
#else
250
    gen_op_bcond(ctx->pc >> 32, ctx->pc);
251
#endif
252
}
253

    
254
static always_inline void gen_excp (DisasContext *ctx,
255
                                    int exception, int error_code)
256
{
257
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
258
    gen_op_excp(exception, error_code);
259
}
260

    
261
static always_inline void gen_invalid (DisasContext *ctx)
262
{
263
    gen_excp(ctx, EXCP_OPCDEC, 0);
264
}
265

    
266
static always_inline void gen_load_mem (DisasContext *ctx,
267
                                        void (*gen_load_op)(DisasContext *ctx),
268
                                        int ra, int rb, int32_t disp16,
269
                                        int clear)
270
{
271
    if (ra == 31 && disp16 == 0) {
272
        /* UNOP */
273
        gen_op_nop();
274
    } else {
275
        if (rb != 31)
276
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
277
        else
278
            tcg_gen_movi_i64(cpu_T[0], 0);
279
        if (disp16 != 0) {
280
            tcg_gen_movi_i64(cpu_T[1], disp16);
281
            gen_op_addq();
282
        }
283
        if (clear)
284
            gen_op_n7();
285
        (*gen_load_op)(ctx);
286
        if (ra != 31)
287
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
288
    }
289
}
290

    
291
static always_inline void gen_store_mem (DisasContext *ctx,
292
                                         void (*gen_store_op)(DisasContext *ctx),
293
                                         int ra, int rb, int32_t disp16,
294
                                         int clear)
295
{
296
    if (rb != 31)
297
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
298
    else
299
        tcg_gen_movi_i64(cpu_T[0], 0);
300
    if (disp16 != 0) {
301
        tcg_gen_movi_i64(cpu_T[1], disp16);
302
        gen_op_addq();
303
    }
304
    if (clear)
305
        gen_op_n7();
306
    if (ra != 31)
307
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
308
    else
309
        tcg_gen_movi_i64(cpu_T[1], 0);
310
    (*gen_store_op)(ctx);
311
}
312

    
313
static always_inline void gen_load_fmem (DisasContext *ctx,
314
                                         void (*gen_load_fop)(DisasContext *ctx),
315
                                         int ra, int rb, int32_t disp16)
316
{
317
    if (rb != 31)
318
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
319
    else
320
        tcg_gen_movi_i64(cpu_T[0], 0);
321
    if (disp16 != 0) {
322
        tcg_gen_movi_i64(cpu_T[1], disp16);
323
        gen_op_addq();
324
    }
325
    (*gen_load_fop)(ctx);
326
    gen_store_fir(ctx, ra, 1);
327
}
328

    
329
static always_inline void gen_store_fmem (DisasContext *ctx,
330
                                          void (*gen_store_fop)(DisasContext *ctx),
331
                                          int ra, int rb, int32_t disp16)
332
{
333
    if (rb != 31)
334
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
335
    else
336
        tcg_gen_movi_i64(cpu_T[0], 0);
337
    if (disp16 != 0) {
338
        tcg_gen_movi_i64(cpu_T[1], disp16);
339
        gen_op_addq();
340
    }
341
    gen_load_fir(ctx, ra, 1);
342
    (*gen_store_fop)(ctx);
343
}
344

    
345
static always_inline void gen_bcond (DisasContext *ctx,
346
                                     void (*gen_test_op)(void),
347
                                     int ra, int32_t disp16)
348
{
349
    if (disp16 != 0) {
350
        tcg_gen_movi_i64(cpu_T[0], ctx->pc);
351
        tcg_gen_movi_i64(cpu_T[1], disp16 << 2);
352
        gen_op_addq1();
353
    } else {
354
        tcg_gen_movi_i64(cpu_T[1], ctx->pc);
355
    }
356
    if (ra != 31)
357
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
358
    else
359
        tcg_gen_movi_i64(cpu_T[0], 0);
360
    (*gen_test_op)();
361
    _gen_op_bcond(ctx);
362
}
363

    
364
static always_inline void gen_fbcond (DisasContext *ctx,
365
                                      void (*gen_test_op)(void),
366
                                      int ra, int32_t disp16)
367
{
368
    if (disp16 != 0) {
369
        tcg_gen_movi_i64(cpu_T[0], ctx->pc);
370
        tcg_gen_movi_i64(cpu_T[1], disp16 << 2);
371
        gen_op_addq1();
372
    } else {
373
        tcg_gen_movi_i64(cpu_T[1], ctx->pc);
374
    }
375
    gen_load_fir(ctx, ra, 0);
376
    (*gen_test_op)();
377
    _gen_op_bcond(ctx);
378
}
379

    
380
static always_inline void gen_arith2 (DisasContext *ctx,
381
                                      void (*gen_arith_op)(void),
382
                                      int rb, int rc, int islit, int8_t lit)
383
{
384
    if (islit)
385
        tcg_gen_movi_i64(cpu_T[0], lit);
386
    else if (rb != 31)
387
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
388
    else
389
        tcg_gen_movi_i64(cpu_T[0], 0);
390
    (*gen_arith_op)();
391
    if (rc != 31)
392
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
393
}
394

    
395
static always_inline void gen_arith3 (DisasContext *ctx,
396
                                      void (*gen_arith_op)(void),
397
                                      int ra, int rb, int rc,
398
                                      int islit, int8_t lit)
399
{
400
    if (ra != 31)
401
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
402
    else
403
        tcg_gen_movi_i64(cpu_T[0], 0);
404
    if (islit)
405
        tcg_gen_movi_i64(cpu_T[1], lit);
406
    else if (rb != 31)
407
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
408
    else
409
        tcg_gen_movi_i64(cpu_T[1], 0);
410
    (*gen_arith_op)();
411
    if (rc != 31)
412
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
413
}
414

    
415
static always_inline void gen_cmov (DisasContext *ctx,
416
                                    void (*gen_test_op)(void),
417
                                    int ra, int rb, int rc,
418
                                    int islit, int8_t lit)
419
{
420
    if (ra != 31)
421
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
422
    else
423
        tcg_gen_movi_i64(cpu_T[1], 0);
424
    if (islit)
425
        tcg_gen_movi_i64(cpu_T[0], lit);
426
    else if (rb != 31)
427
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
428
    else
429
        tcg_gen_movi_i64(cpu_T[0], 0);
430
    (*gen_test_op)();
431
    gen_op_cmov_ir(rc);
432
}
433

    
434
static always_inline void gen_farith2 (DisasContext *ctx,
435
                                       void (*gen_arith_fop)(void),
436
                                       int rb, int rc)
437
{
438
    gen_load_fir(ctx, rb, 0);
439
    (*gen_arith_fop)();
440
    gen_store_fir(ctx, rc, 0);
441
}
442

    
443
static always_inline void gen_farith3 (DisasContext *ctx,
444
                                       void (*gen_arith_fop)(void),
445
                                       int ra, int rb, int rc)
446
{
447
    gen_load_fir(ctx, ra, 0);
448
    gen_load_fir(ctx, rb, 1);
449
    (*gen_arith_fop)();
450
    gen_store_fir(ctx, rc, 0);
451
}
452

    
453
static always_inline void gen_fcmov (DisasContext *ctx,
454
                                     void (*gen_test_fop)(void),
455
                                     int ra, int rb, int rc)
456
{
457
    gen_load_fir(ctx, ra, 0);
458
    gen_load_fir(ctx, rb, 1);
459
    (*gen_test_fop)();
460
    gen_op_cmov_fir(rc);
461
}
462

    
463
static always_inline void gen_fti (DisasContext *ctx,
464
                                   void (*gen_move_fop)(void),
465
                                   int ra, int rc)
466
{
467
    gen_load_fir(ctx, rc, 0);
468
    (*gen_move_fop)();
469
    if (ra != 31)
470
        tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
471
}
472

    
473
static always_inline void gen_itf (DisasContext *ctx,
474
                                   void (*gen_move_fop)(void),
475
                                   int ra, int rc)
476
{
477
    if (ra != 31)
478
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
479
    else
480
        tcg_gen_movi_i64(cpu_T[0], 0);
481
    (*gen_move_fop)();
482
    gen_store_fir(ctx, rc, 0);
483
}
484

    
485
static always_inline void gen_s4addl (void)
486
{
487
    gen_op_s4();
488
    gen_op_addl();
489
}
490

    
491
static always_inline void gen_s4subl (void)
492
{
493
    gen_op_s4();
494
    gen_op_subl();
495
}
496

    
497
static always_inline void gen_s8addl (void)
498
{
499
    gen_op_s8();
500
    gen_op_addl();
501
}
502

    
503
static always_inline void gen_s8subl (void)
504
{
505
    gen_op_s8();
506
    gen_op_subl();
507
}
508

    
509
static always_inline void gen_s4addq (void)
510
{
511
    gen_op_s4();
512
    gen_op_addq();
513
}
514

    
515
static always_inline void gen_s4subq (void)
516
{
517
    gen_op_s4();
518
    gen_op_subq();
519
}
520

    
521
static always_inline void gen_s8addq (void)
522
{
523
    gen_op_s8();
524
    gen_op_addq();
525
}
526

    
527
static always_inline void gen_s8subq (void)
528
{
529
    gen_op_s8();
530
    gen_op_subq();
531
}
532

    
533
static always_inline void gen_amask (void)
534
{
535
    gen_op_load_amask();
536
    gen_op_bic();
537
}
538

    
539
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
540
{
541
    uint32_t palcode;
542
    int32_t disp21, disp16, disp12;
543
    uint16_t fn11, fn16;
544
    uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
545
    int8_t lit;
546
    int ret;
547

    
548
    /* Decode all instruction fields */
549
    opc = insn >> 26;
550
    ra = (insn >> 21) & 0x1F;
551
    rb = (insn >> 16) & 0x1F;
552
    rc = insn & 0x1F;
553
    sbz = (insn >> 13) & 0x07;
554
    islit = (insn >> 12) & 1;
555
    lit = (insn >> 13) & 0xFF;
556
    palcode = insn & 0x03FFFFFF;
557
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
558
    disp16 = (int16_t)(insn & 0x0000FFFF);
559
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
560
    fn16 = insn & 0x0000FFFF;
561
    fn11 = (insn >> 5) & 0x000007FF;
562
    fpfn = fn11 & 0x3F;
563
    fn7 = (insn >> 5) & 0x0000007F;
564
    fn2 = (insn >> 5) & 0x00000003;
565
    ret = 0;
566
#if defined ALPHA_DEBUG_DISAS
567
    if (logfile != NULL) {
568
        fprintf(logfile, "opc %02x ra %d rb %d rc %d disp16 %04x\n",
569
                opc, ra, rb, rc, disp16);
570
    }
571
#endif
572
    switch (opc) {
573
    case 0x00:
574
        /* CALL_PAL */
575
        if (palcode >= 0x80 && palcode < 0xC0) {
576
            /* Unprivileged PAL call */
577
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x1F) << 6), 0);
578
#if !defined (CONFIG_USER_ONLY)
579
        } else if (palcode < 0x40) {
580
            /* Privileged PAL code */
581
            if (ctx->mem_idx & 1)
582
                goto invalid_opc;
583
            else
584
                gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x1F) << 6), 0);
585
#endif
586
        } else {
587
            /* Invalid PAL call */
588
            goto invalid_opc;
589
        }
590
        ret = 3;
591
        break;
592
    case 0x01:
593
        /* OPC01 */
594
        goto invalid_opc;
595
    case 0x02:
596
        /* OPC02 */
597
        goto invalid_opc;
598
    case 0x03:
599
        /* OPC03 */
600
        goto invalid_opc;
601
    case 0x04:
602
        /* OPC04 */
603
        goto invalid_opc;
604
    case 0x05:
605
        /* OPC05 */
606
        goto invalid_opc;
607
    case 0x06:
608
        /* OPC06 */
609
        goto invalid_opc;
610
    case 0x07:
611
        /* OPC07 */
612
        goto invalid_opc;
613
    case 0x08:
614
        /* LDA */
615
        if (ra != 31) {
616
            if (rb != 31)
617
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
618
            else
619
                tcg_gen_movi_i64(cpu_ir[ra], disp16);
620
        }
621
        break;
622
    case 0x09:
623
        /* LDAH */
624
        if (ra != 31) {
625
            if (rb != 31)
626
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
627
            else
628
                tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
629
        }
630
        break;
631
    case 0x0A:
632
        /* LDBU */
633
        if (!(ctx->amask & AMASK_BWX))
634
            goto invalid_opc;
635
        gen_load_mem(ctx, &gen_ldbu, ra, rb, disp16, 0);
636
        break;
637
    case 0x0B:
638
        /* LDQ_U */
639
        gen_load_mem(ctx, &gen_ldq_u, ra, rb, disp16, 1);
640
        break;
641
    case 0x0C:
642
        /* LDWU */
643
        if (!(ctx->amask & AMASK_BWX))
644
            goto invalid_opc;
645
        gen_load_mem(ctx, &gen_ldwu, ra, rb, disp16, 0);
646
        break;
647
    case 0x0D:
648
        /* STW */
649
        if (!(ctx->amask & AMASK_BWX))
650
            goto invalid_opc;
651
        gen_store_mem(ctx, &gen_stw, ra, rb, disp16, 0);
652
        break;
653
    case 0x0E:
654
        /* STB */
655
        if (!(ctx->amask & AMASK_BWX))
656
            goto invalid_opc;
657
        gen_store_mem(ctx, &gen_stb, ra, rb, disp16, 0);
658
        break;
659
    case 0x0F:
660
        /* STQ_U */
661
        gen_store_mem(ctx, &gen_stq_u, ra, rb, disp16, 1);
662
        break;
663
    case 0x10:
664
        switch (fn7) {
665
        case 0x00:
666
            /* ADDL */
667
            gen_arith3(ctx, &gen_op_addl, ra, rb, rc, islit, lit);
668
            break;
669
        case 0x02:
670
            /* S4ADDL */
671
            gen_arith3(ctx, &gen_s4addl, ra, rb, rc, islit, lit);
672
            break;
673
        case 0x09:
674
            /* SUBL */
675
            gen_arith3(ctx, &gen_op_subl, ra, rb, rc, islit, lit);
676
            break;
677
        case 0x0B:
678
            /* S4SUBL */
679
            gen_arith3(ctx, &gen_s4subl, ra, rb, rc, islit, lit);
680
            break;
681
        case 0x0F:
682
            /* CMPBGE */
683
            gen_arith3(ctx, &gen_op_cmpbge, ra, rb, rc, islit, lit);
684
            break;
685
        case 0x12:
686
            /* S8ADDL */
687
            gen_arith3(ctx, &gen_s8addl, ra, rb, rc, islit, lit);
688
            break;
689
        case 0x1B:
690
            /* S8SUBL */
691
            gen_arith3(ctx, &gen_s8subl, ra, rb, rc, islit, lit);
692
            break;
693
        case 0x1D:
694
            /* CMPULT */
695
            gen_arith3(ctx, &gen_op_cmpult, ra, rb, rc, islit, lit);
696
            break;
697
        case 0x20:
698
            /* ADDQ */
699
            gen_arith3(ctx, &gen_op_addq, ra, rb, rc, islit, lit);
700
            break;
701
        case 0x22:
702
            /* S4ADDQ */
703
            gen_arith3(ctx, &gen_s4addq, ra, rb, rc, islit, lit);
704
            break;
705
        case 0x29:
706
            /* SUBQ */
707
            gen_arith3(ctx, &gen_op_subq, ra, rb, rc, islit, lit);
708
            break;
709
        case 0x2B:
710
            /* S4SUBQ */
711
            gen_arith3(ctx, &gen_s4subq, ra, rb, rc, islit, lit);
712
            break;
713
        case 0x2D:
714
            /* CMPEQ */
715
            gen_arith3(ctx, &gen_op_cmpeq, ra, rb, rc, islit, lit);
716
            break;
717
        case 0x32:
718
            /* S8ADDQ */
719
            gen_arith3(ctx, &gen_s8addq, ra, rb, rc, islit, lit);
720
            break;
721
        case 0x3B:
722
            /* S8SUBQ */
723
            gen_arith3(ctx, &gen_s8subq, ra, rb, rc, islit, lit);
724
            break;
725
        case 0x3D:
726
            /* CMPULE */
727
            gen_arith3(ctx, &gen_op_cmpule, ra, rb, rc, islit, lit);
728
            break;
729
        case 0x40:
730
            /* ADDL/V */
731
            gen_arith3(ctx, &gen_op_addlv, ra, rb, rc, islit, lit);
732
            break;
733
        case 0x49:
734
            /* SUBL/V */
735
            gen_arith3(ctx, &gen_op_sublv, ra, rb, rc, islit, lit);
736
            break;
737
        case 0x4D:
738
            /* CMPLT */
739
            gen_arith3(ctx, &gen_op_cmplt, ra, rb, rc, islit, lit);
740
            break;
741
        case 0x60:
742
            /* ADDQ/V */
743
            gen_arith3(ctx, &gen_op_addqv, ra, rb, rc, islit, lit);
744
            break;
745
        case 0x69:
746
            /* SUBQ/V */
747
            gen_arith3(ctx, &gen_op_subqv, ra, rb, rc, islit, lit);
748
            break;
749
        case 0x6D:
750
            /* CMPLE */
751
            gen_arith3(ctx, &gen_op_cmple, ra, rb, rc, islit, lit);
752
            break;
753
        default:
754
            goto invalid_opc;
755
        }
756
        break;
757
    case 0x11:
758
        switch (fn7) {
759
        case 0x00:
760
            /* AND */
761
            gen_arith3(ctx, &gen_op_and, ra, rb, rc, islit, lit);
762
            break;
763
        case 0x08:
764
            /* BIC */
765
            gen_arith3(ctx, &gen_op_bic, ra, rb, rc, islit, lit);
766
            break;
767
        case 0x14:
768
            /* CMOVLBS */
769
            gen_cmov(ctx, &gen_op_cmplbs, ra, rb, rc, islit, lit);
770
            break;
771
        case 0x16:
772
            /* CMOVLBC */
773
            gen_cmov(ctx, &gen_op_cmplbc, ra, rb, rc, islit, lit);
774
            break;
775
        case 0x20:
776
            /* BIS */
777
            if (ra == rb || ra == 31 || rb == 31) {
778
                if (ra == 31 && rc == 31) {
779
                    /* NOP */
780
                    gen_op_nop();
781
                } else {
782
                    /* MOV */
783
                    if (rc != 31) {
784
                        if (rb != 31)
785
                            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
786
                        else
787
                            tcg_gen_movi_i64(cpu_ir[rc], 0);
788
                    }
789
                }
790
            } else {
791
                gen_arith3(ctx, &gen_op_bis, ra, rb, rc, islit, lit);
792
            }
793
            break;
794
        case 0x24:
795
            /* CMOVEQ */
796
            gen_cmov(ctx, &gen_op_cmpeqz, ra, rb, rc, islit, lit);
797
            break;
798
        case 0x26:
799
            /* CMOVNE */
800
            gen_cmov(ctx, &gen_op_cmpnez, ra, rb, rc, islit, lit);
801
            break;
802
        case 0x28:
803
            /* ORNOT */
804
            gen_arith3(ctx, &gen_op_ornot, ra, rb, rc, islit, lit);
805
            break;
806
        case 0x40:
807
            /* XOR */
808
            gen_arith3(ctx, &gen_op_xor, ra, rb, rc, islit, lit);
809
            break;
810
        case 0x44:
811
            /* CMOVLT */
812
            gen_cmov(ctx, &gen_op_cmpltz, ra, rb, rc, islit, lit);
813
            break;
814
        case 0x46:
815
            /* CMOVGE */
816
            gen_cmov(ctx, &gen_op_cmpgez, ra, rb, rc, islit, lit);
817
            break;
818
        case 0x48:
819
            /* EQV */
820
            gen_arith3(ctx, &gen_op_eqv, ra, rb, rc, islit, lit);
821
            break;
822
        case 0x61:
823
            /* AMASK */
824
            gen_arith2(ctx, &gen_amask, rb, rc, islit, lit);
825
            break;
826
        case 0x64:
827
            /* CMOVLE */
828
            gen_cmov(ctx, &gen_op_cmplez, ra, rb, rc, islit, lit);
829
            break;
830
        case 0x66:
831
            /* CMOVGT */
832
            gen_cmov(ctx, &gen_op_cmpgtz, ra, rb, rc, islit, lit);
833
            break;
834
        case 0x6C:
835
            /* IMPLVER */
836
            gen_op_load_implver();
837
            if (rc != 31)
838
                tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
839
            break;
840
        default:
841
            goto invalid_opc;
842
        }
843
        break;
844
    case 0x12:
845
        switch (fn7) {
846
        case 0x02:
847
            /* MSKBL */
848
            gen_arith3(ctx, &gen_op_mskbl, ra, rb, rc, islit, lit);
849
            break;
850
        case 0x06:
851
            /* EXTBL */
852
            gen_arith3(ctx, &gen_op_extbl, ra, rb, rc, islit, lit);
853
            break;
854
        case 0x0B:
855
            /* INSBL */
856
            gen_arith3(ctx, &gen_op_insbl, ra, rb, rc, islit, lit);
857
            break;
858
        case 0x12:
859
            /* MSKWL */
860
            gen_arith3(ctx, &gen_op_mskwl, ra, rb, rc, islit, lit);
861
            break;
862
        case 0x16:
863
            /* EXTWL */
864
            gen_arith3(ctx, &gen_op_extwl, ra, rb, rc, islit, lit);
865
            break;
866
        case 0x1B:
867
            /* INSWL */
868
            gen_arith3(ctx, &gen_op_inswl, ra, rb, rc, islit, lit);
869
            break;
870
        case 0x22:
871
            /* MSKLL */
872
            gen_arith3(ctx, &gen_op_mskll, ra, rb, rc, islit, lit);
873
            break;
874
        case 0x26:
875
            /* EXTLL */
876
            gen_arith3(ctx, &gen_op_extll, ra, rb, rc, islit, lit);
877
            break;
878
        case 0x2B:
879
            /* INSLL */
880
            gen_arith3(ctx, &gen_op_insll, ra, rb, rc, islit, lit);
881
            break;
882
        case 0x30:
883
            /* ZAP */
884
            gen_arith3(ctx, &gen_op_zap, ra, rb, rc, islit, lit);
885
            break;
886
        case 0x31:
887
            /* ZAPNOT */
888
            gen_arith3(ctx, &gen_op_zapnot, ra, rb, rc, islit, lit);
889
            break;
890
        case 0x32:
891
            /* MSKQL */
892
            gen_arith3(ctx, &gen_op_mskql, ra, rb, rc, islit, lit);
893
            break;
894
        case 0x34:
895
            /* SRL */
896
            gen_arith3(ctx, &gen_op_srl, ra, rb, rc, islit, lit);
897
            break;
898
        case 0x36:
899
            /* EXTQL */
900
            gen_arith3(ctx, &gen_op_extql, ra, rb, rc, islit, lit);
901
            break;
902
        case 0x39:
903
            /* SLL */
904
            gen_arith3(ctx, &gen_op_sll, ra, rb, rc, islit, lit);
905
            break;
906
        case 0x3B:
907
            /* INSQL */
908
            gen_arith3(ctx, &gen_op_insql, ra, rb, rc, islit, lit);
909
            break;
910
        case 0x3C:
911
            /* SRA */
912
            gen_arith3(ctx, &gen_op_sra, ra, rb, rc, islit, lit);
913
            break;
914
        case 0x52:
915
            /* MSKWH */
916
            gen_arith3(ctx, &gen_op_mskwh, ra, rb, rc, islit, lit);
917
            break;
918
        case 0x57:
919
            /* INSWH */
920
            gen_arith3(ctx, &gen_op_inswh, ra, rb, rc, islit, lit);
921
            break;
922
        case 0x5A:
923
            /* EXTWH */
924
            gen_arith3(ctx, &gen_op_extwh, ra, rb, rc, islit, lit);
925
            break;
926
        case 0x62:
927
            /* MSKLH */
928
            gen_arith3(ctx, &gen_op_msklh, ra, rb, rc, islit, lit);
929
            break;
930
        case 0x67:
931
            /* INSLH */
932
            gen_arith3(ctx, &gen_op_inslh, ra, rb, rc, islit, lit);
933
            break;
934
        case 0x6A:
935
            /* EXTLH */
936
            gen_arith3(ctx, &gen_op_extlh, ra, rb, rc, islit, lit);
937
            break;
938
        case 0x72:
939
            /* MSKQH */
940
            gen_arith3(ctx, &gen_op_mskqh, ra, rb, rc, islit, lit);
941
            break;
942
        case 0x77:
943
            /* INSQH */
944
            gen_arith3(ctx, &gen_op_insqh, ra, rb, rc, islit, lit);
945
            break;
946
        case 0x7A:
947
            /* EXTQH */
948
            gen_arith3(ctx, &gen_op_extqh, ra, rb, rc, islit, lit);
949
            break;
950
        default:
951
            goto invalid_opc;
952
        }
953
        break;
954
    case 0x13:
955
        switch (fn7) {
956
        case 0x00:
957
            /* MULL */
958
            gen_arith3(ctx, &gen_op_mull, ra, rb, rc, islit, lit);
959
            break;
960
        case 0x20:
961
            /* MULQ */
962
            gen_arith3(ctx, &gen_op_mulq, ra, rb, rc, islit, lit);
963
            break;
964
        case 0x30:
965
            /* UMULH */
966
            gen_arith3(ctx, &gen_op_umulh, ra, rb, rc, islit, lit);
967
            break;
968
        case 0x40:
969
            /* MULL/V */
970
            gen_arith3(ctx, &gen_op_mullv, ra, rb, rc, islit, lit);
971
            break;
972
        case 0x60:
973
            /* MULQ/V */
974
            gen_arith3(ctx, &gen_op_mulqv, ra, rb, rc, islit, lit);
975
            break;
976
        default:
977
            goto invalid_opc;
978
        }
979
        break;
980
    case 0x14:
981
        switch (fpfn) { /* f11 & 0x3F */
982
        case 0x04:
983
            /* ITOFS */
984
            if (!(ctx->amask & AMASK_FIX))
985
                goto invalid_opc;
986
            gen_itf(ctx, &gen_op_itofs, ra, rc);
987
            break;
988
        case 0x0A:
989
            /* SQRTF */
990
            if (!(ctx->amask & AMASK_FIX))
991
                goto invalid_opc;
992
            gen_farith2(ctx, &gen_op_sqrtf, rb, rc);
993
            break;
994
        case 0x0B:
995
            /* SQRTS */
996
            if (!(ctx->amask & AMASK_FIX))
997
                goto invalid_opc;
998
            gen_farith2(ctx, &gen_op_sqrts, rb, rc);
999
            break;
1000
        case 0x14:
1001
            /* ITOFF */
1002
            if (!(ctx->amask & AMASK_FIX))
1003
                goto invalid_opc;
1004
#if 0 // TODO
1005
            gen_itf(ctx, &gen_op_itoff, ra, rc);
1006
#else
1007
            goto invalid_opc;
1008
#endif
1009
            break;
1010
        case 0x24:
1011
            /* ITOFT */
1012
            if (!(ctx->amask & AMASK_FIX))
1013
                goto invalid_opc;
1014
            gen_itf(ctx, &gen_op_itoft, ra, rc);
1015
            break;
1016
        case 0x2A:
1017
            /* SQRTG */
1018
            if (!(ctx->amask & AMASK_FIX))
1019
                goto invalid_opc;
1020
            gen_farith2(ctx, &gen_op_sqrtg, rb, rc);
1021
            break;
1022
        case 0x02B:
1023
            /* SQRTT */
1024
            if (!(ctx->amask & AMASK_FIX))
1025
                goto invalid_opc;
1026
            gen_farith2(ctx, &gen_op_sqrtt, rb, rc);
1027
            break;
1028
        default:
1029
            goto invalid_opc;
1030
        }
1031
        break;
1032
    case 0x15:
1033
        /* VAX floating point */
1034
        /* XXX: rounding mode and trap are ignored (!) */
1035
        switch (fpfn) { /* f11 & 0x3F */
1036
        case 0x00:
1037
            /* ADDF */
1038
            gen_farith3(ctx, &gen_op_addf, ra, rb, rc);
1039
            break;
1040
        case 0x01:
1041
            /* SUBF */
1042
            gen_farith3(ctx, &gen_op_subf, ra, rb, rc);
1043
            break;
1044
        case 0x02:
1045
            /* MULF */
1046
            gen_farith3(ctx, &gen_op_mulf, ra, rb, rc);
1047
            break;
1048
        case 0x03:
1049
            /* DIVF */
1050
            gen_farith3(ctx, &gen_op_divf, ra, rb, rc);
1051
            break;
1052
        case 0x1E:
1053
            /* CVTDG */
1054
#if 0 // TODO
1055
            gen_farith2(ctx, &gen_op_cvtdg, rb, rc);
1056
#else
1057
            goto invalid_opc;
1058
#endif
1059
            break;
1060
        case 0x20:
1061
            /* ADDG */
1062
            gen_farith3(ctx, &gen_op_addg, ra, rb, rc);
1063
            break;
1064
        case 0x21:
1065
            /* SUBG */
1066
            gen_farith3(ctx, &gen_op_subg, ra, rb, rc);
1067
            break;
1068
        case 0x22:
1069
            /* MULG */
1070
            gen_farith3(ctx, &gen_op_mulg, ra, rb, rc);
1071
            break;
1072
        case 0x23:
1073
            /* DIVG */
1074
            gen_farith3(ctx, &gen_op_divg, ra, rb, rc);
1075
            break;
1076
        case 0x25:
1077
            /* CMPGEQ */
1078
            gen_farith3(ctx, &gen_op_cmpgeq, ra, rb, rc);
1079
            break;
1080
        case 0x26:
1081
            /* CMPGLT */
1082
            gen_farith3(ctx, &gen_op_cmpglt, ra, rb, rc);
1083
            break;
1084
        case 0x27:
1085
            /* CMPGLE */
1086
            gen_farith3(ctx, &gen_op_cmpgle, ra, rb, rc);
1087
            break;
1088
        case 0x2C:
1089
            /* CVTGF */
1090
            gen_farith2(ctx, &gen_op_cvtgf, rb, rc);
1091
            break;
1092
        case 0x2D:
1093
            /* CVTGD */
1094
#if 0 // TODO
1095
            gen_farith2(ctx, &gen_op_cvtgd, rb, rc);
1096
#else
1097
            goto invalid_opc;
1098
#endif
1099
            break;
1100
        case 0x2F:
1101
            /* CVTGQ */
1102
            gen_farith2(ctx, &gen_op_cvtgq, rb, rc);
1103
            break;
1104
        case 0x3C:
1105
            /* CVTQF */
1106
            gen_farith2(ctx, &gen_op_cvtqf, rb, rc);
1107
            break;
1108
        case 0x3E:
1109
            /* CVTQG */
1110
            gen_farith2(ctx, &gen_op_cvtqg, rb, rc);
1111
            break;
1112
        default:
1113
            goto invalid_opc;
1114
        }
1115
        break;
1116
    case 0x16:
1117
        /* IEEE floating-point */
1118
        /* XXX: rounding mode and traps are ignored (!) */
1119
        switch (fpfn) { /* f11 & 0x3F */
1120
        case 0x00:
1121
            /* ADDS */
1122
            gen_farith3(ctx, &gen_op_adds, ra, rb, rc);
1123
            break;
1124
        case 0x01:
1125
            /* SUBS */
1126
            gen_farith3(ctx, &gen_op_subs, ra, rb, rc);
1127
            break;
1128
        case 0x02:
1129
            /* MULS */
1130
            gen_farith3(ctx, &gen_op_muls, ra, rb, rc);
1131
            break;
1132
        case 0x03:
1133
            /* DIVS */
1134
            gen_farith3(ctx, &gen_op_divs, ra, rb, rc);
1135
            break;
1136
        case 0x20:
1137
            /* ADDT */
1138
            gen_farith3(ctx, &gen_op_addt, ra, rb, rc);
1139
            break;
1140
        case 0x21:
1141
            /* SUBT */
1142
            gen_farith3(ctx, &gen_op_subt, ra, rb, rc);
1143
            break;
1144
        case 0x22:
1145
            /* MULT */
1146
            gen_farith3(ctx, &gen_op_mult, ra, rb, rc);
1147
            break;
1148
        case 0x23:
1149
            /* DIVT */
1150
            gen_farith3(ctx, &gen_op_divt, ra, rb, rc);
1151
            break;
1152
        case 0x24:
1153
            /* CMPTUN */
1154
            gen_farith3(ctx, &gen_op_cmptun, ra, rb, rc);
1155
            break;
1156
        case 0x25:
1157
            /* CMPTEQ */
1158
            gen_farith3(ctx, &gen_op_cmpteq, ra, rb, rc);
1159
            break;
1160
        case 0x26:
1161
            /* CMPTLT */
1162
            gen_farith3(ctx, &gen_op_cmptlt, ra, rb, rc);
1163
            break;
1164
        case 0x27:
1165
            /* CMPTLE */
1166
            gen_farith3(ctx, &gen_op_cmptle, ra, rb, rc);
1167
            break;
1168
        case 0x2C:
1169
            /* XXX: incorrect */
1170
            if (fn11 == 0x2AC) {
1171
                /* CVTST */
1172
                gen_farith2(ctx, &gen_op_cvtst, rb, rc);
1173
            } else {
1174
                /* CVTTS */
1175
                gen_farith2(ctx, &gen_op_cvtts, rb, rc);
1176
            }
1177
            break;
1178
        case 0x2F:
1179
            /* CVTTQ */
1180
            gen_farith2(ctx, &gen_op_cvttq, rb, rc);
1181
            break;
1182
        case 0x3C:
1183
            /* CVTQS */
1184
            gen_farith2(ctx, &gen_op_cvtqs, rb, rc);
1185
            break;
1186
        case 0x3E:
1187
            /* CVTQT */
1188
            gen_farith2(ctx, &gen_op_cvtqt, rb, rc);
1189
            break;
1190
        default:
1191
            goto invalid_opc;
1192
        }
1193
        break;
1194
    case 0x17:
1195
        switch (fn11) {
1196
        case 0x010:
1197
            /* CVTLQ */
1198
            gen_farith2(ctx, &gen_op_cvtlq, rb, rc);
1199
            break;
1200
        case 0x020:
1201
            /* CPYS */
1202
            if (ra == rb) {
1203
                if (ra == 31 && rc == 31) {
1204
                    /* FNOP */
1205
                    gen_op_nop();
1206
                } else {
1207
                    /* FMOV */
1208
                    gen_load_fir(ctx, rb, 0);
1209
                    gen_store_fir(ctx, rc, 0);
1210
                }
1211
            } else {
1212
                gen_farith3(ctx, &gen_op_cpys, ra, rb, rc);
1213
            }
1214
            break;
1215
        case 0x021:
1216
            /* CPYSN */
1217
            gen_farith2(ctx, &gen_op_cpysn, rb, rc);
1218
            break;
1219
        case 0x022:
1220
            /* CPYSE */
1221
            gen_farith2(ctx, &gen_op_cpyse, rb, rc);
1222
            break;
1223
        case 0x024:
1224
            /* MT_FPCR */
1225
            gen_load_fir(ctx, ra, 0);
1226
            gen_op_store_fpcr();
1227
            break;
1228
        case 0x025:
1229
            /* MF_FPCR */
1230
            gen_op_load_fpcr();
1231
            gen_store_fir(ctx, ra, 0);
1232
            break;
1233
        case 0x02A:
1234
            /* FCMOVEQ */
1235
            gen_fcmov(ctx, &gen_op_cmpfeq, ra, rb, rc);
1236
            break;
1237
        case 0x02B:
1238
            /* FCMOVNE */
1239
            gen_fcmov(ctx, &gen_op_cmpfne, ra, rb, rc);
1240
            break;
1241
        case 0x02C:
1242
            /* FCMOVLT */
1243
            gen_fcmov(ctx, &gen_op_cmpflt, ra, rb, rc);
1244
            break;
1245
        case 0x02D:
1246
            /* FCMOVGE */
1247
            gen_fcmov(ctx, &gen_op_cmpfge, ra, rb, rc);
1248
            break;
1249
        case 0x02E:
1250
            /* FCMOVLE */
1251
            gen_fcmov(ctx, &gen_op_cmpfle, ra, rb, rc);
1252
            break;
1253
        case 0x02F:
1254
            /* FCMOVGT */
1255
            gen_fcmov(ctx, &gen_op_cmpfgt, ra, rb, rc);
1256
            break;
1257
        case 0x030:
1258
            /* CVTQL */
1259
            gen_farith2(ctx, &gen_op_cvtql, rb, rc);
1260
            break;
1261
        case 0x130:
1262
            /* CVTQL/V */
1263
            gen_farith2(ctx, &gen_op_cvtqlv, rb, rc);
1264
            break;
1265
        case 0x530:
1266
            /* CVTQL/SV */
1267
            gen_farith2(ctx, &gen_op_cvtqlsv, rb, rc);
1268
            break;
1269
        default:
1270
            goto invalid_opc;
1271
        }
1272
        break;
1273
    case 0x18:
1274
        switch ((uint16_t)disp16) {
1275
        case 0x0000:
1276
            /* TRAPB */
1277
            /* No-op. Just exit from the current tb */
1278
            ret = 2;
1279
            break;
1280
        case 0x0400:
1281
            /* EXCB */
1282
            /* No-op. Just exit from the current tb */
1283
            ret = 2;
1284
            break;
1285
        case 0x4000:
1286
            /* MB */
1287
            /* No-op */
1288
            break;
1289
        case 0x4400:
1290
            /* WMB */
1291
            /* No-op */
1292
            break;
1293
        case 0x8000:
1294
            /* FETCH */
1295
            /* No-op */
1296
            break;
1297
        case 0xA000:
1298
            /* FETCH_M */
1299
            /* No-op */
1300
            break;
1301
        case 0xC000:
1302
            /* RPCC */
1303
            gen_op_load_pcc();
1304
            if (ra != 31)
1305
                tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1306
            break;
1307
        case 0xE000:
1308
            /* RC */
1309
            gen_op_load_irf();
1310
            if (ra != 31)
1311
                tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1312
            gen_op_clear_irf();
1313
            break;
1314
        case 0xE800:
1315
            /* ECB */
1316
            /* XXX: TODO: evict tb cache at address rb */
1317
#if 0
1318
            ret = 2;
1319
#else
1320
            goto invalid_opc;
1321
#endif
1322
            break;
1323
        case 0xF000:
1324
            /* RS */
1325
            gen_op_load_irf();
1326
            if (ra != 31)
1327
                tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1328
            gen_op_set_irf();
1329
            break;
1330
        case 0xF800:
1331
            /* WH64 */
1332
            /* No-op */
1333
            break;
1334
        default:
1335
            goto invalid_opc;
1336
        }
1337
        break;
1338
    case 0x19:
1339
        /* HW_MFPR (PALcode) */
1340
#if defined (CONFIG_USER_ONLY)
1341
        goto invalid_opc;
1342
#else
1343
        if (!ctx->pal_mode)
1344
            goto invalid_opc;
1345
        gen_op_mfpr(insn & 0xFF);
1346
        if (ra != 31)
1347
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1348
        break;
1349
#endif
1350
    case 0x1A:
1351
        if (ra != 31)
1352
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1353
        if (rb != 31)
1354
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1355
        else
1356
            tcg_gen_movi_i64(cpu_pc, 0);
1357
        /* Those four jumps only differ by the branch prediction hint */
1358
        switch (fn2) {
1359
        case 0x0:
1360
            /* JMP */
1361
            break;
1362
        case 0x1:
1363
            /* JSR */
1364
            break;
1365
        case 0x2:
1366
            /* RET */
1367
            break;
1368
        case 0x3:
1369
            /* JSR_COROUTINE */
1370
            break;
1371
        }
1372
        ret = 1;
1373
        break;
1374
    case 0x1B:
1375
        /* HW_LD (PALcode) */
1376
#if defined (CONFIG_USER_ONLY)
1377
        goto invalid_opc;
1378
#else
1379
        if (!ctx->pal_mode)
1380
            goto invalid_opc;
1381
        if (rb != 31)
1382
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1383
        else
1384
            tcg_gen_movi_i64(cpu_T[0], 0);
1385
        tcg_gen_movi_i64(cpu_T[1], disp12);
1386
        gen_op_addq();
1387
        switch ((insn >> 12) & 0xF) {
1388
        case 0x0:
1389
            /* Longword physical access */
1390
            gen_op_ldl_raw();
1391
            break;
1392
        case 0x1:
1393
            /* Quadword physical access */
1394
            gen_op_ldq_raw();
1395
            break;
1396
        case 0x2:
1397
            /* Longword physical access with lock */
1398
            gen_op_ldl_l_raw();
1399
            break;
1400
        case 0x3:
1401
            /* Quadword physical access with lock */
1402
            gen_op_ldq_l_raw();
1403
            break;
1404
        case 0x4:
1405
            /* Longword virtual PTE fetch */
1406
            gen_op_ldl_kernel();
1407
            break;
1408
        case 0x5:
1409
            /* Quadword virtual PTE fetch */
1410
            gen_op_ldq_kernel();
1411
            break;
1412
        case 0x6:
1413
            /* Invalid */
1414
            goto invalid_opc;
1415
        case 0x7:
1416
            /* Invalid */
1417
            goto invalid_opc;
1418
        case 0x8:
1419
            /* Longword virtual access */
1420
            gen_op_ld_phys_to_virt();
1421
            gen_op_ldl_raw();
1422
            break;
1423
        case 0x9:
1424
            /* Quadword virtual access */
1425
            gen_op_ld_phys_to_virt();
1426
            gen_op_ldq_raw();
1427
            break;
1428
        case 0xA:
1429
            /* Longword virtual access with protection check */
1430
            gen_ldl(ctx);
1431
            break;
1432
        case 0xB:
1433
            /* Quadword virtual access with protection check */
1434
            gen_ldq(ctx);
1435
            break;
1436
        case 0xC:
1437
            /* Longword virtual access with altenate access mode */
1438
            gen_op_set_alt_mode();
1439
            gen_op_ld_phys_to_virt();
1440
            gen_op_ldl_raw();
1441
            gen_op_restore_mode();
1442
            break;
1443
        case 0xD:
1444
            /* Quadword virtual access with altenate access mode */
1445
            gen_op_set_alt_mode();
1446
            gen_op_ld_phys_to_virt();
1447
            gen_op_ldq_raw();
1448
            gen_op_restore_mode();
1449
            break;
1450
        case 0xE:
1451
            /* Longword virtual access with alternate access mode and
1452
             * protection checks
1453
             */
1454
            gen_op_set_alt_mode();
1455
            gen_op_ldl_data();
1456
            gen_op_restore_mode();
1457
            break;
1458
        case 0xF:
1459
            /* Quadword virtual access with alternate access mode and
1460
             * protection checks
1461
             */
1462
            gen_op_set_alt_mode();
1463
            gen_op_ldq_data();
1464
            gen_op_restore_mode();
1465
            break;
1466
        }
1467
        if (ra != 31)
1468
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1469
        break;
1470
#endif
1471
    case 0x1C:
1472
        switch (fn7) {
1473
        case 0x00:
1474
            /* SEXTB */
1475
            if (!(ctx->amask & AMASK_BWX))
1476
                goto invalid_opc;
1477
            gen_arith2(ctx, &gen_op_sextb, rb, rc, islit, lit);
1478
            break;
1479
        case 0x01:
1480
            /* SEXTW */
1481
            if (!(ctx->amask & AMASK_BWX))
1482
                goto invalid_opc;
1483
            gen_arith2(ctx, &gen_op_sextw, rb, rc, islit, lit);
1484
            break;
1485
        case 0x30:
1486
            /* CTPOP */
1487
            if (!(ctx->amask & AMASK_CIX))
1488
                goto invalid_opc;
1489
            gen_arith2(ctx, &gen_op_ctpop, rb, rc, 0, 0);
1490
            break;
1491
        case 0x31:
1492
            /* PERR */
1493
            if (!(ctx->amask & AMASK_MVI))
1494
                goto invalid_opc;
1495
            /* XXX: TODO */
1496
            goto invalid_opc;
1497
            break;
1498
        case 0x32:
1499
            /* CTLZ */
1500
            if (!(ctx->amask & AMASK_CIX))
1501
                goto invalid_opc;
1502
            gen_arith2(ctx, &gen_op_ctlz, rb, rc, 0, 0);
1503
            break;
1504
        case 0x33:
1505
            /* CTTZ */
1506
            if (!(ctx->amask & AMASK_CIX))
1507
                goto invalid_opc;
1508
            gen_arith2(ctx, &gen_op_cttz, rb, rc, 0, 0);
1509
            break;
1510
        case 0x34:
1511
            /* UNPKBW */
1512
            if (!(ctx->amask & AMASK_MVI))
1513
                goto invalid_opc;
1514
            /* XXX: TODO */
1515
            goto invalid_opc;
1516
            break;
1517
        case 0x35:
1518
            /* UNPKWL */
1519
            if (!(ctx->amask & AMASK_MVI))
1520
                goto invalid_opc;
1521
            /* XXX: TODO */
1522
            goto invalid_opc;
1523
            break;
1524
        case 0x36:
1525
            /* PKWB */
1526
            if (!(ctx->amask & AMASK_MVI))
1527
                goto invalid_opc;
1528
            /* XXX: TODO */
1529
            goto invalid_opc;
1530
            break;
1531
        case 0x37:
1532
            /* PKLB */
1533
            if (!(ctx->amask & AMASK_MVI))
1534
                goto invalid_opc;
1535
            /* XXX: TODO */
1536
            goto invalid_opc;
1537
            break;
1538
        case 0x38:
1539
            /* MINSB8 */
1540
            if (!(ctx->amask & AMASK_MVI))
1541
                goto invalid_opc;
1542
            /* XXX: TODO */
1543
            goto invalid_opc;
1544
            break;
1545
        case 0x39:
1546
            /* MINSW4 */
1547
            if (!(ctx->amask & AMASK_MVI))
1548
                goto invalid_opc;
1549
            /* XXX: TODO */
1550
            goto invalid_opc;
1551
            break;
1552
        case 0x3A:
1553
            /* MINUB8 */
1554
            if (!(ctx->amask & AMASK_MVI))
1555
                goto invalid_opc;
1556
            /* XXX: TODO */
1557
            goto invalid_opc;
1558
            break;
1559
        case 0x3B:
1560
            /* MINUW4 */
1561
            if (!(ctx->amask & AMASK_MVI))
1562
                goto invalid_opc;
1563
            /* XXX: TODO */
1564
            goto invalid_opc;
1565
            break;
1566
        case 0x3C:
1567
            /* MAXUB8 */
1568
            if (!(ctx->amask & AMASK_MVI))
1569
                goto invalid_opc;
1570
            /* XXX: TODO */
1571
            goto invalid_opc;
1572
            break;
1573
        case 0x3D:
1574
            /* MAXUW4 */
1575
            if (!(ctx->amask & AMASK_MVI))
1576
                goto invalid_opc;
1577
            /* XXX: TODO */
1578
            goto invalid_opc;
1579
            break;
1580
        case 0x3E:
1581
            /* MAXSB8 */
1582
            if (!(ctx->amask & AMASK_MVI))
1583
                goto invalid_opc;
1584
            /* XXX: TODO */
1585
            goto invalid_opc;
1586
            break;
1587
        case 0x3F:
1588
            /* MAXSW4 */
1589
            if (!(ctx->amask & AMASK_MVI))
1590
                goto invalid_opc;
1591
            /* XXX: TODO */
1592
            goto invalid_opc;
1593
            break;
1594
        case 0x70:
1595
            /* FTOIT */
1596
            if (!(ctx->amask & AMASK_FIX))
1597
                goto invalid_opc;
1598
            gen_fti(ctx, &gen_op_ftoit, ra, rb);
1599
            break;
1600
        case 0x78:
1601
            /* FTOIS */
1602
            if (!(ctx->amask & AMASK_FIX))
1603
                goto invalid_opc;
1604
            gen_fti(ctx, &gen_op_ftois, ra, rb);
1605
            break;
1606
        default:
1607
            goto invalid_opc;
1608
        }
1609
        break;
1610
    case 0x1D:
1611
        /* HW_MTPR (PALcode) */
1612
#if defined (CONFIG_USER_ONLY)
1613
        goto invalid_opc;
1614
#else
1615
        if (!ctx->pal_mode)
1616
            goto invalid_opc;
1617
        if (ra != 31)
1618
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
1619
        else
1620
            tcg_gen_movi_i64(cpu_T[0], 0);
1621
        gen_op_mtpr(insn & 0xFF);
1622
        ret = 2;
1623
        break;
1624
#endif
1625
    case 0x1E:
1626
        /* HW_REI (PALcode) */
1627
#if defined (CONFIG_USER_ONLY)
1628
        goto invalid_opc;
1629
#else
1630
        if (!ctx->pal_mode)
1631
            goto invalid_opc;
1632
        if (rb == 31) {
1633
            /* "Old" alpha */
1634
            gen_op_hw_rei();
1635
        } else {
1636
            if (ra != 31)
1637
                tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1638
            else
1639
                tcg_gen_movi_i64(cpu_T[0], 0);
1640
            tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
1641
            gen_op_addq();
1642
            gen_op_hw_ret();
1643
        }
1644
        ret = 2;
1645
        break;
1646
#endif
1647
    case 0x1F:
1648
        /* HW_ST (PALcode) */
1649
#if defined (CONFIG_USER_ONLY)
1650
        goto invalid_opc;
1651
#else
1652
        if (!ctx->pal_mode)
1653
            goto invalid_opc;
1654
        if (ra != 31)
1655
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1656
        else
1657
            tcg_gen_movi_i64(cpu_T[0], 0);
1658
        tcg_gen_movi_i64(cpu_T[1], disp12);
1659
        gen_op_addq();
1660
        if (ra != 31)
1661
            tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
1662
        else
1663
            tcg_gen_movi_i64(cpu_T[1], 0);
1664
        switch ((insn >> 12) & 0xF) {
1665
        case 0x0:
1666
            /* Longword physical access */
1667
            gen_op_stl_raw();
1668
            break;
1669
        case 0x1:
1670
            /* Quadword physical access */
1671
            gen_op_stq_raw();
1672
            break;
1673
        case 0x2:
1674
            /* Longword physical access with lock */
1675
            gen_op_stl_c_raw();
1676
            break;
1677
        case 0x3:
1678
            /* Quadword physical access with lock */
1679
            gen_op_stq_c_raw();
1680
            break;
1681
        case 0x4:
1682
            /* Longword virtual access */
1683
            gen_op_st_phys_to_virt();
1684
            gen_op_stl_raw();
1685
            break;
1686
        case 0x5:
1687
            /* Quadword virtual access */
1688
            gen_op_st_phys_to_virt();
1689
            gen_op_stq_raw();
1690
            break;
1691
        case 0x6:
1692
            /* Invalid */
1693
            goto invalid_opc;
1694
        case 0x7:
1695
            /* Invalid */
1696
            goto invalid_opc;
1697
        case 0x8:
1698
            /* Invalid */
1699
            goto invalid_opc;
1700
        case 0x9:
1701
            /* Invalid */
1702
            goto invalid_opc;
1703
        case 0xA:
1704
            /* Invalid */
1705
            goto invalid_opc;
1706
        case 0xB:
1707
            /* Invalid */
1708
            goto invalid_opc;
1709
        case 0xC:
1710
            /* Longword virtual access with alternate access mode */
1711
            gen_op_set_alt_mode();
1712
            gen_op_st_phys_to_virt();
1713
            gen_op_ldl_raw();
1714
            gen_op_restore_mode();
1715
            break;
1716
        case 0xD:
1717
            /* Quadword virtual access with alternate access mode */
1718
            gen_op_set_alt_mode();
1719
            gen_op_st_phys_to_virt();
1720
            gen_op_ldq_raw();
1721
            gen_op_restore_mode();
1722
            break;
1723
        case 0xE:
1724
            /* Invalid */
1725
            goto invalid_opc;
1726
        case 0xF:
1727
            /* Invalid */
1728
            goto invalid_opc;
1729
        }
1730
        ret = 2;
1731
        break;
1732
#endif
1733
    case 0x20:
1734
        /* LDF */
1735
#if 0 // TODO
1736
        gen_load_fmem(ctx, &gen_ldf, ra, rb, disp16);
1737
#else
1738
        goto invalid_opc;
1739
#endif
1740
        break;
1741
    case 0x21:
1742
        /* LDG */
1743
#if 0 // TODO
1744
        gen_load_fmem(ctx, &gen_ldg, ra, rb, disp16);
1745
#else
1746
        goto invalid_opc;
1747
#endif
1748
        break;
1749
    case 0x22:
1750
        /* LDS */
1751
        gen_load_fmem(ctx, &gen_lds, ra, rb, disp16);
1752
        break;
1753
    case 0x23:
1754
        /* LDT */
1755
        gen_load_fmem(ctx, &gen_ldt, ra, rb, disp16);
1756
        break;
1757
    case 0x24:
1758
        /* STF */
1759
#if 0 // TODO
1760
        gen_store_fmem(ctx, &gen_stf, ra, rb, disp16);
1761
#else
1762
        goto invalid_opc;
1763
#endif
1764
        break;
1765
    case 0x25:
1766
        /* STG */
1767
#if 0 // TODO
1768
        gen_store_fmem(ctx, &gen_stg, ra, rb, disp16);
1769
#else
1770
        goto invalid_opc;
1771
#endif
1772
        break;
1773
    case 0x26:
1774
        /* STS */
1775
        gen_store_fmem(ctx, &gen_sts, ra, rb, disp16);
1776
        break;
1777
    case 0x27:
1778
        /* STT */
1779
        gen_store_fmem(ctx, &gen_stt, ra, rb, disp16);
1780
        break;
1781
    case 0x28:
1782
        /* LDL */
1783
        gen_load_mem(ctx, &gen_ldl, ra, rb, disp16, 0);
1784
        break;
1785
    case 0x29:
1786
        /* LDQ */
1787
        gen_load_mem(ctx, &gen_ldq, ra, rb, disp16, 0);
1788
        break;
1789
    case 0x2A:
1790
        /* LDL_L */
1791
        gen_load_mem(ctx, &gen_ldl_l, ra, rb, disp16, 0);
1792
        break;
1793
    case 0x2B:
1794
        /* LDQ_L */
1795
        gen_load_mem(ctx, &gen_ldq_l, ra, rb, disp16, 0);
1796
        break;
1797
    case 0x2C:
1798
        /* STL */
1799
        gen_store_mem(ctx, &gen_stl, ra, rb, disp16, 0);
1800
        break;
1801
    case 0x2D:
1802
        /* STQ */
1803
        gen_store_mem(ctx, &gen_stq, ra, rb, disp16, 0);
1804
        break;
1805
    case 0x2E:
1806
        /* STL_C */
1807
        gen_store_mem(ctx, &gen_stl_c, ra, rb, disp16, 0);
1808
        break;
1809
    case 0x2F:
1810
        /* STQ_C */
1811
        gen_store_mem(ctx, &gen_stq_c, ra, rb, disp16, 0);
1812
        break;
1813
    case 0x30:
1814
        /* BR */
1815
        if (ra != 31)
1816
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1817
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
1818
        ret = 1;
1819
        break;
1820
    case 0x31:
1821
        /* FBEQ */
1822
        gen_fbcond(ctx, &gen_op_cmpfeq, ra, disp16);
1823
        ret = 1;
1824
        break;
1825
    case 0x32:
1826
        /* FBLT */
1827
        gen_fbcond(ctx, &gen_op_cmpflt, ra, disp16);
1828
        ret = 1;
1829
        break;
1830
    case 0x33:
1831
        /* FBLE */
1832
        gen_fbcond(ctx, &gen_op_cmpfle, ra, disp16);
1833
        ret = 1;
1834
        break;
1835
    case 0x34:
1836
        /* BSR */
1837
        if (ra != 31)
1838
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1839
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
1840
        ret = 1;
1841
        break;
1842
    case 0x35:
1843
        /* FBNE */
1844
        gen_fbcond(ctx, &gen_op_cmpfne, ra, disp16);
1845
        ret = 1;
1846
        break;
1847
    case 0x36:
1848
        /* FBGE */
1849
        gen_fbcond(ctx, &gen_op_cmpfge, ra, disp16);
1850
        ret = 1;
1851
        break;
1852
    case 0x37:
1853
        /* FBGT */
1854
        gen_fbcond(ctx, &gen_op_cmpfgt, ra, disp16);
1855
        ret = 1;
1856
        break;
1857
    case 0x38:
1858
        /* BLBC */
1859
        gen_bcond(ctx, &gen_op_cmplbc, ra, disp16);
1860
        ret = 1;
1861
        break;
1862
    case 0x39:
1863
        /* BEQ */
1864
        gen_bcond(ctx, &gen_op_cmpeqz, ra, disp16);
1865
        ret = 1;
1866
        break;
1867
    case 0x3A:
1868
        /* BLT */
1869
        gen_bcond(ctx, &gen_op_cmpltz, ra, disp16);
1870
        ret = 1;
1871
        break;
1872
    case 0x3B:
1873
        /* BLE */
1874
        gen_bcond(ctx, &gen_op_cmplez, ra, disp16);
1875
        ret = 1;
1876
        break;
1877
    case 0x3C:
1878
        /* BLBS */
1879
        gen_bcond(ctx, &gen_op_cmplbs, ra, disp16);
1880
        ret = 1;
1881
        break;
1882
    case 0x3D:
1883
        /* BNE */
1884
        gen_bcond(ctx, &gen_op_cmpnez, ra, disp16);
1885
        ret = 1;
1886
        break;
1887
    case 0x3E:
1888
        /* BGE */
1889
        gen_bcond(ctx, &gen_op_cmpgez, ra, disp16);
1890
        ret = 1;
1891
        break;
1892
    case 0x3F:
1893
        /* BGT */
1894
        gen_bcond(ctx, &gen_op_cmpgtz, ra, disp16);
1895
        ret = 1;
1896
        break;
1897
    invalid_opc:
1898
        gen_invalid(ctx);
1899
        ret = 3;
1900
        break;
1901
    }
1902

    
1903
    return ret;
1904
}
1905

    
1906
static always_inline void gen_intermediate_code_internal (CPUState *env,
1907
                                                          TranslationBlock *tb,
1908
                                                          int search_pc)
1909
{
1910
#if defined ALPHA_DEBUG_DISAS
1911
    static int insn_count;
1912
#endif
1913
    DisasContext ctx, *ctxp = &ctx;
1914
    target_ulong pc_start;
1915
    uint32_t insn;
1916
    uint16_t *gen_opc_end;
1917
    int j, lj = -1;
1918
    int ret;
1919
    int num_insns;
1920
    int max_insns;
1921

    
1922
    pc_start = tb->pc;
1923
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
1924
    ctx.pc = pc_start;
1925
    ctx.amask = env->amask;
1926
#if defined (CONFIG_USER_ONLY)
1927
    ctx.mem_idx = 0;
1928
#else
1929
    ctx.mem_idx = ((env->ps >> 3) & 3);
1930
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
1931
#endif
1932
    num_insns = 0;
1933
    max_insns = tb->cflags & CF_COUNT_MASK;
1934
    if (max_insns == 0)
1935
        max_insns = CF_COUNT_MASK;
1936

    
1937
    gen_icount_start();
1938
    for (ret = 0; ret == 0;) {
1939
        if (env->nb_breakpoints > 0) {
1940
            for(j = 0; j < env->nb_breakpoints; j++) {
1941
                if (env->breakpoints[j] == ctx.pc) {
1942
                    gen_excp(&ctx, EXCP_DEBUG, 0);
1943
                    break;
1944
                }
1945
            }
1946
        }
1947
        if (search_pc) {
1948
            j = gen_opc_ptr - gen_opc_buf;
1949
            if (lj < j) {
1950
                lj++;
1951
                while (lj < j)
1952
                    gen_opc_instr_start[lj++] = 0;
1953
                gen_opc_pc[lj] = ctx.pc;
1954
                gen_opc_instr_start[lj] = 1;
1955
                gen_opc_icount[lj] = num_insns;
1956
            }
1957
        }
1958
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
1959
            gen_io_start();
1960
#if defined ALPHA_DEBUG_DISAS
1961
        insn_count++;
1962
        if (logfile != NULL) {
1963
            fprintf(logfile, "pc " TARGET_FMT_lx " mem_idx %d\n",
1964
                    ctx.pc, ctx.mem_idx);
1965
        }
1966
#endif
1967
        insn = ldl_code(ctx.pc);
1968
#if defined ALPHA_DEBUG_DISAS
1969
        insn_count++;
1970
        if (logfile != NULL) {
1971
            fprintf(logfile, "opcode %08x %d\n", insn, insn_count);
1972
        }
1973
#endif
1974
        num_insns++;
1975
        ctx.pc += 4;
1976
        ret = translate_one(ctxp, insn);
1977
        if (ret != 0)
1978
            break;
1979
        /* if we reach a page boundary or are single stepping, stop
1980
         * generation
1981
         */
1982
        if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) ||
1983
            (env->singlestep_enabled) ||
1984
            num_insns >= max_insns) {
1985
            break;
1986
        }
1987
#if defined (DO_SINGLE_STEP)
1988
        break;
1989
#endif
1990
    }
1991
    if (ret != 1 && ret != 3) {
1992
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
1993
    }
1994
#if defined (DO_TB_FLUSH)
1995
    tcg_gen_helper_0_0(helper_tb_flush);
1996
#endif
1997
    if (tb->cflags & CF_LAST_IO)
1998
        gen_io_end();
1999
    /* Generate the return instruction */
2000
    tcg_gen_exit_tb(0);
2001
    gen_icount_end(tb, num_insns);
2002
    *gen_opc_ptr = INDEX_op_end;
2003
    if (search_pc) {
2004
        j = gen_opc_ptr - gen_opc_buf;
2005
        lj++;
2006
        while (lj <= j)
2007
            gen_opc_instr_start[lj++] = 0;
2008
    } else {
2009
        tb->size = ctx.pc - pc_start;
2010
        tb->icount = num_insns;
2011
    }
2012
#if defined ALPHA_DEBUG_DISAS
2013
    if (loglevel & CPU_LOG_TB_CPU) {
2014
        cpu_dump_state(env, logfile, fprintf, 0);
2015
    }
2016
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2017
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
2018
        target_disas(logfile, pc_start, ctx.pc - pc_start, 1);
2019
        fprintf(logfile, "\n");
2020
    }
2021
#endif
2022
}
2023

    
2024
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2025
{
2026
    gen_intermediate_code_internal(env, tb, 0);
2027
}
2028

    
2029
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2030
{
2031
    gen_intermediate_code_internal(env, tb, 1);
2032
}
2033

    
2034
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2035
{
2036
    CPUAlphaState *env;
2037
    uint64_t hwpcb;
2038

    
2039
    env = qemu_mallocz(sizeof(CPUAlphaState));
2040
    if (!env)
2041
        return NULL;
2042
    cpu_exec_init(env);
2043
    alpha_translate_init();
2044
    tlb_flush(env, 1);
2045
    /* XXX: should not be hardcoded */
2046
    env->implver = IMPLVER_2106x;
2047
    env->ps = 0x1F00;
2048
#if defined (CONFIG_USER_ONLY)
2049
    env->ps |= 1 << 3;
2050
#endif
2051
    pal_init(env);
2052
    /* Initialize IPR */
2053
    hwpcb = env->ipr[IPR_PCBB];
2054
    env->ipr[IPR_ASN] = 0;
2055
    env->ipr[IPR_ASTEN] = 0;
2056
    env->ipr[IPR_ASTSR] = 0;
2057
    env->ipr[IPR_DATFX] = 0;
2058
    /* XXX: fix this */
2059
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2060
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2061
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2062
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2063
    env->ipr[IPR_FEN] = 0;
2064
    env->ipr[IPR_IPL] = 31;
2065
    env->ipr[IPR_MCES] = 0;
2066
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2067
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2068
    env->ipr[IPR_SISR] = 0;
2069
    env->ipr[IPR_VIRBND] = -1ULL;
2070

    
2071
    return env;
2072
}
2073

    
2074
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2075
                unsigned long searched_pc, int pc_pos, void *puc)
2076
{
2077
    env->pc = gen_opc_pc[pc_pos];
2078
}