Revision 24988dc2 target-sh4/translate.c

b/target-sh4/translate.c
268 268
    case 0x0018:		/* sett */
269 269
	gen_op_sett();
270 270
	return;
271
    case 0xfbfb:		/* frchg */
271
    case 0xfbfd:		/* frchg */
272 272
	gen_op_frchg();
273 273
	ctx->bstate = BS_STOP;
274 274
	return;
275
    case 0xf3fb:		/* fschg */
275
    case 0xf3fd:		/* fschg */
276 276
	gen_op_fschg();
277 277
	ctx->bstate = BS_STOP;
278 278
	return;
......
296 296
	gen_op_ldl_T0_T0(ctx);
297 297
	gen_op_movl_T0_rN(REG(B11_8));
298 298
	return;
299
    case 0xe000:		/* mov.l #imm,Rn */
299
    case 0xe000:		/* mov #imm,Rn */
300 300
	gen_op_movl_imm_rN(B7_0s, REG(B11_8));
301 301
	return;
302 302
    case 0x9000:		/* mov.w @(disp,PC),Rn */
......
309 309
	gen_op_ldl_T0_T0(ctx);
310 310
	gen_op_movl_T0_rN(REG(B11_8));
311 311
	return;
312
    case 0x7000:		/* add.l #imm,Rn */
312
    case 0x7000:		/* add #imm,Rn */
313 313
	gen_op_add_imm_rN(B7_0s, REG(B11_8));
314 314
	return;
315 315
    case 0xa000:		/* bra disp */
......
361 361
	gen_op_movl_T0_rN(REG(B11_8));
362 362
	return;
363 363
    case 0x2004:		/* mov.b Rm,@-Rn */
364
	gen_op_dec1_rN(REG(B11_8));
365 364
	gen_op_movl_rN_T0(REG(B7_4));
365
	gen_op_dec1_rN(REG(B11_8));
366 366
	gen_op_movl_rN_T1(REG(B11_8));
367 367
	gen_op_stb_T0_T1(ctx);
368 368
	return;
369 369
    case 0x2005:		/* mov.w Rm,@-Rn */
370
	gen_op_dec2_rN(REG(B11_8));
371 370
	gen_op_movl_rN_T0(REG(B7_4));
371
	gen_op_dec2_rN(REG(B11_8));
372 372
	gen_op_movl_rN_T1(REG(B11_8));
373 373
	gen_op_stw_T0_T1(ctx);
374 374
	return;
375 375
    case 0x2006:		/* mov.l Rm,@-Rn */
376
	gen_op_dec4_rN(REG(B11_8));
377 376
	gen_op_movl_rN_T0(REG(B7_4));
377
	gen_op_dec4_rN(REG(B11_8));
378 378
	gen_op_movl_rN_T1(REG(B11_8));
379 379
	gen_op_stl_T0_T1(ctx);
380 380
	return;
......
382 382
	gen_op_movl_rN_T0(REG(B7_4));
383 383
	gen_op_ldb_T0_T0(ctx);
384 384
	gen_op_movl_T0_rN(REG(B11_8));
385
	gen_op_inc1_rN(REG(B7_4));
385
	if ( B11_8 != B7_4 )
386
		gen_op_inc1_rN(REG(B7_4));
386 387
	return;
387 388
    case 0x6005:		/* mov.w @Rm+,Rn */
388 389
	gen_op_movl_rN_T0(REG(B7_4));
389 390
	gen_op_ldw_T0_T0(ctx);
390 391
	gen_op_movl_T0_rN(REG(B11_8));
391
	gen_op_inc2_rN(REG(B7_4));
392
	if ( B11_8 != B7_4 )
393
		gen_op_inc2_rN(REG(B7_4));
392 394
	return;
393 395
    case 0x6006:		/* mov.l @Rm+,Rn */
394 396
	gen_op_movl_rN_T0(REG(B7_4));
395 397
	gen_op_ldl_T0_T0(ctx);
396 398
	gen_op_movl_T0_rN(REG(B11_8));
397
	gen_op_inc4_rN(REG(B7_4));
399
	if ( B11_8 != B7_4 )
400
		gen_op_inc4_rN(REG(B7_4));
398 401
	return;
399 402
    case 0x0004:		/* mov.b Rm,@(R0,Rn) */
400 403
	gen_op_movl_rN_T0(REG(B7_4));
......
502 505
	gen_op_movl_rN_T0(REG(B7_4));
503 506
	gen_op_movl_rN_T1(REG(B11_8));
504 507
	gen_op_div0s_T0_T1();
505
	gen_op_movl_T1_rN(REG(B11_8));
506 508
	return;
507 509
    case 0x3004:		/* div1 Rm,Rn */
508 510
	gen_op_movl_rN_T0(REG(B7_4));
......
536 538
	gen_op_movuw_rN_T0(REG(B7_4));
537 539
	gen_op_movl_T0_rN(REG(B11_8));
538 540
	return;
539
    case 0x000f:		/* mac.l @Rm+,@Rn- */
541
    case 0x000f:		/* mac.l @Rm+,@Rn+ */
540 542
	gen_op_movl_rN_T0(REG(B11_8));
541 543
	gen_op_ldl_T0_T0(ctx);
542 544
	gen_op_movl_T0_T1();
543
	gen_op_movl_rN_T1(REG(B7_4));
545
	gen_op_inc4_rN(REG(B11_8));
546
	gen_op_movl_rN_T0(REG(B7_4));
544 547
	gen_op_ldl_T0_T0(ctx);
545 548
	gen_op_macl_T0_T1();
546 549
	gen_op_inc4_rN(REG(B7_4));
547
	gen_op_inc4_rN(REG(B11_8));
548 550
	return;
549 551
    case 0x400f:		/* mac.w @Rm+,@Rn+ */
550 552
	gen_op_movl_rN_T0(REG(B11_8));
551 553
	gen_op_ldl_T0_T0(ctx);
552 554
	gen_op_movl_T0_T1();
553
	gen_op_movl_rN_T1(REG(B7_4));
555
	gen_op_inc2_rN(REG(B11_8));
556
	gen_op_movl_rN_T0(REG(B7_4));
554 557
	gen_op_ldl_T0_T0(ctx);
555 558
	gen_op_macw_T0_T1();
556 559
	gen_op_inc2_rN(REG(B7_4));
557
	gen_op_inc2_rN(REG(B11_8));
558 560
	return;
559 561
    case 0x0007:		/* mul.l Rm,Rn */
560 562
	gen_op_movl_rN_T0(REG(B7_4));
......
629 631
	return;
630 632
    case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
631 633
	if (ctx->fpscr & FPSCR_SZ) {
632
	    if (ctx->opcode & 0x0110)
633
		break; /* illegal instruction */
634
	    gen_op_fmov_drN_DT0(DREG(B7_4));
635
	    gen_op_fmov_DT0_drN(DREG(B11_8));
634
	    gen_op_fmov_drN_DT0(XREG(B7_4));
635
	    gen_op_fmov_DT0_drN(XREG(B11_8));
636 636
	} else {
637 637
	    gen_op_fmov_frN_FT0(FREG(B7_4));
638 638
	    gen_op_fmov_FT0_frN(FREG(B11_8));
......
640 640
	return;
641 641
    case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
642 642
	if (ctx->fpscr & FPSCR_SZ) {
643
	    if (ctx->opcode & 0x0010)
644
		break; /* illegal instruction */
645
	    gen_op_fmov_drN_DT0(DREG(B7_4));
643
	    gen_op_fmov_drN_DT0(XREG(B7_4));
646 644
	    gen_op_movl_rN_T1(REG(B11_8));
647 645
	    gen_op_stfq_DT0_T1(ctx);
648 646
	} else {
......
653 651
	return;
654 652
    case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
655 653
	if (ctx->fpscr & FPSCR_SZ) {
656
	    if (ctx->opcode & 0x0100)
657
		break; /* illegal instruction */
658 654
	    gen_op_movl_rN_T0(REG(B7_4));
659 655
	    gen_op_ldfq_T0_DT0(ctx);
660
	    gen_op_fmov_DT0_drN(DREG(B11_8));
656
	    gen_op_fmov_DT0_drN(XREG(B11_8));
661 657
	} else {
662 658
	    gen_op_movl_rN_T0(REG(B7_4));
663 659
	    gen_op_ldfl_T0_FT0(ctx);
......
666 662
	return;
667 663
    case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
668 664
	if (ctx->fpscr & FPSCR_SZ) {
669
	    if (ctx->opcode & 0x0100)
670
		break; /* illegal instruction */
671 665
	    gen_op_movl_rN_T0(REG(B7_4));
672 666
	    gen_op_ldfq_T0_DT0(ctx);
673
	    gen_op_fmov_DT0_drN(DREG(B11_8));
667
	    gen_op_fmov_DT0_drN(XREG(B11_8));
674 668
	    gen_op_inc8_rN(REG(B7_4));
675 669
	} else {
676 670
	    gen_op_movl_rN_T0(REG(B7_4));
......
681 675
	return;
682 676
    case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
683 677
	if (ctx->fpscr & FPSCR_SZ) {
684
	    if (ctx->opcode & 0x0100)
685
		break; /* illegal instruction */
686 678
	    gen_op_dec8_rN(REG(B11_8));
687
	    gen_op_fmov_drN_DT0(DREG(B7_4));
679
	    gen_op_fmov_drN_DT0(XREG(B7_4));
688 680
	    gen_op_movl_rN_T1(REG(B11_8));
689 681
	    gen_op_stfq_DT0_T1(ctx);
690 682
	} else {
......
696 688
	return;
697 689
    case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
698 690
	if (ctx->fpscr & FPSCR_SZ) {
699
	    if (ctx->opcode & 0x0100)
700
		break; /* illegal instruction */
701 691
	    gen_op_movl_rN_T0(REG(B7_4));
702 692
	    gen_op_add_rN_T0(REG(0));
703 693
	    gen_op_ldfq_T0_DT0(ctx);
704
	    gen_op_fmov_DT0_drN(DREG(B11_8));
694
	    gen_op_fmov_DT0_drN(XREG(B11_8));
705 695
	} else {
706 696
	    gen_op_movl_rN_T0(REG(B7_4));
707 697
	    gen_op_add_rN_T0(REG(0));
......
711 701
	return;
712 702
    case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
713 703
	if (ctx->fpscr & FPSCR_SZ) {
714
	    if (ctx->opcode & 0x0010)
715
		break; /* illegal instruction */
716
	    gen_op_fmov_drN_DT0(DREG(B7_4));
704
	    gen_op_fmov_drN_DT0(XREG(B7_4));
717 705
	    gen_op_movl_rN_T1(REG(B11_8));
718 706
	    gen_op_add_rN_T1(REG(0));
719 707
	    gen_op_stfq_DT0_T1(ctx);
......
755 743
	    ctx->fpscr & FPSCR_PR ? gen_op_fdiv_DT() : gen_op_fdiv_FT();
756 744
	    break;
757 745
	case 0xf004:		/* fcmp/eq Rm,Rn */
746
	    ctx->fpscr & FPSCR_PR ? gen_op_fcmp_eq_DT() : gen_op_fcmp_eq_FT();
758 747
	    return;
759 748
	case 0xf005:		/* fcmp/gt Rm,Rn */
749
	    ctx->fpscr & FPSCR_PR ? gen_op_fcmp_gt_DT() : gen_op_fcmp_gt_FT();
760 750
	    return;
761 751
	}
762 752

  
......
773 763
    case 0xc900:		/* and #imm,R0 */
774 764
	gen_op_and_imm_rN(B7_0, REG(0));
775 765
	return;
776
    case 0xcd00:		/* and.b #imm,@(R0+GBR) */
766
    case 0xcd00:		/* and.b #imm,@(R0,GBR) */
777 767
	gen_op_movl_rN_T0(REG(0));
778 768
	gen_op_addl_GBR_T0();
779 769
	gen_op_movl_T0_T1();
780
	gen_op_ldb_T0_T0(ctx);
770
	gen_op_ldub_T0_T0(ctx);
781 771
	gen_op_and_imm_T0(B7_0);
782 772
	gen_op_stb_T0_T1(ctx);
783 773
	return;
......
815 805
	return;
816 806
    case 0xc500:		/* mov.w @(disp,GBR),R0 */
817 807
	gen_op_stc_gbr_T0();
818
	gen_op_addl_imm_T0(B7_0);
808
	gen_op_addl_imm_T0(B7_0 * 2);
819 809
	gen_op_ldw_T0_T0(ctx);
820 810
	gen_op_movl_T0_rN(REG(0));
821 811
	return;
822 812
    case 0xc600:		/* mov.l @(disp,GBR),R0 */
823 813
	gen_op_stc_gbr_T0();
824
	gen_op_addl_imm_T0(B7_0);
814
	gen_op_addl_imm_T0(B7_0 * 4);
825 815
	gen_op_ldl_T0_T0(ctx);
826 816
	gen_op_movl_T0_rN(REG(0));
827 817
	return;
......
834 824
	return;
835 825
    case 0xc100:		/* mov.w R0,@(disp,GBR) */
836 826
	gen_op_stc_gbr_T0();
837
	gen_op_addl_imm_T0(B7_0);
827
	gen_op_addl_imm_T0(B7_0 * 2);
838 828
	gen_op_movl_T0_T1();
839 829
	gen_op_movl_rN_T0(REG(0));
840 830
	gen_op_stw_T0_T1(ctx);
841 831
	return;
842 832
    case 0xc200:		/* mov.l R0,@(disp,GBR) */
843 833
	gen_op_stc_gbr_T0();
844
	gen_op_addl_imm_T0(B7_0);
834
	gen_op_addl_imm_T0(B7_0 * 4);
845 835
	gen_op_movl_T0_T1();
846 836
	gen_op_movl_rN_T0(REG(0));
847 837
	gen_op_stl_T0_T1(ctx);
......
877 867
    case 0xcb00:		/* or #imm,R0 */
878 868
	gen_op_or_imm_rN(B7_0, REG(0));
879 869
	return;
880
    case 0xcf00:		/* or.b #imm,@(R0+GBR) */
870
    case 0xcf00:		/* or.b #imm,@(R0,GBR) */
881 871
	gen_op_movl_rN_T0(REG(0));
882 872
	gen_op_addl_GBR_T0();
883 873
	gen_op_movl_T0_T1();
884
	gen_op_ldb_T0_T0(ctx);
874
	gen_op_ldub_T0_T0(ctx);
885 875
	gen_op_or_imm_T0(B7_0);
886 876
	gen_op_stb_T0_T1(ctx);
887 877
	return;
......
893 883
    case 0xc800:		/* tst #imm,R0 */
894 884
	gen_op_tst_imm_rN(B7_0, REG(0));
895 885
	return;
896
    case 0xcc00:		/* tst #imm,@(R0+GBR) */
886
    case 0xcc00:		/* tst.b #imm,@(R0,GBR) */
897 887
	gen_op_movl_rN_T0(REG(0));
898 888
	gen_op_addl_GBR_T0();
899
	gen_op_ldb_T0_T0(ctx);
889
	gen_op_ldub_T0_T0(ctx);
900 890
	gen_op_tst_imm_T0(B7_0);
901 891
	return;
902 892
    case 0xca00:		/* xor #imm,R0 */
903 893
	gen_op_xor_imm_rN(B7_0, REG(0));
904 894
	return;
905
    case 0xce00:		/* xor.b #imm,@(R0+GBR) */
895
    case 0xce00:		/* xor.b #imm,@(R0,GBR) */
906 896
	gen_op_movl_rN_T0(REG(0));
907 897
	gen_op_addl_GBR_T0();
908 898
	gen_op_movl_T0_T1();
909
	gen_op_ldb_T0_T0(ctx);
899
	gen_op_ldub_T0_T0(ctx);
910 900
	gen_op_xor_imm_T0(B7_0);
911 901
	gen_op_stb_T0_T1(ctx);
912 902
	return;
......
1017 1007
	gen_op_movl_rN_T0(REG(B11_8));
1018 1008
	gen_op_ldl_T0_T0(ctx);
1019 1009
	return;
1020
    case 0x00a2:		/* ocbp @Rn */
1010
    case 0x00a3:		/* ocbp @Rn */
1021 1011
	gen_op_movl_rN_T0(REG(B11_8));
1022 1012
	gen_op_ldl_T0_T0(ctx);
1023 1013
	return;
......
1102 1092
	    gen_op_ftrc_FT();
1103 1093
	}
1104 1094
	return;
1095
    case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
1096
	gen_op_fneg_frN(FREG(B11_8));
1097
	return;
1098
    case 0xf05d: /* fabs FRn/DRn */
1099
	if (ctx->fpscr & FPSCR_PR) {
1100
	    if (ctx->opcode & 0x0100)
1101
		break; /* illegal instruction */
1102
	    gen_op_fmov_drN_DT0(DREG(B11_8));
1103
	    gen_op_fabs_DT();
1104
	    gen_op_fmov_DT0_drN(DREG(B11_8));
1105
	} else {
1106
	    gen_op_fmov_frN_FT0(FREG(B11_8));
1107
	    gen_op_fabs_FT();
1108
	    gen_op_fmov_FT0_frN(FREG(B11_8));
1109
	}
1110
	return;
1111
    case 0xf06d: /* fsqrt FRn */
1112
	if (ctx->fpscr & FPSCR_PR) {
1113
	    if (ctx->opcode & 0x0100)
1114
		break; /* illegal instruction */
1115
	    gen_op_fmov_drN_DT0(FREG(B11_8));
1116
	    gen_op_fsqrt_DT();
1117
	    gen_op_fmov_DT0_drN(FREG(B11_8));
1118
	} else {
1119
	    gen_op_fmov_frN_FT0(FREG(B11_8));
1120
	    gen_op_fsqrt_FT();
1121
	    gen_op_fmov_FT0_frN(FREG(B11_8));
1122
	}
1123
	return;
1124
    case 0xf07d: /* fsrra FRn */
1125
	break;
1105 1126
    case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1106 1127
	if (!(ctx->fpscr & FPSCR_PR)) {
1107 1128
	    gen_op_movl_imm_T0(0);
......
1116 1137
	    return;
1117 1138
	}
1118 1139
	break;
1140
    case 0xf0ad: /* fcnvsd FPUL,DRn */
1141
	gen_op_movl_fpul_FT0();
1142
	gen_op_fcnvsd_FT_DT();
1143
	gen_op_fmov_DT0_drN(DREG(B11_8));
1144
	return;
1145
    case 0xf0bd: /* fcnvds DRn,FPUL */
1146
	gen_op_fmov_drN_DT0(DREG(B11_8));
1147
	gen_op_fcnvds_DT_FT();
1148
	gen_op_movl_FT0_fpul();
1149
	return;
1119 1150
    }
1120 1151

  
1121 1152
    fprintf(stderr, "unknown instruction 0x%04x at pc 0x%08x\n",

Also available in: Unified diff