Statistics
| Branch: | Revision:

root / target-sparc / op.c @ d3c61721

History | View | Annotate | Download (16.6 kB)

1
/*
2
   SPARC micro operations
3

4
   Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
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 "exec.h"
22

    
23
 /*XXX*/
24
#define REGNAME g0
25
#define REG (env->gregs[0])
26
#include "op_template.h"
27
#define REGNAME g1
28
#define REG (env->gregs[1])
29
#include "op_template.h"
30
#define REGNAME g2
31
#define REG (env->gregs[2])
32
#include "op_template.h"
33
#define REGNAME g3
34
#define REG (env->gregs[3])
35
#include "op_template.h"
36
#define REGNAME g4
37
#define REG (env->gregs[4])
38
#include "op_template.h"
39
#define REGNAME g5
40
#define REG (env->gregs[5])
41
#include "op_template.h"
42
#define REGNAME g6
43
#define REG (env->gregs[6])
44
#include "op_template.h"
45
#define REGNAME g7
46
#define REG (env->gregs[7])
47
#include "op_template.h"
48
#define REGNAME i0
49
#define REG (env->regwptr[16])
50
#include "op_template.h"
51
#define REGNAME i1
52
#define REG (env->regwptr[17])
53
#include "op_template.h"
54
#define REGNAME i2
55
#define REG (env->regwptr[18])
56
#include "op_template.h"
57
#define REGNAME i3
58
#define REG (env->regwptr[19])
59
#include "op_template.h"
60
#define REGNAME i4
61
#define REG (env->regwptr[20])
62
#include "op_template.h"
63
#define REGNAME i5
64
#define REG (env->regwptr[21])
65
#include "op_template.h"
66
#define REGNAME i6
67
#define REG (env->regwptr[22])
68
#include "op_template.h"
69
#define REGNAME i7
70
#define REG (env->regwptr[23])
71
#include "op_template.h"
72
#define REGNAME l0
73
#define REG (env->regwptr[8])
74
#include "op_template.h"
75
#define REGNAME l1
76
#define REG (env->regwptr[9])
77
#include "op_template.h"
78
#define REGNAME l2
79
#define REG (env->regwptr[10])
80
#include "op_template.h"
81
#define REGNAME l3
82
#define REG (env->regwptr[11])
83
#include "op_template.h"
84
#define REGNAME l4
85
#define REG (env->regwptr[12])
86
#include "op_template.h"
87
#define REGNAME l5
88
#define REG (env->regwptr[13])
89
#include "op_template.h"
90
#define REGNAME l6
91
#define REG (env->regwptr[14])
92
#include "op_template.h"
93
#define REGNAME l7
94
#define REG (env->regwptr[15])
95
#include "op_template.h"
96
#define REGNAME o0
97
#define REG (env->regwptr[0])
98
#include "op_template.h"
99
#define REGNAME o1
100
#define REG (env->regwptr[1])
101
#include "op_template.h"
102
#define REGNAME o2
103
#define REG (env->regwptr[2])
104
#include "op_template.h"
105
#define REGNAME o3
106
#define REG (env->regwptr[3])
107
#include "op_template.h"
108
#define REGNAME o4
109
#define REG (env->regwptr[4])
110
#include "op_template.h"
111
#define REGNAME o5
112
#define REG (env->regwptr[5])
113
#include "op_template.h"
114
#define REGNAME o6
115
#define REG (env->regwptr[6])
116
#include "op_template.h"
117
#define REGNAME o7
118
#define REG (env->regwptr[7])
119
#include "op_template.h"
120

    
121
#define REGNAME f0
122
#define REG (env->fpr[0])
123
#include "fop_template.h"
124
#define REGNAME f1
125
#define REG (env->fpr[1])
126
#include "fop_template.h"
127
#define REGNAME f2
128
#define REG (env->fpr[2])
129
#include "fop_template.h"
130
#define REGNAME f3
131
#define REG (env->fpr[3])
132
#include "fop_template.h"
133
#define REGNAME f4
134
#define REG (env->fpr[4])
135
#include "fop_template.h"
136
#define REGNAME f5
137
#define REG (env->fpr[5])
138
#include "fop_template.h"
139
#define REGNAME f6
140
#define REG (env->fpr[6])
141
#include "fop_template.h"
142
#define REGNAME f7
143
#define REG (env->fpr[7])
144
#include "fop_template.h"
145
#define REGNAME f8
146
#define REG (env->fpr[8])
147
#include "fop_template.h"
148
#define REGNAME f9
149
#define REG (env->fpr[9])
150
#include "fop_template.h"
151
#define REGNAME f10
152
#define REG (env->fpr[10])
153
#include "fop_template.h"
154
#define REGNAME f11
155
#define REG (env->fpr[11])
156
#include "fop_template.h"
157
#define REGNAME f12
158
#define REG (env->fpr[12])
159
#include "fop_template.h"
160
#define REGNAME f13
161
#define REG (env->fpr[13])
162
#include "fop_template.h"
163
#define REGNAME f14
164
#define REG (env->fpr[14])
165
#include "fop_template.h"
166
#define REGNAME f15
167
#define REG (env->fpr[15])
168
#include "fop_template.h"
169
#define REGNAME f16
170
#define REG (env->fpr[16])
171
#include "fop_template.h"
172
#define REGNAME f17
173
#define REG (env->fpr[17])
174
#include "fop_template.h"
175
#define REGNAME f18
176
#define REG (env->fpr[18])
177
#include "fop_template.h"
178
#define REGNAME f19
179
#define REG (env->fpr[19])
180
#include "fop_template.h"
181
#define REGNAME f20
182
#define REG (env->fpr[20])
183
#include "fop_template.h"
184
#define REGNAME f21
185
#define REG (env->fpr[21])
186
#include "fop_template.h"
187
#define REGNAME f22
188
#define REG (env->fpr[22])
189
#include "fop_template.h"
190
#define REGNAME f23
191
#define REG (env->fpr[23])
192
#include "fop_template.h"
193
#define REGNAME f24
194
#define REG (env->fpr[24])
195
#include "fop_template.h"
196
#define REGNAME f25
197
#define REG (env->fpr[25])
198
#include "fop_template.h"
199
#define REGNAME f26
200
#define REG (env->fpr[26])
201
#include "fop_template.h"
202
#define REGNAME f27
203
#define REG (env->fpr[27])
204
#include "fop_template.h"
205
#define REGNAME f28
206
#define REG (env->fpr[28])
207
#include "fop_template.h"
208
#define REGNAME f29
209
#define REG (env->fpr[29])
210
#include "fop_template.h"
211
#define REGNAME f30
212
#define REG (env->fpr[30])
213
#include "fop_template.h"
214
#define REGNAME f31
215
#define REG (env->fpr[31])
216
#include "fop_template.h"
217

    
218
#define EIP (env->pc)
219

    
220
#define FLAG_SET(x) (env->psr&x)?1:0
221
#define FFLAG_SET(x) ((env->fsr&x)?1:0)
222

    
223
void OPPROTO op_movl_T0_0(void)
224
{
225
    T0 = 0;
226
}
227

    
228
void OPPROTO op_movl_T0_1(void)
229
{
230
    T0 = 1;
231
}
232

    
233
void OPPROTO op_movl_T0_im(void)
234
{
235
    T0 = PARAM1;
236
}
237

    
238
void OPPROTO op_movl_T1_im(void)
239
{
240
    T1 = PARAM1;
241
}
242

    
243
void OPPROTO op_movl_T2_im(void)
244
{
245
    T2 = PARAM1;
246
}
247

    
248
void OPPROTO op_addl_T1_im(void)
249
{
250
    T1 += PARAM1;
251
}
252

    
253
void OPPROTO op_addl_T1_T2(void)
254
{
255
    T1 += T2;
256
}
257

    
258
void OPPROTO op_subl_T1_T2(void)
259
{
260
    T1 -= T2;
261
}
262

    
263
void OPPROTO op_add_T1_T0(void)
264
{
265
    T0 += T1;
266
}
267

    
268
void OPPROTO op_add_T1_T0_cc(void)
269
{
270
    unsigned int src1;
271
    src1 = T0;
272
    T0 += T1;
273
    env->psr = 0;
274
    if (!T0)
275
        env->psr |= PSR_ZERO;
276
    if ((int) T0 < 0)
277
        env->psr |= PSR_NEG;
278
    if (T0 < src1)
279
        env->psr |= PSR_CARRY;
280
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
281
        env->psr |= PSR_OVF;
282
    FORCE_RET();
283
}
284

    
285
void OPPROTO op_sub_T1_T0(void)
286
{
287
    T0 -= T1;
288
}
289

    
290
void OPPROTO op_sub_T1_T0_cc(void)
291
{
292
    unsigned int src1;
293

    
294
    src1 = T0;
295
    T0 -= T1;
296
    env->psr = 0;
297
    if (!T0)
298
        env->psr |= PSR_ZERO;
299
    if ((int) T0 < 0)
300
        env->psr |= PSR_NEG;
301
    if (src1 < T1)
302
        env->psr |= PSR_CARRY;
303
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
304
        env->psr |= PSR_OVF;
305
    FORCE_RET();
306
}
307

    
308
void OPPROTO op_and_T1_T0(void)
309
{
310
    T0 &= T1;
311
}
312

    
313
void OPPROTO op_or_T1_T0(void)
314
{
315
    T0 |= T1;
316
}
317

    
318
void OPPROTO op_xor_T1_T0(void)
319
{
320
    T0 ^= T1;
321
}
322

    
323
void OPPROTO op_andn_T1_T0(void)
324
{
325
    T0 &= ~T1;
326
}
327

    
328
void OPPROTO op_orn_T1_T0(void)
329
{
330
    T0 |= ~T1;
331
}
332

    
333
void OPPROTO op_xnor_T1_T0(void)
334
{
335
    T0 ^= ~T1;
336
}
337

    
338
void OPPROTO op_addx_T1_T0(void)
339
{
340
    T0 += T1 + ((env->psr & PSR_CARRY) ? 1 : 0);
341
}
342

    
343
void OPPROTO op_umul_T1_T0(void)
344
{
345
    uint64_t res;
346
    res = (uint64_t) T0 *(uint64_t) T1;
347
    T0 = res & 0xffffffff;
348
    env->y = res >> 32;
349
}
350

    
351
void OPPROTO op_smul_T1_T0(void)
352
{
353
    uint64_t res;
354
    res = (int64_t) ((int32_t) T0) * (int64_t) ((int32_t) T1);
355
    T0 = res & 0xffffffff;
356
    env->y = res >> 32;
357
}
358

    
359
void OPPROTO op_mulscc_T1_T0(void)
360
{
361
    unsigned int b1, N, V, b2, src1;
362
    N = FLAG_SET(PSR_NEG);
363
    V = FLAG_SET(PSR_OVF);
364
    b1 = N ^ V;
365
    b2 = T0 & 1;
366
    T0 = (b1 << 31) | (T0 >> 1);
367
    if (!(env->y & 1))
368
        T1 = 0;
369
    /* do addition and update flags */
370
    src1 = T0;
371
    T0 += T1;
372
    env->psr = 0;
373
    if (!T0)
374
        env->psr |= PSR_ZERO;
375
    if ((int) T0 < 0)
376
        env->psr |= PSR_NEG;
377
    if (T0 < src1)
378
        env->psr |= PSR_CARRY;
379
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
380
        env->psr |= PSR_OVF;
381
    env->y = (b2 << 31) | (env->y >> 1);
382
    FORCE_RET();
383
}
384

    
385
void OPPROTO op_udiv_T1_T0(void)
386
{
387
    uint64_t x0;
388
    uint32_t x1;
389

    
390
    x0 = T0 | ((uint64_t) (env->y) << 32);
391
    x1 = T1;
392
    x0 = x0 / x1;
393
    if (x0 > 0xffffffff) {
394
        T0 = 0xffffffff;
395
        T1 = 1;
396
    } else {
397
        T0 = x0;
398
        T1 = 0;
399
    }
400
    FORCE_RET();
401
}
402

    
403
void OPPROTO op_sdiv_T1_T0(void)
404
{
405
    int64_t x0;
406
    int32_t x1;
407

    
408
    x0 = T0 | ((uint64_t) (env->y) << 32);
409
    x1 = T1;
410
    x0 = x0 / x1;
411
    if ((int32_t) x0 != x0) {
412
        T0 = x0 >> 63;
413
        T1 = 1;
414
    } else {
415
        T0 = x0;
416
        T1 = 0;
417
    }
418
    FORCE_RET();
419
}
420

    
421
void OPPROTO op_div_cc(void)
422
{
423
    env->psr = 0;
424
    if (!T0)
425
        env->psr |= PSR_ZERO;
426
    if ((int) T0 < 0)
427
        env->psr |= PSR_NEG;
428
    if (T1)
429
        env->psr |= PSR_OVF;
430
    FORCE_RET();
431
}
432

    
433
void OPPROTO op_subx_T1_T0(void)
434
{
435
    T0 -= T1 + ((env->psr & PSR_CARRY) ? 1 : 0);
436
}
437

    
438
void OPPROTO op_logic_T0_cc(void)
439
{
440
    env->psr = 0;
441
    if (!T0)
442
        env->psr |= PSR_ZERO;
443
    if ((int) T0 < 0)
444
        env->psr |= PSR_NEG;
445
    FORCE_RET();
446
}
447

    
448
void OPPROTO op_set_flags(void)
449
{
450
    env->psr = 0;
451
    if (!T0)
452
        env->psr |= PSR_ZERO;
453
    if ((unsigned int) T0 < (unsigned int) T1)
454
        env->psr |= PSR_CARRY;
455
    if ((int) T0 < (int) T1)
456
        env->psr |= PSR_OVF;
457
    if ((int) T0 < 0)
458
        env->psr |= PSR_NEG;
459
    FORCE_RET();
460
}
461

    
462
void OPPROTO op_sll(void)
463
{
464
    T0 <<= T1;
465
}
466

    
467
void OPPROTO op_srl(void)
468
{
469
    T0 >>= T1;
470
}
471

    
472
void OPPROTO op_sra(void)
473
{
474
    T0 = ((int32_t) T0) >> T1;
475
}
476

    
477
/* Load and store */
478
#define MEMSUFFIX _raw
479
#include "op_mem.h"
480
#if !defined(CONFIG_USER_ONLY)
481
#define MEMSUFFIX _user
482
#include "op_mem.h"
483

    
484
#define MEMSUFFIX _kernel
485
#include "op_mem.h"
486
#endif
487

    
488
void OPPROTO op_ldfsr(void)
489
{
490
    env->fsr = *((uint32_t *) &FT0);
491
    helper_ldfsr();
492
}
493

    
494
void OPPROTO op_stfsr(void)
495
{
496
    *((uint32_t *) &FT0) = env->fsr;
497
}
498

    
499
void OPPROTO op_wry(void)
500
{
501
    env->y = T0;
502
}
503

    
504
void OPPROTO op_rdy(void)
505
{
506
    T0 = env->y;
507
}
508

    
509
void OPPROTO op_rdwim(void)
510
{
511
    T0 = env->wim;
512
}
513

    
514
void OPPROTO op_wrwim(void)
515
{
516
    env->wim = T0;
517
    FORCE_RET();
518
}
519

    
520
void OPPROTO op_rdpsr(void)
521
{
522
    T0 = GET_PSR(env);
523
}
524

    
525
void OPPROTO op_wrpsr(void)
526
{
527
    PUT_PSR(env,T0);
528
    FORCE_RET();
529
}
530

    
531
void OPPROTO op_rdtbr(void)
532
{
533
    T0 = env->tbr;
534
}
535

    
536
void OPPROTO op_wrtbr(void)
537
{
538
    env->tbr = T0;
539
    FORCE_RET();
540
}
541

    
542
void OPPROTO op_rett(void)
543
{
544
    helper_rett();
545
    FORCE_RET();
546
}
547

    
548
void raise_exception(int tt)
549
{
550
    env->exception_index = tt;
551
    cpu_loop_exit();
552
}   
553

    
554
/* XXX: use another pointer for %iN registers to avoid slow wrapping
555
   handling ? */
556
void OPPROTO op_save(void)
557
{
558
    int cwp;
559
    cwp = (env->cwp - 1) & (NWINDOWS - 1); 
560
    if (env->wim & (1 << cwp)) {
561
        raise_exception(TT_WIN_OVF);
562
    }
563
    set_cwp(cwp);
564
    FORCE_RET();
565
}
566

    
567
void OPPROTO op_restore(void)
568
{
569
    int cwp;
570
    cwp = (env->cwp + 1) & (NWINDOWS - 1); 
571
    if (env->wim & (1 << cwp)) {
572
        raise_exception(TT_WIN_UNF);
573
    }
574
    set_cwp(cwp);
575
    FORCE_RET();
576
}
577

    
578
void OPPROTO op_exception(void)
579
{
580
    env->exception_index = PARAM1;
581
    cpu_loop_exit();
582
}
583

    
584
void OPPROTO op_trap_T0(void)
585
{
586
    env->exception_index = TT_TRAP + (T0 & 0x7f);
587
    cpu_loop_exit();
588
}
589

    
590
void OPPROTO op_trapcc_T0(void)
591
{
592
    if (T2) {
593
        env->exception_index = TT_TRAP + (T0 & 0x7f);
594
        cpu_loop_exit();
595
    }
596
    FORCE_RET();
597
}
598

    
599
void OPPROTO op_trap_ifnofpu(void)
600
{
601
    if (!env->psref) {
602
        env->exception_index = TT_NFPU_INSN;
603
        cpu_loop_exit();
604
    }
605
    FORCE_RET();
606
}
607

    
608
void OPPROTO op_fpexception_im(void)
609
{
610
    env->exception_index = TT_FP_EXCP;
611
    env->fsr &= ~FSR_FTT_MASK;
612
    env->fsr |= PARAM1;
613
    cpu_loop_exit();
614
    FORCE_RET();
615
}
616

    
617
void OPPROTO op_debug(void)
618
{
619
    helper_debug();
620
}
621

    
622
void OPPROTO op_exit_tb(void)
623
{
624
    EXIT_TB();
625
}
626

    
627
void OPPROTO op_eval_be(void)
628
{
629
    T2 = (env->psr & PSR_ZERO);
630
}
631

    
632
void OPPROTO op_eval_ble(void)
633
{
634
    unsigned int Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
635
    
636
    T2 = Z | (N ^ V);
637
}
638

    
639
void OPPROTO op_eval_bl(void)
640
{
641
    unsigned int N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
642

    
643
    T2 = N ^ V;
644
}
645

    
646
void OPPROTO op_eval_bleu(void)
647
{
648
    unsigned int Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
649

    
650
    T2 = C | Z;
651
}
652

    
653
void OPPROTO op_eval_bcs(void)
654
{
655
    T2 = (env->psr & PSR_CARRY);
656
}
657

    
658
void OPPROTO op_eval_bvs(void)
659
{
660
    T2 = (env->psr & PSR_OVF);
661
}
662

    
663
void OPPROTO op_eval_bneg(void)
664
{
665
    T2 = (env->psr & PSR_NEG);
666
}
667

    
668
void OPPROTO op_eval_bne(void)
669
{
670
    T2 = !(env->psr & PSR_ZERO);
671
}
672

    
673
void OPPROTO op_eval_bg(void)
674
{
675
    unsigned int Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
676

    
677
    T2 = !(Z | (N ^ V));
678
}
679

    
680
void OPPROTO op_eval_bge(void)
681
{
682
    unsigned int N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
683

    
684
    T2 = !(N ^ V);
685
}
686

    
687
void OPPROTO op_eval_bgu(void)
688
{
689
    unsigned int Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
690

    
691
    T2 = !(C | Z);
692
}
693

    
694
void OPPROTO op_eval_bcc(void)
695
{
696
    T2 = !(env->psr & PSR_CARRY);
697
}
698

    
699
void OPPROTO op_eval_bpos(void)
700
{
701
    T2 = !(env->psr & PSR_NEG);
702
}
703

    
704
void OPPROTO op_eval_bvc(void)
705
{
706
    T2 = !(env->psr & PSR_OVF);
707
}
708

    
709
/* FCC1:FCC0: 0 =, 1 <, 2 >, 3 u */
710

    
711
void OPPROTO op_eval_fbne(void)
712
{
713
// !0
714
    T2 = (env->fsr & (FSR_FCC1 | FSR_FCC0)); /* L or G or U */
715
}
716

    
717
void OPPROTO op_eval_fblg(void)
718
{
719
// 1 or 2
720
    T2 = FFLAG_SET(FSR_FCC0) ^ FFLAG_SET(FSR_FCC1);
721
}
722

    
723
void OPPROTO op_eval_fbul(void)
724
{
725
// 1 or 3
726
    T2 = FFLAG_SET(FSR_FCC0);
727
}
728

    
729
void OPPROTO op_eval_fbl(void)
730
{
731
// 1
732
    T2 = FFLAG_SET(FSR_FCC0) & !FFLAG_SET(FSR_FCC1);
733
}
734

    
735
void OPPROTO op_eval_fbug(void)
736
{
737
// 2 or 3
738
    T2 = FFLAG_SET(FSR_FCC1);
739
}
740

    
741
void OPPROTO op_eval_fbg(void)
742
{
743
// 2
744
    T2 = !FFLAG_SET(FSR_FCC0) & FFLAG_SET(FSR_FCC1);
745
}
746

    
747
void OPPROTO op_eval_fbu(void)
748
{
749
// 3
750
    T2 = FFLAG_SET(FSR_FCC0) & FFLAG_SET(FSR_FCC1);
751
}
752

    
753
void OPPROTO op_eval_fbe(void)
754
{
755
// 0
756
    T2 = !FFLAG_SET(FSR_FCC0) & !FFLAG_SET(FSR_FCC1);
757
}
758

    
759
void OPPROTO op_eval_fbue(void)
760
{
761
// 0 or 3
762
    T2 = !(FFLAG_SET(FSR_FCC1) ^ FFLAG_SET(FSR_FCC0));
763
}
764

    
765
void OPPROTO op_eval_fbge(void)
766
{
767
// 0 or 2
768
    T2 = !FFLAG_SET(FSR_FCC0);
769
}
770

    
771
void OPPROTO op_eval_fbuge(void)
772
{
773
// !1
774
    T2 = !(FFLAG_SET(FSR_FCC0) & !FFLAG_SET(FSR_FCC1));
775
}
776

    
777
void OPPROTO op_eval_fble(void)
778
{
779
// 0 or 1
780
    T2 = !FFLAG_SET(FSR_FCC1);
781
}
782

    
783
void OPPROTO op_eval_fbule(void)
784
{
785
// !2
786
    T2 = !(!FFLAG_SET(FSR_FCC0) & FFLAG_SET(FSR_FCC1));
787
}
788

    
789
void OPPROTO op_eval_fbo(void)
790
{
791
// !3
792
    T2 = !(FFLAG_SET(FSR_FCC0) & FFLAG_SET(FSR_FCC1));
793
}
794

    
795
void OPPROTO op_movl_T2_0(void)
796
{
797
    T2 = 0;
798
}
799

    
800
void OPPROTO op_movl_T2_1(void)
801
{
802
    T2 = 1;
803
}
804

    
805
void OPPROTO op_jmp_im(void)
806
{
807
    env->pc = PARAM1;
808
}
809

    
810
void OPPROTO op_movl_npc_im(void)
811
{
812
    env->npc = PARAM1;
813
}
814

    
815
void OPPROTO op_movl_npc_T0(void)
816
{
817
    env->npc = T0;
818
}
819

    
820
void OPPROTO op_next_insn(void)
821
{
822
    env->pc = env->npc;
823
    env->npc = env->npc + 4;
824
}
825

    
826
void OPPROTO op_branch(void)
827
{
828
    env->npc = PARAM3; /* XXX: optimize */
829
    JUMP_TB(op_branch, PARAM1, 0, PARAM2);
830
}
831

    
832
void OPPROTO op_branch2(void)
833
{
834
    if (T2) {
835
        env->npc = PARAM2 + 4; 
836
        JUMP_TB(op_branch2, PARAM1, 0, PARAM2);
837
    } else {
838
        env->npc = PARAM3 + 4; 
839
        JUMP_TB(op_branch2, PARAM1, 1, PARAM3);
840
    }
841
    FORCE_RET();
842
}
843

    
844
void OPPROTO op_branch_a(void)
845
{
846
    if (T2) {
847
        env->npc = PARAM2; /* XXX: optimize */
848
        JUMP_TB(op_generic_branch_a, PARAM1, 0, PARAM3);
849
    } else {
850
        env->npc = PARAM3 + 8; /* XXX: optimize */
851
        JUMP_TB(op_generic_branch_a, PARAM1, 1, PARAM3 + 4);
852
    }
853
    FORCE_RET();
854
}
855

    
856
void OPPROTO op_generic_branch(void)
857
{
858
    if (T2) {
859
        env->npc = PARAM1;
860
    } else {
861
        env->npc = PARAM2;
862
    }
863
    FORCE_RET();
864
}
865

    
866
void OPPROTO op_flush_T0(void)
867
{
868
    helper_flush(T0);
869
}
870

    
871
void OPPROTO op_fnegs(void)
872
{
873
    FT0 = -FT1;
874
}
875

    
876
void OPPROTO op_fabss(void)
877
{
878
    do_fabss();
879
}
880

    
881
void OPPROTO op_fsqrts(void)
882
{
883
    do_fsqrts();
884
}
885

    
886
void OPPROTO op_fsqrtd(void)
887
{
888
    do_fsqrtd();
889
}
890

    
891
void OPPROTO op_fmuls(void)
892
{
893
    FT0 *= FT1;
894
}
895

    
896
void OPPROTO op_fmuld(void)
897
{
898
    DT0 *= DT1;
899
}
900

    
901
void OPPROTO op_fsmuld(void)
902
{
903
    DT0 = FT0 * FT1;
904
}
905

    
906
void OPPROTO op_fadds(void)
907
{
908
    FT0 += FT1;
909
}
910

    
911
void OPPROTO op_faddd(void)
912
{
913
    DT0 += DT1;
914
}
915

    
916
void OPPROTO op_fsubs(void)
917
{
918
    FT0 -= FT1;
919
}
920

    
921
void OPPROTO op_fsubd(void)
922
{
923
    DT0 -= DT1;
924
}
925

    
926
void OPPROTO op_fdivs(void)
927
{
928
    FT0 /= FT1;
929
}
930

    
931
void OPPROTO op_fdivd(void)
932
{
933
    DT0 /= DT1;
934
}
935

    
936
void OPPROTO op_fcmps(void)
937
{
938
    do_fcmps();
939
}
940

    
941
void OPPROTO op_fcmpd(void)
942
{
943
    do_fcmpd();
944
}
945

    
946
#ifdef USE_INT_TO_FLOAT_HELPERS
947
void OPPROTO op_fitos(void)
948
{
949
    do_fitos();
950
}
951

    
952
void OPPROTO op_fitod(void)
953
{
954
    do_fitod();
955
}
956
#else
957
void OPPROTO op_fitos(void)
958
{
959
    FT0 = (float) *((int32_t *)&FT1);
960
}
961

    
962
void OPPROTO op_fitod(void)
963
{
964
    DT0 = (double) *((int32_t *)&FT1);
965
}
966
#endif
967

    
968
void OPPROTO op_fdtos(void)
969
{
970
    FT0 = (float) DT1;
971
}
972

    
973
void OPPROTO op_fstod(void)
974
{
975
    DT0 = (double) FT1;
976
}
977

    
978
void OPPROTO op_fstoi(void)
979
{
980
    *((int32_t *)&FT0) = (int32_t) FT1;
981
}
982

    
983
void OPPROTO op_fdtoi(void)
984
{
985
    *((int32_t *)&FT0) = (int32_t) DT1;
986
}
987

    
988
void OPPROTO op_ld_asi()
989
{
990
    helper_ld_asi(PARAM1, PARAM2, PARAM3);
991
}
992

    
993
void OPPROTO op_st_asi()
994
{
995
    helper_st_asi(PARAM1, PARAM2, PARAM3);
996
}
997