Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 01ff9cc8

History | View | Annotate | Download (78.2 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 "host-utils.h"
29
#include "helper.h"
30
#include "tcg-op.h"
31
#include "qemu-common.h"
32

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

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

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

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

    
56
/* register names */
57
static char cpu_reg_names[10*4+21*5];
58

    
59
#include "gen-icount.h"
60

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

    
67
    if (done_init)
68
        return;
69

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

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

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

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

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

    
101
    done_init = 1;
102
}
103

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

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

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

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

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

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

    
201
#define GEN_LD(width)                                                         \
202
OP_LD_TABLE(width);                                                           \
203
static always_inline void gen_ld##width (DisasContext *ctx)                   \
204
{                                                                             \
205
    (*gen_op_ld##width[ctx->mem_idx])();                                      \
206
}
207

    
208
#define GEN_ST(width)                                                         \
209
OP_ST_TABLE(width);                                                           \
210
static always_inline void gen_st##width (DisasContext *ctx)                   \
211
{                                                                             \
212
    (*gen_op_st##width[ctx->mem_idx])();                                      \
213
}
214

    
215
GEN_LD(bu);
216
GEN_ST(b);
217
GEN_LD(wu);
218
GEN_ST(w);
219
GEN_LD(l);
220
GEN_ST(l);
221
GEN_LD(q);
222
GEN_ST(q);
223
GEN_LD(q_u);
224
GEN_ST(q_u);
225
GEN_LD(l_l);
226
GEN_ST(l_c);
227
GEN_LD(q_l);
228
GEN_ST(q_c);
229

    
230
#if 0 /* currently unused */
231
GEN_LD(f);
232
GEN_ST(f);
233
GEN_LD(g);
234
GEN_ST(g);
235
#endif /* 0 */
236
GEN_LD(s);
237
GEN_ST(s);
238
GEN_LD(t);
239
GEN_ST(t);
240

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

    
250
static always_inline void gen_excp (DisasContext *ctx,
251
                                    int exception, int error_code)
252
{
253
    TCGv tmp1, tmp2;
254

    
255
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
256
    tmp1 = tcg_const_i32(exception);
257
    tmp2 = tcg_const_i32(error_code);
258
    tcg_gen_helper_0_2(helper_excp, tmp1, tmp2);
259
    tcg_temp_free(tmp2);
260
    tcg_temp_free(tmp1);
261
}
262

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

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

    
289
static always_inline void gen_store_mem (DisasContext *ctx,
290
                                         void (*gen_store_op)(DisasContext *ctx),
291
                                         int ra, int rb, int32_t disp16,
292
                                         int clear)
293
{
294
    if (rb != 31)
295
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
296
    else
297
        tcg_gen_movi_i64(cpu_T[0], disp16);
298
    if (clear)
299
        tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7);
300
    if (ra != 31)
301
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
302
    else
303
        tcg_gen_movi_i64(cpu_T[1], 0);
304
    (*gen_store_op)(ctx);
305
}
306

    
307
static always_inline void gen_load_fmem (DisasContext *ctx,
308
                                         void (*gen_load_fop)(DisasContext *ctx),
309
                                         int ra, int rb, int32_t disp16)
310
{
311
    if (rb != 31)
312
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
313
    else
314
        tcg_gen_movi_i64(cpu_T[0], disp16);
315
    (*gen_load_fop)(ctx);
316
    gen_store_fir(ctx, ra, 1);
317
}
318

    
319
static always_inline void gen_store_fmem (DisasContext *ctx,
320
                                          void (*gen_store_fop)(DisasContext *ctx),
321
                                          int ra, int rb, int32_t disp16)
322
{
323
    if (rb != 31)
324
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
325
    else
326
        tcg_gen_movi_i64(cpu_T[0], disp16);
327
    gen_load_fir(ctx, ra, 1);
328
    (*gen_store_fop)(ctx);
329
}
330

    
331
static always_inline void gen_bcond (DisasContext *ctx,
332
                                     TCGCond cond,
333
                                     int ra, int32_t disp16, int mask)
334
{
335
    int l1, l2;
336

    
337
    l1 = gen_new_label();
338
    l2 = gen_new_label();
339
    if (likely(ra != 31)) {
340
        if (mask) {
341
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
342
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
343
            tcg_gen_brcondi_i64(cond, tmp, 0, l1);
344
            tcg_temp_free(tmp);
345
        } else
346
            tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1);
347
    } else {
348
        /* Very uncommon case - Do not bother to optimize.  */
349
        TCGv tmp = tcg_const_i64(0);
350
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
351
        tcg_temp_free(tmp);
352
    }
353
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
354
    tcg_gen_br(l2);
355
    gen_set_label(l1);
356
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2));
357
    gen_set_label(l2);
358
}
359

    
360
static always_inline void gen_fbcond (DisasContext *ctx,
361
                                      void (*gen_test_op)(void),
362
                                      int ra, int32_t disp16)
363
{
364
    tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2));
365
    gen_load_fir(ctx, ra, 0);
366
    (*gen_test_op)();
367
    _gen_op_bcond(ctx);
368
}
369

    
370
static always_inline void gen_arith3 (DisasContext *ctx,
371
                                      void (*gen_arith_op)(void),
372
                                      int ra, int rb, int rc,
373
                                      int islit, uint8_t lit)
374
{
375
    if (ra != 31)
376
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
377
    else
378
        tcg_gen_movi_i64(cpu_T[0], 0);
379
    if (islit)
380
        tcg_gen_movi_i64(cpu_T[1], lit);
381
    else if (rb != 31)
382
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
383
    else
384
        tcg_gen_movi_i64(cpu_T[1], 0);
385
    (*gen_arith_op)();
386
    if (rc != 31)
387
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
388
}
389

    
390
static always_inline void gen_cmov (DisasContext *ctx,
391
                                    TCGCond inv_cond,
392
                                    int ra, int rb, int rc,
393
                                    int islit, uint8_t lit, int mask)
394
{
395
    int l1;
396

    
397
    if (unlikely(rc == 31))
398
        return;
399

    
400
    l1 = gen_new_label();
401

    
402
    if (ra != 31) {
403
        if (mask) {
404
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
405
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
406
            tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
407
            tcg_temp_free(tmp);
408
        } else
409
            tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
410
    } else {
411
        /* Very uncommon case - Do not bother to optimize.  */
412
        TCGv tmp = tcg_const_i64(0);
413
        tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
414
        tcg_temp_free(tmp);
415
    }
416

    
417
    if (islit)
418
        tcg_gen_movi_i64(cpu_ir[rc], lit);
419
    else if (rb != 31)
420
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
421
    else
422
        tcg_gen_movi_i64(cpu_ir[rc], 0);
423
    gen_set_label(l1);
424
}
425

    
426
static always_inline void gen_farith2 (DisasContext *ctx,
427
                                       void (*gen_arith_fop)(void),
428
                                       int rb, int rc)
429
{
430
    gen_load_fir(ctx, rb, 0);
431
    (*gen_arith_fop)();
432
    gen_store_fir(ctx, rc, 0);
433
}
434

    
435
static always_inline void gen_farith3 (DisasContext *ctx,
436
                                       void (*gen_arith_fop)(void),
437
                                       int ra, int rb, int rc)
438
{
439
    gen_load_fir(ctx, ra, 0);
440
    gen_load_fir(ctx, rb, 1);
441
    (*gen_arith_fop)();
442
    gen_store_fir(ctx, rc, 0);
443
}
444

    
445
static always_inline void gen_fcmov (DisasContext *ctx,
446
                                     void (*gen_test_fop)(void),
447
                                     int ra, int rb, int rc)
448
{
449
    gen_load_fir(ctx, ra, 0);
450
    gen_load_fir(ctx, rb, 1);
451
    (*gen_test_fop)();
452
    gen_op_cmov_fir(rc);
453
}
454

    
455
static always_inline void gen_fti (DisasContext *ctx,
456
                                   void (*gen_move_fop)(void),
457
                                   int ra, int rc)
458
{
459
    gen_load_fir(ctx, rc, 0);
460
    (*gen_move_fop)();
461
    if (ra != 31)
462
        tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
463
}
464

    
465
static always_inline void gen_itf (DisasContext *ctx,
466
                                   void (*gen_move_fop)(void),
467
                                   int ra, int rc)
468
{
469
    if (ra != 31)
470
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
471
    else
472
        tcg_gen_movi_i64(cpu_T[0], 0);
473
    (*gen_move_fop)();
474
    gen_store_fir(ctx, rc, 0);
475
}
476

    
477
/* EXTWH, EXTWH, EXTLH, EXTQH */
478
static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
479
                                    int ra, int rb, int rc,
480
                                    int islit, uint8_t lit)
481
{
482
    if (unlikely(rc == 31))
483
        return;
484

    
485
    if (ra != 31) {
486
        if (islit)
487
            tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
488
        else if (rb != 31) {
489
            TCGv tmp1, tmp2;
490
            tmp1 = tcg_temp_new(TCG_TYPE_I64);
491
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
492
            tcg_gen_shli_i64(tmp1, tmp1, 3);
493
            tmp2 = tcg_const_i64(64);
494
            tcg_gen_sub_i64(tmp1, tmp2, tmp1);
495
            tcg_temp_free(tmp2);
496
            if (tcg_gen_ext_i64) {
497
                tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1);
498
                tcg_gen_ext_i64(cpu_ir[rc], tmp1);
499
            } else
500
                tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
501
            tcg_temp_free(tmp1);
502
        } else
503
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
504
    } else
505
        tcg_gen_movi_i64(cpu_ir[rc], 0);
506
}
507

    
508
/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */
509
static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
510
                                    int ra, int rb, int rc,
511
                                    int islit, uint8_t lit)
512
{
513
    if (unlikely(rc == 31))
514
        return;
515

    
516
    if (ra != 31) {
517
        if (islit)
518
            tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
519
        else if (rb != 31) {
520
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
521
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
522
            tcg_gen_shli_i64(tmp, tmp, 3);
523
            if (tcg_gen_ext_i64) {
524
                tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp);
525
                tcg_gen_ext_i64(cpu_ir[rc], tmp);
526
            } else
527
                tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
528
            tcg_temp_free(tmp);
529
        } else
530
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
531
    } else
532
        tcg_gen_movi_i64(cpu_ir[rc], 0);
533
}
534

    
535
/* Code to call byte manipulation helpers, used by:
536
   INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL,
537
   MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL,
538
   ZAP, ZAPNOT
539

540
   WARNING: it assumes that when ra31 is used, the result is 0.
541
*/
542
static always_inline void gen_byte_manipulation(void *helper,
543
                                                int ra, int rb, int rc,
544
                                                int islit, uint8_t lit)
545
{
546
    if (unlikely(rc == 31))
547
        return;
548

    
549
    if (ra != 31) {
550
        if (islit || rb == 31) {
551
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
552
            if (islit)
553
                tcg_gen_movi_i64(tmp, lit);
554
            else
555
                tcg_gen_movi_i64(tmp, 0);
556
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
557
            tcg_temp_free(tmp);
558
        } else
559
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
560
    } else
561
        tcg_gen_movi_i64(cpu_ir[rc], 0);
562
}
563

    
564
static always_inline void gen_cmp(TCGCond cond,
565
                                  int ra, int rb, int rc,
566
                                  int islit, int8_t lit)
567
{
568
    int l1, l2;
569
    TCGv tmp;
570

    
571
    if (unlikely(rc == 31))
572
    return;
573

    
574
    l1 = gen_new_label();
575
    l2 = gen_new_label();
576

    
577
    if (ra != 31) {
578
        tmp = tcg_temp_new(TCG_TYPE_I64);
579
        tcg_gen_mov_i64(tmp, cpu_ir[ra]);
580
    } else
581
        tmp = tcg_const_i64(0);
582
    if (islit)
583
        tcg_gen_brcondi_i64(cond, tmp, lit, l1);
584
    else if (rb != 31)
585
        tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
586
    else
587
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
588

    
589
    tcg_gen_movi_i64(cpu_ir[rc], 0);
590
    tcg_gen_br(l2);
591
    gen_set_label(l1);
592
    tcg_gen_movi_i64(cpu_ir[rc], 1);
593
    gen_set_label(l2);
594
}
595

    
596
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
597
{
598
    uint32_t palcode;
599
    int32_t disp21, disp16, disp12;
600
    uint16_t fn11, fn16;
601
    uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
602
    uint8_t lit;
603
    int ret;
604

    
605
    /* Decode all instruction fields */
606
    opc = insn >> 26;
607
    ra = (insn >> 21) & 0x1F;
608
    rb = (insn >> 16) & 0x1F;
609
    rc = insn & 0x1F;
610
    sbz = (insn >> 13) & 0x07;
611
    islit = (insn >> 12) & 1;
612
    lit = (insn >> 13) & 0xFF;
613
    palcode = insn & 0x03FFFFFF;
614
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
615
    disp16 = (int16_t)(insn & 0x0000FFFF);
616
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
617
    fn16 = insn & 0x0000FFFF;
618
    fn11 = (insn >> 5) & 0x000007FF;
619
    fpfn = fn11 & 0x3F;
620
    fn7 = (insn >> 5) & 0x0000007F;
621
    fn2 = (insn >> 5) & 0x00000003;
622
    ret = 0;
623
#if defined ALPHA_DEBUG_DISAS
624
    if (logfile != NULL) {
625
        fprintf(logfile, "opc %02x ra %d rb %d rc %d disp16 %04x\n",
626
                opc, ra, rb, rc, disp16);
627
    }
628
#endif
629
    switch (opc) {
630
    case 0x00:
631
        /* CALL_PAL */
632
        if (palcode >= 0x80 && palcode < 0xC0) {
633
            /* Unprivileged PAL call */
634
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x1F) << 6), 0);
635
#if !defined (CONFIG_USER_ONLY)
636
        } else if (palcode < 0x40) {
637
            /* Privileged PAL code */
638
            if (ctx->mem_idx & 1)
639
                goto invalid_opc;
640
            else
641
                gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x1F) << 6), 0);
642
#endif
643
        } else {
644
            /* Invalid PAL call */
645
            goto invalid_opc;
646
        }
647
        ret = 3;
648
        break;
649
    case 0x01:
650
        /* OPC01 */
651
        goto invalid_opc;
652
    case 0x02:
653
        /* OPC02 */
654
        goto invalid_opc;
655
    case 0x03:
656
        /* OPC03 */
657
        goto invalid_opc;
658
    case 0x04:
659
        /* OPC04 */
660
        goto invalid_opc;
661
    case 0x05:
662
        /* OPC05 */
663
        goto invalid_opc;
664
    case 0x06:
665
        /* OPC06 */
666
        goto invalid_opc;
667
    case 0x07:
668
        /* OPC07 */
669
        goto invalid_opc;
670
    case 0x08:
671
        /* LDA */
672
        if (likely(ra != 31)) {
673
            if (rb != 31)
674
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
675
            else
676
                tcg_gen_movi_i64(cpu_ir[ra], disp16);
677
        }
678
        break;
679
    case 0x09:
680
        /* LDAH */
681
        if (likely(ra != 31)) {
682
            if (rb != 31)
683
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
684
            else
685
                tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
686
        }
687
        break;
688
    case 0x0A:
689
        /* LDBU */
690
        if (!(ctx->amask & AMASK_BWX))
691
            goto invalid_opc;
692
        gen_load_mem(ctx, &gen_ldbu, ra, rb, disp16, 0);
693
        break;
694
    case 0x0B:
695
        /* LDQ_U */
696
        gen_load_mem(ctx, &gen_ldq_u, ra, rb, disp16, 1);
697
        break;
698
    case 0x0C:
699
        /* LDWU */
700
        if (!(ctx->amask & AMASK_BWX))
701
            goto invalid_opc;
702
        gen_load_mem(ctx, &gen_ldwu, ra, rb, disp16, 0);
703
        break;
704
    case 0x0D:
705
        /* STW */
706
        if (!(ctx->amask & AMASK_BWX))
707
            goto invalid_opc;
708
        gen_store_mem(ctx, &gen_stw, ra, rb, disp16, 0);
709
        break;
710
    case 0x0E:
711
        /* STB */
712
        if (!(ctx->amask & AMASK_BWX))
713
            goto invalid_opc;
714
        gen_store_mem(ctx, &gen_stb, ra, rb, disp16, 0);
715
        break;
716
    case 0x0F:
717
        /* STQ_U */
718
        gen_store_mem(ctx, &gen_stq_u, ra, rb, disp16, 1);
719
        break;
720
    case 0x10:
721
        switch (fn7) {
722
        case 0x00:
723
            /* ADDL */
724
            if (likely(rc != 31)) {
725
                if (ra != 31) {
726
                    if (islit) {
727
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
728
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
729
                    } else if (rb != 31) {
730
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
731
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
732
                    } else
733
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
734
                } else {
735
                    if (islit)
736
                        tcg_gen_movi_i64(cpu_ir[rc], (int32_t)lit);
737
                    else if (rb != 31)
738
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
739
                    else
740
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
741
                }
742
            }
743
            break;
744
        case 0x02:
745
            /* S4ADDL */
746
            if (likely(rc != 31)) {
747
                if (ra != 31) {
748
                    if (islit || rb != 31) {
749
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
750
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
751
                        if (islit)
752
                            tcg_gen_addi_i64(tmp, tmp, lit);
753
                        else
754
                            tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
755
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
756
                        tcg_temp_free(tmp);
757
                    } else {
758
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
759
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
760
                    }
761
                } else {
762
                    if (islit)
763
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
764
                    else if (rb != 31)
765
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
766
                    else
767
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
768
                }
769
            }
770
            break;
771
        case 0x09:
772
            /* SUBL */
773
            if (likely(rc != 31)) {
774
                if (ra != 31) {
775
                    if (islit) {
776
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
777
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
778
                    } else if (rb != 31) {
779
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
780
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
781
                    } else
782
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
783
                } else {
784
                    if (islit)
785
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
786
                    else if (rb != 31) {
787
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
788
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
789
                    } else
790
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
791
                }
792
            }
793
            break;
794
        case 0x0B:
795
            /* S4SUBL */
796
            if (likely(rc != 31)) {
797
                if (ra != 31) {
798
                    if (islit || rb != 31) {
799
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
800
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
801
                        if (islit)
802
                            tcg_gen_subi_i64(tmp, tmp, lit);
803
                        else
804
                            tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
805
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
806
                        tcg_temp_free(tmp);
807
                    } else {
808
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
809
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
810
                    }
811
                } else {
812
                    if (islit)
813
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
814
                    else if (rb != 31) {
815
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
816
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
817
                    } else
818
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
819
                }
820
            }
821
            break;
822
        case 0x0F:
823
            /* CMPBGE */
824
            gen_arith3(ctx, &gen_op_cmpbge, ra, rb, rc, islit, lit);
825
            break;
826
        case 0x12:
827
            /* S8ADDL */
828
            if (likely(rc != 31)) {
829
                if (ra != 31) {
830
                    if (islit || rb != 31) {
831
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
832
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
833
                        if (islit)
834
                            tcg_gen_addi_i64(tmp, tmp, lit);
835
                        else
836
                            tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
837
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
838
                        tcg_temp_free(tmp);
839
                    } else {
840
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
841
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
842
                    }
843
                } else {
844
                    if (islit)
845
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
846
                    else if (rb != 31)
847
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
848
                    else
849
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
850
                }
851
            }
852
            break;
853
        case 0x1B:
854
            /* S8SUBL */
855
            if (likely(rc != 31)) {
856
                if (ra != 31) {
857
                    if (islit || rb != 31) {
858
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
859
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
860
                        if (islit)
861
                            tcg_gen_subi_i64(tmp, tmp, lit);
862
                        else
863
                            tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
864
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
865
                        tcg_temp_free(tmp);
866
                    } else {
867
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
868
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
869
                    }
870
                } else {
871
                    if (islit)
872
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
873
                    else if (rb != 31) {
874
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
875
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
876
                    } else
877
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
878
                }
879
            }
880
            break;
881
        case 0x1D:
882
            /* CMPULT */
883
            gen_cmp(TCG_COND_LTU, ra, rb, rc, islit, lit);
884
            break;
885
        case 0x20:
886
            /* ADDQ */
887
            if (likely(rc != 31)) {
888
                if (ra != 31) {
889
                    if (islit)
890
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
891
                    else if (rb != 31)
892
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
893
                    else
894
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
895
                } else {
896
                    if (islit)
897
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
898
                    else if (rb != 31)
899
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
900
                    else
901
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
902
                }
903
            }
904
            break;
905
        case 0x22:
906
            /* S4ADDQ */
907
            if (likely(rc != 31)) {
908
                if (ra != 31) {
909
                    if (islit || rb != 31) {
910
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
911
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
912
                        if (islit)
913
                            tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
914
                        else
915
                            tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
916
                        tcg_temp_free(tmp);
917
                    } else
918
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
919
                } else {
920
                    if (islit)
921
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
922
                    else if (rb != 31)
923
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
924
                    else
925
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
926
                }
927
            }
928
            break;
929
        case 0x29:
930
            /* SUBQ */
931
            if (likely(rc != 31)) {
932
                if (ra != 31) {
933
                    if (islit)
934
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
935
                    else if (rb != 31)
936
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
937
                    else
938
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
939
                } else {
940
                    if (islit)
941
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
942
                    else if (rb != 31)
943
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
944
                    else
945
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
946
                }
947
            }
948
            break;
949
        case 0x2B:
950
            /* S4SUBQ */
951
            if (likely(rc != 31)) {
952
                if (ra != 31) {
953
                    if (islit || rb != 31) {
954
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
955
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
956
                        if (islit)
957
                            tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
958
                        else
959
                            tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
960
                        tcg_temp_free(tmp);
961
                    } else
962
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
963
                } else {
964
                    if (islit)
965
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
966
                    else if (rb != 31)
967
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
968
                    else
969
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
970
                }
971
            }
972
            break;
973
        case 0x2D:
974
            /* CMPEQ */
975
            gen_cmp(TCG_COND_EQ, ra, rb, rc, islit, lit);
976
            break;
977
        case 0x32:
978
            /* S8ADDQ */
979
            if (likely(rc != 31)) {
980
                if (ra != 31) {
981
                    if (islit || rb != 31) {
982
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
983
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
984
                        if (islit)
985
                            tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
986
                        else
987
                            tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
988
                        tcg_temp_free(tmp);
989
                    } else
990
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
991
                } else {
992
                    if (islit)
993
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
994
                    else if (rb != 31)
995
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
996
                    else
997
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
998
                }
999
            }
1000
            break;
1001
        case 0x3B:
1002
            /* S8SUBQ */
1003
            if (likely(rc != 31)) {
1004
                if (ra != 31) {
1005
                    if (islit || rb != 31) {
1006
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1007
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1008
                        if (islit)
1009
                            tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
1010
                        else
1011
                            tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1012
                        tcg_temp_free(tmp);
1013
                    } else
1014
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
1015
                } else {
1016
                    if (islit)
1017
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1018
                    else if (rb != 31)
1019
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1020
                    else
1021
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
1022
                }
1023
            }
1024
            break;
1025
        case 0x3D:
1026
            /* CMPULE */
1027
            gen_cmp(TCG_COND_LEU, ra, rb, rc, islit, lit);
1028
            break;
1029
        case 0x40:
1030
            /* ADDL/V */
1031
            gen_arith3(ctx, &gen_op_addlv, ra, rb, rc, islit, lit);
1032
            break;
1033
        case 0x49:
1034
            /* SUBL/V */
1035
            gen_arith3(ctx, &gen_op_sublv, ra, rb, rc, islit, lit);
1036
            break;
1037
        case 0x4D:
1038
            /* CMPLT */
1039
            gen_cmp(TCG_COND_LT, ra, rb, rc, islit, lit);
1040
            break;
1041
        case 0x60:
1042
            /* ADDQ/V */
1043
            gen_arith3(ctx, &gen_op_addqv, ra, rb, rc, islit, lit);
1044
            break;
1045
        case 0x69:
1046
            /* SUBQ/V */
1047
            gen_arith3(ctx, &gen_op_subqv, ra, rb, rc, islit, lit);
1048
            break;
1049
        case 0x6D:
1050
            /* CMPLE */
1051
            gen_cmp(TCG_COND_LE, ra, rb, rc, islit, lit);
1052
            break;
1053
        default:
1054
            goto invalid_opc;
1055
        }
1056
        break;
1057
    case 0x11:
1058
        switch (fn7) {
1059
        case 0x00:
1060
            /* AND */
1061
            if (likely(rc != 31)) {
1062
                if (ra == 31 || (rb == 31 && !islit))
1063
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1064
                else if (islit)
1065
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1066
                else
1067
                    tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1068
            }
1069
            break;
1070
        case 0x08:
1071
            /* BIC */
1072
            if (likely(rc != 31)) {
1073
                if (ra != 31) {
1074
                    if (islit)
1075
                        tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1076
                    else if (rb != 31) {
1077
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1078
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1079
                        tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1080
                        tcg_temp_free(tmp);
1081
                    } else
1082
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1083
                } else
1084
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1085
            }
1086
            break;
1087
        case 0x14:
1088
            /* CMOVLBS */
1089
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
1090
            break;
1091
        case 0x16:
1092
            /* CMOVLBC */
1093
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 1);
1094
            break;
1095
        case 0x20:
1096
            /* BIS */
1097
            if (likely(rc != 31)) {
1098
                if (ra != 31) {
1099
                    if (islit)
1100
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1101
                    else if (rb != 31)
1102
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1103
                    else
1104
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1105
                } else {
1106
                    if (islit)
1107
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1108
                    else if (rb != 31)
1109
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1110
                    else
1111
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
1112
                }
1113
            }
1114
            break;
1115
        case 0x24:
1116
            /* CMOVEQ */
1117
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 0);
1118
            break;
1119
        case 0x26:
1120
            /* CMOVNE */
1121
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
1122
            break;
1123
        case 0x28:
1124
            /* ORNOT */
1125
            if (likely(rc != 31)) {
1126
                if (rb == 31 && !islit)
1127
                    tcg_gen_movi_i64(cpu_ir[rc], ~0);
1128
                else if (ra != 31) {
1129
                    if (islit)
1130
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1131
                    else {
1132
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1133
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1134
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1135
                        tcg_temp_free(tmp);
1136
                    }
1137
                } else {
1138
                    if (islit)
1139
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1140
                    else
1141
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1142
                }
1143
            }
1144
            break;
1145
        case 0x40:
1146
            /* XOR */
1147
            if (likely(rc != 31)) {
1148
                if (ra != 31) {
1149
                    if (islit)
1150
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1151
                    else if (rb != 31)
1152
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1153
                    else
1154
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1155
                } else {
1156
                    if (islit)
1157
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1158
                    else if (rb != 31)
1159
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1160
                    else
1161
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
1162
                }
1163
            }
1164
            break;
1165
        case 0x44:
1166
            /* CMOVLT */
1167
            gen_cmov(ctx, TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1168
            break;
1169
        case 0x46:
1170
            /* CMOVGE */
1171
            gen_cmov(ctx, TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1172
            break;
1173
        case 0x48:
1174
            /* EQV */
1175
            if (likely(rc != 31)) {
1176
                if (ra != 31) {
1177
                    if (islit)
1178
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1179
                    else if (rb != 31) {
1180
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1181
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1182
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1183
                        tcg_temp_free(tmp);
1184
                    } else
1185
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1186
                } else {
1187
                    if (islit)
1188
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1189
                    else if (rb != 31)
1190
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1191
                    else
1192
                        tcg_gen_movi_i64(cpu_ir[rc], ~0);
1193
                }
1194
            }
1195
            break;
1196
        case 0x61:
1197
            /* AMASK */
1198
            if (likely(rc != 31)) {
1199
                if (islit)
1200
                    tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
1201
                else if (rb != 31)
1202
                    tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
1203
                else
1204
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1205
            }
1206
            break;
1207
        case 0x64:
1208
            /* CMOVLE */
1209
            gen_cmov(ctx, TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1210
            break;
1211
        case 0x66:
1212
            /* CMOVGT */
1213
            gen_cmov(ctx, TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1214
            break;
1215
        case 0x6C:
1216
            /* IMPLVER */
1217
            if (rc != 31)
1218
                tcg_gen_helper_1_0(helper_load_implver, cpu_ir[rc]);
1219
            break;
1220
        default:
1221
            goto invalid_opc;
1222
        }
1223
        break;
1224
    case 0x12:
1225
        switch (fn7) {
1226
        case 0x02:
1227
            /* MSKBL */
1228
            gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit);
1229
            break;
1230
        case 0x06:
1231
            /* EXTBL */
1232
            gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1233
            break;
1234
        case 0x0B:
1235
            /* INSBL */
1236
            gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit);
1237
            break;
1238
        case 0x12:
1239
            /* MSKWL */
1240
            gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit);
1241
            break;
1242
        case 0x16:
1243
            /* EXTWL */
1244
            gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1245
            break;
1246
        case 0x1B:
1247
            /* INSWL */
1248
            gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit);
1249
            break;
1250
        case 0x22:
1251
            /* MSKLL */
1252
            gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit);
1253
            break;
1254
        case 0x26:
1255
            /* EXTLL */
1256
            gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1257
            break;
1258
        case 0x2B:
1259
            /* INSLL */
1260
            gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit);
1261
            break;
1262
        case 0x30:
1263
            /* ZAP */
1264
            gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit);
1265
            break;
1266
        case 0x31:
1267
            /* ZAPNOT */
1268
            gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit);
1269
            break;
1270
        case 0x32:
1271
            /* MSKQL */
1272
            gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit);
1273
            break;
1274
        case 0x34:
1275
            /* SRL */
1276
            if (likely(rc != 31)) {
1277
                if (ra != 31) {
1278
                    if (islit)
1279
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1280
                    else if (rb != 31) {
1281
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1282
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1283
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1284
                        tcg_temp_free(shift);
1285
                    } else
1286
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1287
                } else
1288
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1289
            }
1290
            break;
1291
        case 0x36:
1292
            /* EXTQL */
1293
            gen_ext_l(NULL, ra, rb, rc, islit, lit);
1294
            break;
1295
        case 0x39:
1296
            /* SLL */
1297
            if (likely(rc != 31)) {
1298
                if (ra != 31) {
1299
                    if (islit)
1300
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1301
                    else if (rb != 31) {
1302
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1303
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1304
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1305
                        tcg_temp_free(shift);
1306
                    } else
1307
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1308
                } else
1309
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1310
            }
1311
            break;
1312
        case 0x3B:
1313
            /* INSQL */
1314
            gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit);
1315
            break;
1316
        case 0x3C:
1317
            /* SRA */
1318
            if (likely(rc != 31)) {
1319
                if (ra != 31) {
1320
                    if (islit)
1321
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1322
                    else if (rb != 31) {
1323
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1324
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1325
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1326
                        tcg_temp_free(shift);
1327
                    } else
1328
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1329
                } else
1330
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1331
            }
1332
            break;
1333
        case 0x52:
1334
            /* MSKWH */
1335
            gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit);
1336
            break;
1337
        case 0x57:
1338
            /* INSWH */
1339
            gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit);
1340
            break;
1341
        case 0x5A:
1342
            /* EXTWH */
1343
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1344
            break;
1345
        case 0x62:
1346
            /* MSKLH */
1347
            gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit);
1348
            break;
1349
        case 0x67:
1350
            /* INSLH */
1351
            gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit);
1352
            break;
1353
        case 0x6A:
1354
            /* EXTLH */
1355
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1356
            break;
1357
        case 0x72:
1358
            /* MSKQH */
1359
            gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit);
1360
            break;
1361
        case 0x77:
1362
            /* INSQH */
1363
            gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit);
1364
            break;
1365
        case 0x7A:
1366
            /* EXTQH */
1367
            gen_ext_h(NULL, ra, rb, rc, islit, lit);
1368
            break;
1369
        default:
1370
            goto invalid_opc;
1371
        }
1372
        break;
1373
    case 0x13:
1374
        switch (fn7) {
1375
        case 0x00:
1376
            /* MULL */
1377
            if (likely(rc != 31)) {
1378
                if (ra == 31 || (rb == 31 && !islit))
1379
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1380
                else {
1381
                    if (islit)
1382
                        tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1383
                    else
1384
                        tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1385
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1386
                }
1387
            }
1388
            break;
1389
        case 0x20:
1390
            /* MULQ */
1391
            if (likely(rc != 31)) {
1392
                if (ra == 31 || (rb == 31 && !islit))
1393
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1394
                else if (islit)
1395
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1396
                else
1397
                    tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1398
            }
1399
            break;
1400
        case 0x30:
1401
            /* UMULH */
1402
            gen_arith3(ctx, &gen_op_umulh, ra, rb, rc, islit, lit);
1403
            break;
1404
        case 0x40:
1405
            /* MULL/V */
1406
            gen_arith3(ctx, &gen_op_mullv, ra, rb, rc, islit, lit);
1407
            break;
1408
        case 0x60:
1409
            /* MULQ/V */
1410
            gen_arith3(ctx, &gen_op_mulqv, ra, rb, rc, islit, lit);
1411
            break;
1412
        default:
1413
            goto invalid_opc;
1414
        }
1415
        break;
1416
    case 0x14:
1417
        switch (fpfn) { /* f11 & 0x3F */
1418
        case 0x04:
1419
            /* ITOFS */
1420
            if (!(ctx->amask & AMASK_FIX))
1421
                goto invalid_opc;
1422
            gen_itf(ctx, &gen_op_itofs, ra, rc);
1423
            break;
1424
        case 0x0A:
1425
            /* SQRTF */
1426
            if (!(ctx->amask & AMASK_FIX))
1427
                goto invalid_opc;
1428
            gen_farith2(ctx, &gen_op_sqrtf, rb, rc);
1429
            break;
1430
        case 0x0B:
1431
            /* SQRTS */
1432
            if (!(ctx->amask & AMASK_FIX))
1433
                goto invalid_opc;
1434
            gen_farith2(ctx, &gen_op_sqrts, rb, rc);
1435
            break;
1436
        case 0x14:
1437
            /* ITOFF */
1438
            if (!(ctx->amask & AMASK_FIX))
1439
                goto invalid_opc;
1440
#if 0 // TODO
1441
            gen_itf(ctx, &gen_op_itoff, ra, rc);
1442
#else
1443
            goto invalid_opc;
1444
#endif
1445
            break;
1446
        case 0x24:
1447
            /* ITOFT */
1448
            if (!(ctx->amask & AMASK_FIX))
1449
                goto invalid_opc;
1450
            gen_itf(ctx, &gen_op_itoft, ra, rc);
1451
            break;
1452
        case 0x2A:
1453
            /* SQRTG */
1454
            if (!(ctx->amask & AMASK_FIX))
1455
                goto invalid_opc;
1456
            gen_farith2(ctx, &gen_op_sqrtg, rb, rc);
1457
            break;
1458
        case 0x02B:
1459
            /* SQRTT */
1460
            if (!(ctx->amask & AMASK_FIX))
1461
                goto invalid_opc;
1462
            gen_farith2(ctx, &gen_op_sqrtt, rb, rc);
1463
            break;
1464
        default:
1465
            goto invalid_opc;
1466
        }
1467
        break;
1468
    case 0x15:
1469
        /* VAX floating point */
1470
        /* XXX: rounding mode and trap are ignored (!) */
1471
        switch (fpfn) { /* f11 & 0x3F */
1472
        case 0x00:
1473
            /* ADDF */
1474
            gen_farith3(ctx, &gen_op_addf, ra, rb, rc);
1475
            break;
1476
        case 0x01:
1477
            /* SUBF */
1478
            gen_farith3(ctx, &gen_op_subf, ra, rb, rc);
1479
            break;
1480
        case 0x02:
1481
            /* MULF */
1482
            gen_farith3(ctx, &gen_op_mulf, ra, rb, rc);
1483
            break;
1484
        case 0x03:
1485
            /* DIVF */
1486
            gen_farith3(ctx, &gen_op_divf, ra, rb, rc);
1487
            break;
1488
        case 0x1E:
1489
            /* CVTDG */
1490
#if 0 // TODO
1491
            gen_farith2(ctx, &gen_op_cvtdg, rb, rc);
1492
#else
1493
            goto invalid_opc;
1494
#endif
1495
            break;
1496
        case 0x20:
1497
            /* ADDG */
1498
            gen_farith3(ctx, &gen_op_addg, ra, rb, rc);
1499
            break;
1500
        case 0x21:
1501
            /* SUBG */
1502
            gen_farith3(ctx, &gen_op_subg, ra, rb, rc);
1503
            break;
1504
        case 0x22:
1505
            /* MULG */
1506
            gen_farith3(ctx, &gen_op_mulg, ra, rb, rc);
1507
            break;
1508
        case 0x23:
1509
            /* DIVG */
1510
            gen_farith3(ctx, &gen_op_divg, ra, rb, rc);
1511
            break;
1512
        case 0x25:
1513
            /* CMPGEQ */
1514
            gen_farith3(ctx, &gen_op_cmpgeq, ra, rb, rc);
1515
            break;
1516
        case 0x26:
1517
            /* CMPGLT */
1518
            gen_farith3(ctx, &gen_op_cmpglt, ra, rb, rc);
1519
            break;
1520
        case 0x27:
1521
            /* CMPGLE */
1522
            gen_farith3(ctx, &gen_op_cmpgle, ra, rb, rc);
1523
            break;
1524
        case 0x2C:
1525
            /* CVTGF */
1526
            gen_farith2(ctx, &gen_op_cvtgf, rb, rc);
1527
            break;
1528
        case 0x2D:
1529
            /* CVTGD */
1530
#if 0 // TODO
1531
            gen_farith2(ctx, &gen_op_cvtgd, rb, rc);
1532
#else
1533
            goto invalid_opc;
1534
#endif
1535
            break;
1536
        case 0x2F:
1537
            /* CVTGQ */
1538
            gen_farith2(ctx, &gen_op_cvtgq, rb, rc);
1539
            break;
1540
        case 0x3C:
1541
            /* CVTQF */
1542
            gen_farith2(ctx, &gen_op_cvtqf, rb, rc);
1543
            break;
1544
        case 0x3E:
1545
            /* CVTQG */
1546
            gen_farith2(ctx, &gen_op_cvtqg, rb, rc);
1547
            break;
1548
        default:
1549
            goto invalid_opc;
1550
        }
1551
        break;
1552
    case 0x16:
1553
        /* IEEE floating-point */
1554
        /* XXX: rounding mode and traps are ignored (!) */
1555
        switch (fpfn) { /* f11 & 0x3F */
1556
        case 0x00:
1557
            /* ADDS */
1558
            gen_farith3(ctx, &gen_op_adds, ra, rb, rc);
1559
            break;
1560
        case 0x01:
1561
            /* SUBS */
1562
            gen_farith3(ctx, &gen_op_subs, ra, rb, rc);
1563
            break;
1564
        case 0x02:
1565
            /* MULS */
1566
            gen_farith3(ctx, &gen_op_muls, ra, rb, rc);
1567
            break;
1568
        case 0x03:
1569
            /* DIVS */
1570
            gen_farith3(ctx, &gen_op_divs, ra, rb, rc);
1571
            break;
1572
        case 0x20:
1573
            /* ADDT */
1574
            gen_farith3(ctx, &gen_op_addt, ra, rb, rc);
1575
            break;
1576
        case 0x21:
1577
            /* SUBT */
1578
            gen_farith3(ctx, &gen_op_subt, ra, rb, rc);
1579
            break;
1580
        case 0x22:
1581
            /* MULT */
1582
            gen_farith3(ctx, &gen_op_mult, ra, rb, rc);
1583
            break;
1584
        case 0x23:
1585
            /* DIVT */
1586
            gen_farith3(ctx, &gen_op_divt, ra, rb, rc);
1587
            break;
1588
        case 0x24:
1589
            /* CMPTUN */
1590
            gen_farith3(ctx, &gen_op_cmptun, ra, rb, rc);
1591
            break;
1592
        case 0x25:
1593
            /* CMPTEQ */
1594
            gen_farith3(ctx, &gen_op_cmpteq, ra, rb, rc);
1595
            break;
1596
        case 0x26:
1597
            /* CMPTLT */
1598
            gen_farith3(ctx, &gen_op_cmptlt, ra, rb, rc);
1599
            break;
1600
        case 0x27:
1601
            /* CMPTLE */
1602
            gen_farith3(ctx, &gen_op_cmptle, ra, rb, rc);
1603
            break;
1604
        case 0x2C:
1605
            /* XXX: incorrect */
1606
            if (fn11 == 0x2AC) {
1607
                /* CVTST */
1608
                gen_farith2(ctx, &gen_op_cvtst, rb, rc);
1609
            } else {
1610
                /* CVTTS */
1611
                gen_farith2(ctx, &gen_op_cvtts, rb, rc);
1612
            }
1613
            break;
1614
        case 0x2F:
1615
            /* CVTTQ */
1616
            gen_farith2(ctx, &gen_op_cvttq, rb, rc);
1617
            break;
1618
        case 0x3C:
1619
            /* CVTQS */
1620
            gen_farith2(ctx, &gen_op_cvtqs, rb, rc);
1621
            break;
1622
        case 0x3E:
1623
            /* CVTQT */
1624
            gen_farith2(ctx, &gen_op_cvtqt, rb, rc);
1625
            break;
1626
        default:
1627
            goto invalid_opc;
1628
        }
1629
        break;
1630
    case 0x17:
1631
        switch (fn11) {
1632
        case 0x010:
1633
            /* CVTLQ */
1634
            gen_farith2(ctx, &gen_op_cvtlq, rb, rc);
1635
            break;
1636
        case 0x020:
1637
            /* CPYS */
1638
            if (ra == rb) {
1639
                if (ra == 31 && rc == 31) {
1640
                    /* FNOP */
1641
                    gen_op_nop();
1642
                } else {
1643
                    /* FMOV */
1644
                    gen_load_fir(ctx, rb, 0);
1645
                    gen_store_fir(ctx, rc, 0);
1646
                }
1647
            } else {
1648
                gen_farith3(ctx, &gen_op_cpys, ra, rb, rc);
1649
            }
1650
            break;
1651
        case 0x021:
1652
            /* CPYSN */
1653
            gen_farith2(ctx, &gen_op_cpysn, rb, rc);
1654
            break;
1655
        case 0x022:
1656
            /* CPYSE */
1657
            gen_farith2(ctx, &gen_op_cpyse, rb, rc);
1658
            break;
1659
        case 0x024:
1660
            /* MT_FPCR */
1661
            gen_load_fir(ctx, ra, 0);
1662
            gen_op_store_fpcr();
1663
            break;
1664
        case 0x025:
1665
            /* MF_FPCR */
1666
            gen_op_load_fpcr();
1667
            gen_store_fir(ctx, ra, 0);
1668
            break;
1669
        case 0x02A:
1670
            /* FCMOVEQ */
1671
            gen_fcmov(ctx, &gen_op_cmpfeq, ra, rb, rc);
1672
            break;
1673
        case 0x02B:
1674
            /* FCMOVNE */
1675
            gen_fcmov(ctx, &gen_op_cmpfne, ra, rb, rc);
1676
            break;
1677
        case 0x02C:
1678
            /* FCMOVLT */
1679
            gen_fcmov(ctx, &gen_op_cmpflt, ra, rb, rc);
1680
            break;
1681
        case 0x02D:
1682
            /* FCMOVGE */
1683
            gen_fcmov(ctx, &gen_op_cmpfge, ra, rb, rc);
1684
            break;
1685
        case 0x02E:
1686
            /* FCMOVLE */
1687
            gen_fcmov(ctx, &gen_op_cmpfle, ra, rb, rc);
1688
            break;
1689
        case 0x02F:
1690
            /* FCMOVGT */
1691
            gen_fcmov(ctx, &gen_op_cmpfgt, ra, rb, rc);
1692
            break;
1693
        case 0x030:
1694
            /* CVTQL */
1695
            gen_farith2(ctx, &gen_op_cvtql, rb, rc);
1696
            break;
1697
        case 0x130:
1698
            /* CVTQL/V */
1699
            gen_farith2(ctx, &gen_op_cvtqlv, rb, rc);
1700
            break;
1701
        case 0x530:
1702
            /* CVTQL/SV */
1703
            gen_farith2(ctx, &gen_op_cvtqlsv, rb, rc);
1704
            break;
1705
        default:
1706
            goto invalid_opc;
1707
        }
1708
        break;
1709
    case 0x18:
1710
        switch ((uint16_t)disp16) {
1711
        case 0x0000:
1712
            /* TRAPB */
1713
            /* No-op. Just exit from the current tb */
1714
            ret = 2;
1715
            break;
1716
        case 0x0400:
1717
            /* EXCB */
1718
            /* No-op. Just exit from the current tb */
1719
            ret = 2;
1720
            break;
1721
        case 0x4000:
1722
            /* MB */
1723
            /* No-op */
1724
            break;
1725
        case 0x4400:
1726
            /* WMB */
1727
            /* No-op */
1728
            break;
1729
        case 0x8000:
1730
            /* FETCH */
1731
            /* No-op */
1732
            break;
1733
        case 0xA000:
1734
            /* FETCH_M */
1735
            /* No-op */
1736
            break;
1737
        case 0xC000:
1738
            /* RPCC */
1739
            if (ra != 31)
1740
                tcg_gen_helper_1_0(helper_load_pcc, cpu_ir[ra]);
1741
            break;
1742
        case 0xE000:
1743
            /* RC */
1744
            if (ra != 31)
1745
                tcg_gen_helper_1_0(helper_rc, cpu_ir[ra]);
1746
            break;
1747
        case 0xE800:
1748
            /* ECB */
1749
            /* XXX: TODO: evict tb cache at address rb */
1750
#if 0
1751
            ret = 2;
1752
#else
1753
            goto invalid_opc;
1754
#endif
1755
            break;
1756
        case 0xF000:
1757
            /* RS */
1758
            if (ra != 31)
1759
                tcg_gen_helper_1_0(helper_rs, cpu_ir[ra]);
1760
            break;
1761
        case 0xF800:
1762
            /* WH64 */
1763
            /* No-op */
1764
            break;
1765
        default:
1766
            goto invalid_opc;
1767
        }
1768
        break;
1769
    case 0x19:
1770
        /* HW_MFPR (PALcode) */
1771
#if defined (CONFIG_USER_ONLY)
1772
        goto invalid_opc;
1773
#else
1774
        if (!ctx->pal_mode)
1775
            goto invalid_opc;
1776
        gen_op_mfpr(insn & 0xFF);
1777
        if (ra != 31)
1778
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1779
        break;
1780
#endif
1781
    case 0x1A:
1782
        if (ra != 31)
1783
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1784
        if (rb != 31)
1785
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1786
        else
1787
            tcg_gen_movi_i64(cpu_pc, 0);
1788
        /* Those four jumps only differ by the branch prediction hint */
1789
        switch (fn2) {
1790
        case 0x0:
1791
            /* JMP */
1792
            break;
1793
        case 0x1:
1794
            /* JSR */
1795
            break;
1796
        case 0x2:
1797
            /* RET */
1798
            break;
1799
        case 0x3:
1800
            /* JSR_COROUTINE */
1801
            break;
1802
        }
1803
        ret = 1;
1804
        break;
1805
    case 0x1B:
1806
        /* HW_LD (PALcode) */
1807
#if defined (CONFIG_USER_ONLY)
1808
        goto invalid_opc;
1809
#else
1810
        if (!ctx->pal_mode)
1811
            goto invalid_opc;
1812
        if (rb != 31)
1813
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1814
        else
1815
            tcg_gen_movi_i64(cpu_T[0], 0);
1816
        tcg_gen_movi_i64(cpu_T[1], disp12);
1817
        tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
1818
        switch ((insn >> 12) & 0xF) {
1819
        case 0x0:
1820
            /* Longword physical access */
1821
            gen_op_ldl_raw();
1822
            break;
1823
        case 0x1:
1824
            /* Quadword physical access */
1825
            gen_op_ldq_raw();
1826
            break;
1827
        case 0x2:
1828
            /* Longword physical access with lock */
1829
            gen_op_ldl_l_raw();
1830
            break;
1831
        case 0x3:
1832
            /* Quadword physical access with lock */
1833
            gen_op_ldq_l_raw();
1834
            break;
1835
        case 0x4:
1836
            /* Longword virtual PTE fetch */
1837
            gen_op_ldl_kernel();
1838
            break;
1839
        case 0x5:
1840
            /* Quadword virtual PTE fetch */
1841
            gen_op_ldq_kernel();
1842
            break;
1843
        case 0x6:
1844
            /* Invalid */
1845
            goto invalid_opc;
1846
        case 0x7:
1847
            /* Invalid */
1848
            goto invalid_opc;
1849
        case 0x8:
1850
            /* Longword virtual access */
1851
            gen_op_ld_phys_to_virt();
1852
            gen_op_ldl_raw();
1853
            break;
1854
        case 0x9:
1855
            /* Quadword virtual access */
1856
            gen_op_ld_phys_to_virt();
1857
            gen_op_ldq_raw();
1858
            break;
1859
        case 0xA:
1860
            /* Longword virtual access with protection check */
1861
            gen_ldl(ctx);
1862
            break;
1863
        case 0xB:
1864
            /* Quadword virtual access with protection check */
1865
            gen_ldq(ctx);
1866
            break;
1867
        case 0xC:
1868
            /* Longword virtual access with altenate access mode */
1869
            gen_op_set_alt_mode();
1870
            gen_op_ld_phys_to_virt();
1871
            gen_op_ldl_raw();
1872
            gen_op_restore_mode();
1873
            break;
1874
        case 0xD:
1875
            /* Quadword virtual access with altenate access mode */
1876
            gen_op_set_alt_mode();
1877
            gen_op_ld_phys_to_virt();
1878
            gen_op_ldq_raw();
1879
            gen_op_restore_mode();
1880
            break;
1881
        case 0xE:
1882
            /* Longword virtual access with alternate access mode and
1883
             * protection checks
1884
             */
1885
            gen_op_set_alt_mode();
1886
            gen_op_ldl_data();
1887
            gen_op_restore_mode();
1888
            break;
1889
        case 0xF:
1890
            /* Quadword virtual access with alternate access mode and
1891
             * protection checks
1892
             */
1893
            gen_op_set_alt_mode();
1894
            gen_op_ldq_data();
1895
            gen_op_restore_mode();
1896
            break;
1897
        }
1898
        if (ra != 31)
1899
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1900
        break;
1901
#endif
1902
    case 0x1C:
1903
        switch (fn7) {
1904
        case 0x00:
1905
            /* SEXTB */
1906
            if (!(ctx->amask & AMASK_BWX))
1907
                goto invalid_opc;
1908
            if (likely(rc != 31)) {
1909
                if (islit)
1910
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1911
                else if (rb != 31)
1912
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1913
                else
1914
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1915
            }
1916
            break;
1917
        case 0x01:
1918
            /* SEXTW */
1919
            if (!(ctx->amask & AMASK_BWX))
1920
                goto invalid_opc;
1921
            if (likely(rc != 31)) {
1922
                if (islit)
1923
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1924
                else if (rb != 31)
1925
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1926
                else
1927
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1928
            }
1929
            break;
1930
        case 0x30:
1931
            /* CTPOP */
1932
            if (!(ctx->amask & AMASK_CIX))
1933
                goto invalid_opc;
1934
            if (likely(rc != 31)) {
1935
                if (islit)
1936
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1937
                else if (rb != 31)
1938
                    tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1939
                else
1940
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1941
            }
1942
            break;
1943
        case 0x31:
1944
            /* PERR */
1945
            if (!(ctx->amask & AMASK_MVI))
1946
                goto invalid_opc;
1947
            /* XXX: TODO */
1948
            goto invalid_opc;
1949
            break;
1950
        case 0x32:
1951
            /* CTLZ */
1952
            if (!(ctx->amask & AMASK_CIX))
1953
                goto invalid_opc;
1954
            if (likely(rc != 31)) {
1955
                if (islit)
1956
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1957
                else if (rb != 31)
1958
                    tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1959
                else
1960
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1961
            }
1962
            break;
1963
        case 0x33:
1964
            /* CTTZ */
1965
            if (!(ctx->amask & AMASK_CIX))
1966
                goto invalid_opc;
1967
            if (likely(rc != 31)) {
1968
                if (islit)
1969
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1970
                else if (rb != 31)
1971
                    tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1972
                else
1973
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1974
            }
1975
            break;
1976
        case 0x34:
1977
            /* UNPKBW */
1978
            if (!(ctx->amask & AMASK_MVI))
1979
                goto invalid_opc;
1980
            /* XXX: TODO */
1981
            goto invalid_opc;
1982
            break;
1983
        case 0x35:
1984
            /* UNPKWL */
1985
            if (!(ctx->amask & AMASK_MVI))
1986
                goto invalid_opc;
1987
            /* XXX: TODO */
1988
            goto invalid_opc;
1989
            break;
1990
        case 0x36:
1991
            /* PKWB */
1992
            if (!(ctx->amask & AMASK_MVI))
1993
                goto invalid_opc;
1994
            /* XXX: TODO */
1995
            goto invalid_opc;
1996
            break;
1997
        case 0x37:
1998
            /* PKLB */
1999
            if (!(ctx->amask & AMASK_MVI))
2000
                goto invalid_opc;
2001
            /* XXX: TODO */
2002
            goto invalid_opc;
2003
            break;
2004
        case 0x38:
2005
            /* MINSB8 */
2006
            if (!(ctx->amask & AMASK_MVI))
2007
                goto invalid_opc;
2008
            /* XXX: TODO */
2009
            goto invalid_opc;
2010
            break;
2011
        case 0x39:
2012
            /* MINSW4 */
2013
            if (!(ctx->amask & AMASK_MVI))
2014
                goto invalid_opc;
2015
            /* XXX: TODO */
2016
            goto invalid_opc;
2017
            break;
2018
        case 0x3A:
2019
            /* MINUB8 */
2020
            if (!(ctx->amask & AMASK_MVI))
2021
                goto invalid_opc;
2022
            /* XXX: TODO */
2023
            goto invalid_opc;
2024
            break;
2025
        case 0x3B:
2026
            /* MINUW4 */
2027
            if (!(ctx->amask & AMASK_MVI))
2028
                goto invalid_opc;
2029
            /* XXX: TODO */
2030
            goto invalid_opc;
2031
            break;
2032
        case 0x3C:
2033
            /* MAXUB8 */
2034
            if (!(ctx->amask & AMASK_MVI))
2035
                goto invalid_opc;
2036
            /* XXX: TODO */
2037
            goto invalid_opc;
2038
            break;
2039
        case 0x3D:
2040
            /* MAXUW4 */
2041
            if (!(ctx->amask & AMASK_MVI))
2042
                goto invalid_opc;
2043
            /* XXX: TODO */
2044
            goto invalid_opc;
2045
            break;
2046
        case 0x3E:
2047
            /* MAXSB8 */
2048
            if (!(ctx->amask & AMASK_MVI))
2049
                goto invalid_opc;
2050
            /* XXX: TODO */
2051
            goto invalid_opc;
2052
            break;
2053
        case 0x3F:
2054
            /* MAXSW4 */
2055
            if (!(ctx->amask & AMASK_MVI))
2056
                goto invalid_opc;
2057
            /* XXX: TODO */
2058
            goto invalid_opc;
2059
            break;
2060
        case 0x70:
2061
            /* FTOIT */
2062
            if (!(ctx->amask & AMASK_FIX))
2063
                goto invalid_opc;
2064
            gen_fti(ctx, &gen_op_ftoit, ra, rb);
2065
            break;
2066
        case 0x78:
2067
            /* FTOIS */
2068
            if (!(ctx->amask & AMASK_FIX))
2069
                goto invalid_opc;
2070
            gen_fti(ctx, &gen_op_ftois, ra, rb);
2071
            break;
2072
        default:
2073
            goto invalid_opc;
2074
        }
2075
        break;
2076
    case 0x1D:
2077
        /* HW_MTPR (PALcode) */
2078
#if defined (CONFIG_USER_ONLY)
2079
        goto invalid_opc;
2080
#else
2081
        if (!ctx->pal_mode)
2082
            goto invalid_opc;
2083
        if (ra != 31)
2084
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
2085
        else
2086
            tcg_gen_movi_i64(cpu_T[0], 0);
2087
        gen_op_mtpr(insn & 0xFF);
2088
        ret = 2;
2089
        break;
2090
#endif
2091
    case 0x1E:
2092
        /* HW_REI (PALcode) */
2093
#if defined (CONFIG_USER_ONLY)
2094
        goto invalid_opc;
2095
#else
2096
        if (!ctx->pal_mode)
2097
            goto invalid_opc;
2098
        if (rb == 31) {
2099
            /* "Old" alpha */
2100
            gen_op_hw_rei();
2101
        } else {
2102
            if (ra != 31)
2103
                tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
2104
            else
2105
                tcg_gen_movi_i64(cpu_T[0], 0);
2106
            tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
2107
            tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
2108
            gen_op_hw_ret();
2109
        }
2110
        ret = 2;
2111
        break;
2112
#endif
2113
    case 0x1F:
2114
        /* HW_ST (PALcode) */
2115
#if defined (CONFIG_USER_ONLY)
2116
        goto invalid_opc;
2117
#else
2118
        if (!ctx->pal_mode)
2119
            goto invalid_opc;
2120
        if (ra != 31)
2121
            tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp12);
2122
        else
2123
            tcg_gen_movi_i64(cpu_T[0], disp12);
2124
        if (ra != 31)
2125
            tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
2126
        else
2127
            tcg_gen_movi_i64(cpu_T[1], 0);
2128
        switch ((insn >> 12) & 0xF) {
2129
        case 0x0:
2130
            /* Longword physical access */
2131
            gen_op_stl_raw();
2132
            break;
2133
        case 0x1:
2134
            /* Quadword physical access */
2135
            gen_op_stq_raw();
2136
            break;
2137
        case 0x2:
2138
            /* Longword physical access with lock */
2139
            gen_op_stl_c_raw();
2140
            break;
2141
        case 0x3:
2142
            /* Quadword physical access with lock */
2143
            gen_op_stq_c_raw();
2144
            break;
2145
        case 0x4:
2146
            /* Longword virtual access */
2147
            gen_op_st_phys_to_virt();
2148
            gen_op_stl_raw();
2149
            break;
2150
        case 0x5:
2151
            /* Quadword virtual access */
2152
            gen_op_st_phys_to_virt();
2153
            gen_op_stq_raw();
2154
            break;
2155
        case 0x6:
2156
            /* Invalid */
2157
            goto invalid_opc;
2158
        case 0x7:
2159
            /* Invalid */
2160
            goto invalid_opc;
2161
        case 0x8:
2162
            /* Invalid */
2163
            goto invalid_opc;
2164
        case 0x9:
2165
            /* Invalid */
2166
            goto invalid_opc;
2167
        case 0xA:
2168
            /* Invalid */
2169
            goto invalid_opc;
2170
        case 0xB:
2171
            /* Invalid */
2172
            goto invalid_opc;
2173
        case 0xC:
2174
            /* Longword virtual access with alternate access mode */
2175
            gen_op_set_alt_mode();
2176
            gen_op_st_phys_to_virt();
2177
            gen_op_ldl_raw();
2178
            gen_op_restore_mode();
2179
            break;
2180
        case 0xD:
2181
            /* Quadword virtual access with alternate access mode */
2182
            gen_op_set_alt_mode();
2183
            gen_op_st_phys_to_virt();
2184
            gen_op_ldq_raw();
2185
            gen_op_restore_mode();
2186
            break;
2187
        case 0xE:
2188
            /* Invalid */
2189
            goto invalid_opc;
2190
        case 0xF:
2191
            /* Invalid */
2192
            goto invalid_opc;
2193
        }
2194
        ret = 2;
2195
        break;
2196
#endif
2197
    case 0x20:
2198
        /* LDF */
2199
#if 0 // TODO
2200
        gen_load_fmem(ctx, &gen_ldf, ra, rb, disp16);
2201
#else
2202
        goto invalid_opc;
2203
#endif
2204
        break;
2205
    case 0x21:
2206
        /* LDG */
2207
#if 0 // TODO
2208
        gen_load_fmem(ctx, &gen_ldg, ra, rb, disp16);
2209
#else
2210
        goto invalid_opc;
2211
#endif
2212
        break;
2213
    case 0x22:
2214
        /* LDS */
2215
        gen_load_fmem(ctx, &gen_lds, ra, rb, disp16);
2216
        break;
2217
    case 0x23:
2218
        /* LDT */
2219
        gen_load_fmem(ctx, &gen_ldt, ra, rb, disp16);
2220
        break;
2221
    case 0x24:
2222
        /* STF */
2223
#if 0 // TODO
2224
        gen_store_fmem(ctx, &gen_stf, ra, rb, disp16);
2225
#else
2226
        goto invalid_opc;
2227
#endif
2228
        break;
2229
    case 0x25:
2230
        /* STG */
2231
#if 0 // TODO
2232
        gen_store_fmem(ctx, &gen_stg, ra, rb, disp16);
2233
#else
2234
        goto invalid_opc;
2235
#endif
2236
        break;
2237
    case 0x26:
2238
        /* STS */
2239
        gen_store_fmem(ctx, &gen_sts, ra, rb, disp16);
2240
        break;
2241
    case 0x27:
2242
        /* STT */
2243
        gen_store_fmem(ctx, &gen_stt, ra, rb, disp16);
2244
        break;
2245
    case 0x28:
2246
        /* LDL */
2247
        gen_load_mem(ctx, &gen_ldl, ra, rb, disp16, 0);
2248
        break;
2249
    case 0x29:
2250
        /* LDQ */
2251
        gen_load_mem(ctx, &gen_ldq, ra, rb, disp16, 0);
2252
        break;
2253
    case 0x2A:
2254
        /* LDL_L */
2255
        gen_load_mem(ctx, &gen_ldl_l, ra, rb, disp16, 0);
2256
        break;
2257
    case 0x2B:
2258
        /* LDQ_L */
2259
        gen_load_mem(ctx, &gen_ldq_l, ra, rb, disp16, 0);
2260
        break;
2261
    case 0x2C:
2262
        /* STL */
2263
        gen_store_mem(ctx, &gen_stl, ra, rb, disp16, 0);
2264
        break;
2265
    case 0x2D:
2266
        /* STQ */
2267
        gen_store_mem(ctx, &gen_stq, ra, rb, disp16, 0);
2268
        break;
2269
    case 0x2E:
2270
        /* STL_C */
2271
        gen_store_mem(ctx, &gen_stl_c, ra, rb, disp16, 0);
2272
        break;
2273
    case 0x2F:
2274
        /* STQ_C */
2275
        gen_store_mem(ctx, &gen_stq_c, ra, rb, disp16, 0);
2276
        break;
2277
    case 0x30:
2278
        /* BR */
2279
        if (ra != 31)
2280
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2281
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2282
        ret = 1;
2283
        break;
2284
    case 0x31:
2285
        /* FBEQ */
2286
        gen_fbcond(ctx, &gen_op_cmpfeq, ra, disp16);
2287
        ret = 1;
2288
        break;
2289
    case 0x32:
2290
        /* FBLT */
2291
        gen_fbcond(ctx, &gen_op_cmpflt, ra, disp16);
2292
        ret = 1;
2293
        break;
2294
    case 0x33:
2295
        /* FBLE */
2296
        gen_fbcond(ctx, &gen_op_cmpfle, ra, disp16);
2297
        ret = 1;
2298
        break;
2299
    case 0x34:
2300
        /* BSR */
2301
        if (ra != 31)
2302
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2303
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2304
        ret = 1;
2305
        break;
2306
    case 0x35:
2307
        /* FBNE */
2308
        gen_fbcond(ctx, &gen_op_cmpfne, ra, disp16);
2309
        ret = 1;
2310
        break;
2311
    case 0x36:
2312
        /* FBGE */
2313
        gen_fbcond(ctx, &gen_op_cmpfge, ra, disp16);
2314
        ret = 1;
2315
        break;
2316
    case 0x37:
2317
        /* FBGT */
2318
        gen_fbcond(ctx, &gen_op_cmpfgt, ra, disp16);
2319
        ret = 1;
2320
        break;
2321
    case 0x38:
2322
        /* BLBC */
2323
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 1);
2324
        ret = 1;
2325
        break;
2326
    case 0x39:
2327
        /* BEQ */
2328
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 0);
2329
        ret = 1;
2330
        break;
2331
    case 0x3A:
2332
        /* BLT */
2333
        gen_bcond(ctx, TCG_COND_LT, ra, disp16, 0);
2334
        ret = 1;
2335
        break;
2336
    case 0x3B:
2337
        /* BLE */
2338
        gen_bcond(ctx, TCG_COND_LE, ra, disp16, 0);
2339
        ret = 1;
2340
        break;
2341
    case 0x3C:
2342
        /* BLBS */
2343
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 1);
2344
        ret = 1;
2345
        break;
2346
    case 0x3D:
2347
        /* BNE */
2348
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 0);
2349
        ret = 1;
2350
        break;
2351
    case 0x3E:
2352
        /* BGE */
2353
        gen_bcond(ctx, TCG_COND_GE, ra, disp16, 0);
2354
        ret = 1;
2355
        break;
2356
    case 0x3F:
2357
        /* BGT */
2358
        gen_bcond(ctx, TCG_COND_GT, ra, disp16, 0);
2359
        ret = 1;
2360
        break;
2361
    invalid_opc:
2362
        gen_invalid(ctx);
2363
        ret = 3;
2364
        break;
2365
    }
2366

    
2367
    return ret;
2368
}
2369

    
2370
static always_inline void gen_intermediate_code_internal (CPUState *env,
2371
                                                          TranslationBlock *tb,
2372
                                                          int search_pc)
2373
{
2374
#if defined ALPHA_DEBUG_DISAS
2375
    static int insn_count;
2376
#endif
2377
    DisasContext ctx, *ctxp = &ctx;
2378
    target_ulong pc_start;
2379
    uint32_t insn;
2380
    uint16_t *gen_opc_end;
2381
    int j, lj = -1;
2382
    int ret;
2383
    int num_insns;
2384
    int max_insns;
2385

    
2386
    pc_start = tb->pc;
2387
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2388
    ctx.pc = pc_start;
2389
    ctx.amask = env->amask;
2390
#if defined (CONFIG_USER_ONLY)
2391
    ctx.mem_idx = 0;
2392
#else
2393
    ctx.mem_idx = ((env->ps >> 3) & 3);
2394
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2395
#endif
2396
    num_insns = 0;
2397
    max_insns = tb->cflags & CF_COUNT_MASK;
2398
    if (max_insns == 0)
2399
        max_insns = CF_COUNT_MASK;
2400

    
2401
    gen_icount_start();
2402
    for (ret = 0; ret == 0;) {
2403
        if (env->nb_breakpoints > 0) {
2404
            for(j = 0; j < env->nb_breakpoints; j++) {
2405
                if (env->breakpoints[j] == ctx.pc) {
2406
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2407
                    break;
2408
                }
2409
            }
2410
        }
2411
        if (search_pc) {
2412
            j = gen_opc_ptr - gen_opc_buf;
2413
            if (lj < j) {
2414
                lj++;
2415
                while (lj < j)
2416
                    gen_opc_instr_start[lj++] = 0;
2417
                gen_opc_pc[lj] = ctx.pc;
2418
                gen_opc_instr_start[lj] = 1;
2419
                gen_opc_icount[lj] = num_insns;
2420
            }
2421
        }
2422
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2423
            gen_io_start();
2424
#if defined ALPHA_DEBUG_DISAS
2425
        insn_count++;
2426
        if (logfile != NULL) {
2427
            fprintf(logfile, "pc " TARGET_FMT_lx " mem_idx %d\n",
2428
                    ctx.pc, ctx.mem_idx);
2429
        }
2430
#endif
2431
        insn = ldl_code(ctx.pc);
2432
#if defined ALPHA_DEBUG_DISAS
2433
        insn_count++;
2434
        if (logfile != NULL) {
2435
            fprintf(logfile, "opcode %08x %d\n", insn, insn_count);
2436
        }
2437
#endif
2438
        num_insns++;
2439
        ctx.pc += 4;
2440
        ret = translate_one(ctxp, insn);
2441
        if (ret != 0)
2442
            break;
2443
        /* if we reach a page boundary or are single stepping, stop
2444
         * generation
2445
         */
2446
        if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) ||
2447
            (env->singlestep_enabled) ||
2448
            num_insns >= max_insns) {
2449
            break;
2450
        }
2451
#if defined (DO_SINGLE_STEP)
2452
        break;
2453
#endif
2454
    }
2455
    if (ret != 1 && ret != 3) {
2456
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
2457
    }
2458
#if defined (DO_TB_FLUSH)
2459
    tcg_gen_helper_0_0(helper_tb_flush);
2460
#endif
2461
    if (tb->cflags & CF_LAST_IO)
2462
        gen_io_end();
2463
    /* Generate the return instruction */
2464
    tcg_gen_exit_tb(0);
2465
    gen_icount_end(tb, num_insns);
2466
    *gen_opc_ptr = INDEX_op_end;
2467
    if (search_pc) {
2468
        j = gen_opc_ptr - gen_opc_buf;
2469
        lj++;
2470
        while (lj <= j)
2471
            gen_opc_instr_start[lj++] = 0;
2472
    } else {
2473
        tb->size = ctx.pc - pc_start;
2474
        tb->icount = num_insns;
2475
    }
2476
#if defined ALPHA_DEBUG_DISAS
2477
    if (loglevel & CPU_LOG_TB_CPU) {
2478
        cpu_dump_state(env, logfile, fprintf, 0);
2479
    }
2480
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2481
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
2482
        target_disas(logfile, pc_start, ctx.pc - pc_start, 1);
2483
        fprintf(logfile, "\n");
2484
    }
2485
#endif
2486
}
2487

    
2488
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2489
{
2490
    gen_intermediate_code_internal(env, tb, 0);
2491
}
2492

    
2493
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2494
{
2495
    gen_intermediate_code_internal(env, tb, 1);
2496
}
2497

    
2498
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2499
{
2500
    CPUAlphaState *env;
2501
    uint64_t hwpcb;
2502

    
2503
    env = qemu_mallocz(sizeof(CPUAlphaState));
2504
    if (!env)
2505
        return NULL;
2506
    cpu_exec_init(env);
2507
    alpha_translate_init();
2508
    tlb_flush(env, 1);
2509
    /* XXX: should not be hardcoded */
2510
    env->implver = IMPLVER_2106x;
2511
    env->ps = 0x1F00;
2512
#if defined (CONFIG_USER_ONLY)
2513
    env->ps |= 1 << 3;
2514
#endif
2515
    pal_init(env);
2516
    /* Initialize IPR */
2517
    hwpcb = env->ipr[IPR_PCBB];
2518
    env->ipr[IPR_ASN] = 0;
2519
    env->ipr[IPR_ASTEN] = 0;
2520
    env->ipr[IPR_ASTSR] = 0;
2521
    env->ipr[IPR_DATFX] = 0;
2522
    /* XXX: fix this */
2523
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2524
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2525
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2526
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2527
    env->ipr[IPR_FEN] = 0;
2528
    env->ipr[IPR_IPL] = 31;
2529
    env->ipr[IPR_MCES] = 0;
2530
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2531
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2532
    env->ipr[IPR_SISR] = 0;
2533
    env->ipr[IPR_VIRBND] = -1ULL;
2534

    
2535
    return env;
2536
}
2537

    
2538
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2539
                unsigned long searched_pc, int pc_pos, void *puc)
2540
{
2541
    env->pc = gen_opc_pc[pc_pos];
2542
}