Revision 69d6275b

b/target-sh4/exec.h
71 71
		    int use_asid, int update);
72 72
int find_utlb_entry(CPUState * env, target_ulong address, int use_asid);
73 73

  
74
void helper_div1_T0_T1(void);
75
void helper_rotcl(uint32_t * addr);
76
void helper_rotcr(uint32_t * addr);
77

  
78 74
void do_interrupt(CPUState * env);
79 75

  
80 76
void cpu_loop_exit(void);
b/target-sh4/helper.h
14 14
DEF_HELPER(uint32_t, helper_subv, (uint32_t, uint32_t))
15 15
DEF_HELPER(uint32_t, helper_subc, (uint32_t, uint32_t))
16 16
DEF_HELPER(uint32_t, helper_negc, (uint32_t))
17
DEF_HELPER(uint32_t, helper_div1, (uint32_t, uint32_t))
17 18
DEF_HELPER(void, helper_macl, (uint32_t, uint32_t))
18 19
DEF_HELPER(void, helper_macw, (uint32_t, uint32_t))
19 20

  
b/target-sh4/op.c
37 37
	clr_t();
38 38
}
39 39

  
40
void OPPROTO op_cmp_str_T0_T1(void)
41
{
42
    cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
43
	   (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
44
	   (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
45
	   (T0 & 0xff000000) == (T1 & 0xff000000));
46
    RETURN();
47
}
48

  
49
void OPPROTO op_div0s_T0_T1(void)
50
{
51
    if (T1 & 0x80000000)
52
	env->sr |= SR_Q;
53
    else
54
	env->sr &= ~SR_Q;
55
    if (T0 & 0x80000000)
56
	env->sr |= SR_M;
57
    else
58
	env->sr &= ~SR_M;
59
    cond_t((T1 ^ T0) & 0x80000000);
60
    RETURN();
61
}
62

  
63
void OPPROTO op_div1_T0_T1(void)
64
{
65
    helper_div1_T0_T1();
66
    RETURN();
67
}
68

  
69
void OPPROTO op_shad_T0_T1(void)
70
{
71
    if ((T0 & 0x80000000) == 0)
72
	T1 <<= (T0 & 0x1f);
73
    else if ((T0 & 0x1f) == 0)
74
	T1 = (T1 & 0x80000000)? 0xffffffff : 0;
75
    else
76
	T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
77
    RETURN();
78
}
79

  
80
void OPPROTO op_shld_T0_T1(void)
81
{
82
    if ((T0 & 0x80000000) == 0)
83
	T1 <<= (T0 & 0x1f);
84
    else if ((T0 & 0x1f) == 0)
85
	T1 = 0;
86
    else
87
	T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
88
    RETURN();
89
}
90

  
91
void OPPROTO op_rotcl_Rn(void)
92
{
93
    helper_rotcl(&env->gregs[PARAM1]);
94
    RETURN();
95
}
96

  
97
void OPPROTO op_rotcr_Rn(void)
98
{
99
    helper_rotcr(&env->gregs[PARAM1]);
100
    RETURN();
101
}
102

  
103
void OPPROTO op_rotl_Rn(void) 
104
{
105
    cond_t(env->gregs[PARAM1] & 0x80000000);
106
    env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
107
    RETURN();
108
}
109

  
110
void OPPROTO op_rotr_Rn(void)
111
{
112
    cond_t(env->gregs[PARAM1] & 1);
113
    env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
114
	((env->sr & SR_T) ? 0x80000000 : 0);
115
    RETURN();
116
}
117

  
118 40
void OPPROTO op_fmov_frN_FT0(void)
119 41
{
120 42
    FT0 = env->fregs[PARAM1];
b/target-sh4/op_helper.c
163 163
#define SETM env->sr |= SR_M
164 164
#define CLRM env->sr &= ~SR_M
165 165

  
166
void helper_div1_T0_T1(void)
166
uint32_t helper_div1(uint32_t arg0, uint32_t arg1)
167 167
{
168 168
    uint32_t tmp0, tmp2;
169 169
    uint8_t old_q, tmp1 = 0xff;
170 170

  
171
    //printf("div1 T0=0x%08x T1=0x%08x M=%d Q=%d T=%d\n", T0, T1, M, Q, T);
171
    //printf("div1 arg0=0x%08x arg1=0x%08x M=%d Q=%d T=%d\n", arg0, arg1, M, Q, T);
172 172
    old_q = Q;
173
    if ((0x80000000 & T1) != 0)
173
    if ((0x80000000 & arg1) != 0)
174 174
	SETQ;
175 175
    else
176 176
	CLRQ;
177
    tmp2 = T0;
178
    T1 <<= 1;
179
    T1 |= T;
177
    tmp2 = arg0;
178
    arg1 <<= 1;
179
    arg1 |= T;
180 180
    switch (old_q) {
181 181
    case 0:
182 182
	switch (M) {
183 183
	case 0:
184
	    tmp0 = T1;
185
	    T1 -= tmp2;
186
	    tmp1 = T1 > tmp0;
184
	    tmp0 = arg1;
185
	    arg1 -= tmp2;
186
	    tmp1 = arg1 > tmp0;
187 187
	    switch (Q) {
188 188
	    case 0:
189 189
		if (tmp1)
......
200 200
	    }
201 201
	    break;
202 202
	case 1:
203
	    tmp0 = T1;
204
	    T1 += tmp2;
205
	    tmp1 = T1 < tmp0;
203
	    tmp0 = arg1;
204
	    arg1 += tmp2;
205
	    tmp1 = arg1 < tmp0;
206 206
	    switch (Q) {
207 207
	    case 0:
208 208
		if (tmp1 == 0)
......
223 223
    case 1:
224 224
	switch (M) {
225 225
	case 0:
226
	    tmp0 = T1;
227
	    T1 += tmp2;
228
	    tmp1 = T1 < tmp0;
226
	    tmp0 = arg1;
227
	    arg1 += tmp2;
228
	    tmp1 = arg1 < tmp0;
229 229
	    switch (Q) {
230 230
	    case 0:
231 231
		if (tmp1)
......
242 242
	    }
243 243
	    break;
244 244
	case 1:
245
	    tmp0 = T1;
246
	    T1 -= tmp2;
247
	    tmp1 = T1 > tmp0;
245
	    tmp0 = arg1;
246
	    arg1 -= tmp2;
247
	    tmp1 = arg1 > tmp0;
248 248
	    switch (Q) {
249 249
	    case 0:
250 250
		if (tmp1 == 0)
......
267 267
	SETT;
268 268
    else
269 269
	CLRT;
270
    //printf("Output: T1=0x%08x M=%d Q=%d T=%d\n", T1, M, Q, T);
270
    //printf("Output: arg1=0x%08x M=%d Q=%d T=%d\n", arg1, M, Q, T);
271
    return arg1;
271 272
}
272 273

  
273 274
void helper_macl(uint32_t arg0, uint32_t arg1)
......
365 366
    return arg1;
366 367
}
367 368

  
368
void helper_rotcl(uint32_t * addr)
369
{
370
    uint32_t new;
371

  
372
    new = (*addr << 1) | (env->sr & SR_T);
373
    if (*addr & 0x80000000)
374
	env->sr |= SR_T;
375
    else
376
	env->sr &= ~SR_T;
377
    *addr = new;
378
}
379

  
380
void helper_rotcr(uint32_t * addr)
381
{
382
    uint32_t new;
383

  
384
    new = (*addr >> 1) | ((env->sr & SR_T) ? 0x80000000 : 0);
385
    if (*addr & 1)
386
	env->sr |= SR_T;
387
    else
388
	env->sr &= ~SR_T;
389
    *addr = new;
390
}
391

  
392 369
void helper_ld_fpscr(uint32_t val)
393 370
{
394 371
    env->fpscr = val & 0x003fffff;
b/target-sh4/translate.c
337 337
    tcg_gen_ori_i32(cpu_flags, cpu_flags, flags);
338 338
}
339 339

  
340
static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1)
341
{
342
    TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
343

  
344
    p0 &= 0x1f;
345
    p1 &= 0x1f;
346

  
347
    tcg_gen_andi_i32(tmp, t1, (1 << p1));
348
    tcg_gen_andi_i32(t0, t0, ~(1 << p0));
349
    if (p0 < p1)
350
        tcg_gen_shri_i32(tmp, tmp, p1 - p0);
351
    else if (p0 > p1)
352
        tcg_gen_shli_i32(tmp, tmp, p0 - p1);
353
    tcg_gen_or_i32(t0, t0, tmp);
354

  
355
    tcg_temp_free(tmp);
356
}
357

  
340 358
#define B3_0 (ctx->opcode & 0xf)
341 359
#define B6_4 ((ctx->opcode >> 4) & 0x7)
342 360
#define B7_4 ((ctx->opcode >> 4) & 0xf)
......
643 661
	gen_cmp(TCG_COND_GEU, cpu_T[0], cpu_T[1]);
644 662
	return;
645 663
    case 0x200c:		/* cmp/str Rm,Rn */
646
	tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
647
	tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]);
648
	gen_op_cmp_str_T0_T1();
664
	{
665
	    int label1 = gen_new_label();
666
	    int label2 = gen_new_label();
667
	    tcg_gen_xor_i32(cpu_T[0], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]);
668
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0xff000000);
669
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1);
670
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x00ff0000);
671
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1);
672
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x0000ff00);
673
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1);
674
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x000000ff);
675
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1);
676
	    tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
677
	    tcg_gen_br(label2);
678
	    gen_set_label(label1);
679
	    tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T);
680
	    gen_set_label(label2);
681
	}
649 682
	return;
650 683
    case 0x2007:		/* div0s Rm,Rn */
651
	tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
652
	tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]);
653
	gen_op_div0s_T0_T1();
684
	gen_copy_bit_i32(cpu_sr, 8, cpu_gregs[REG(B11_8)], 31);	/* SR_Q */
685
	gen_copy_bit_i32(cpu_sr, 9, cpu_gregs[REG(B7_4)], 31);	/* SR_M */
686
	tcg_gen_xor_i32(cpu_T[0], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]);
687
	gen_copy_bit_i32(cpu_sr, 0, cpu_T[0], 31);		/* SR_T */
654 688
	return;
655 689
    case 0x3004:		/* div1 Rm,Rn */
656
	tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
657
	tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]);
658
	gen_op_div1_T0_T1();
659
	tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]);
690
	tcg_gen_helper_1_2(helper_div1, cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]);
660 691
	return;
661 692
    case 0x300d:		/* dmuls.l Rm,Rn */
662 693
	{
......
758 789
	tcg_gen_or_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)]);
759 790
	return;
760 791
    case 0x400c:		/* shad Rm,Rn */
761
	tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
762
	tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]);
763
	gen_op_shad_T0_T1();
764
	tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]);
792
	{
793
	    int label1 = gen_new_label();
794
	    int label2 = gen_new_label();
795
	    int label3 = gen_new_label();
796
	    int label4 = gen_new_label();
797
	    tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B7_4)], 0, label1);
798
	    /* Rm positive, shift to the left */
799
	    tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f);
800
	    tcg_gen_shl_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]);
801
	    tcg_gen_br(label4);
802
	    /* Rm negative, shift to the right */
803
	    gen_set_label(label1);
804
	    tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f);
805
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label2);
806
	    tcg_gen_not_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
807
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x1f);
808
	    tcg_gen_addi_i32(cpu_T[0], cpu_T[0], 1);
809
	    tcg_gen_sar_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]);
810
	    tcg_gen_br(label4);
811
	    /* Rm = -32 */
812
	    gen_set_label(label2);
813
	    tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B11_8)], 0, label3);
814
	    tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0);
815
	    tcg_gen_br(label4);
816
	    gen_set_label(label3);
817
	    tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0xffffffff);
818
	    gen_set_label(label4);
819
	}
765 820
	return;
766 821
    case 0x400d:		/* shld Rm,Rn */
767
	tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
768
	tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]);
769
	gen_op_shld_T0_T1();
770
	tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]);
822
	{
823
	    int label1 = gen_new_label();
824
	    int label2 = gen_new_label();
825
	    int label3 = gen_new_label();
826
	    tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B7_4)], 0, label1);
827
	    /* Rm positive, shift to the left */
828
	    tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f);
829
	    tcg_gen_shl_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]);
830
	    tcg_gen_br(label3);
831
	    /* Rm negative, shift to the right */
832
	    gen_set_label(label1);
833
	    tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f);
834
	    tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label2);
835
	    tcg_gen_not_i32(cpu_T[0], cpu_gregs[REG(B7_4)]);
836
	    tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x1f);
837
	    tcg_gen_addi_i32(cpu_T[0], cpu_T[0], 1);
838
	    tcg_gen_shr_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]);
839
	    tcg_gen_br(label3);
840
	    /* Rm = -32 */
841
	    gen_set_label(label2);
842
	    tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0);
843
	    gen_set_label(label3);
844
	}
771 845
	return;
772 846
    case 0x3008:		/* sub Rm,Rn */
773 847
	tcg_gen_sub_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)]);
......
1213 1287
    case 0x0083:		/* pref @Rn */
1214 1288
	return;
1215 1289
    case 0x4024:		/* rotcl Rn */
1216
	gen_op_rotcl_Rn(REG(B11_8));
1290
	tcg_gen_mov_i32(cpu_T[0], cpu_sr);
1291
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31);
1292
	tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1293
	gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 0, cpu_T[0], 0);
1217 1294
	return;
1218 1295
    case 0x4025:		/* rotcr Rn */
1219
	gen_op_rotcr_Rn(REG(B11_8));
1296
	tcg_gen_mov_i32(cpu_T[0], cpu_sr);
1297
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0);
1298
	tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1299
	gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 31, cpu_T[0], 0);
1220 1300
	return;
1221 1301
    case 0x4004:		/* rotl Rn */
1222
	gen_op_rotl_Rn(REG(B11_8));
1302
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31);
1303
	tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1304
	gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 0, cpu_sr, 0);
1223 1305
	return;
1224 1306
    case 0x4005:		/* rotr Rn */
1225
	gen_op_rotr_Rn(REG(B11_8));
1307
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0);
1308
	tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1309
	gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 31, cpu_sr, 0);
1226 1310
	return;
1227 1311
    case 0x4000:		/* shll Rn */
1228 1312
    case 0x4020:		/* shal Rn */
1229
	tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 0x80000000);
1230
	gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0);
1313
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31);
1231 1314
	tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1232 1315
	return;
1233 1316
    case 0x4021:		/* shar Rn */
1234
	tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 1);
1235
	gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0);
1317
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0);
1236 1318
	tcg_gen_sari_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1237 1319
	return;
1238 1320
    case 0x4001:		/* shlr Rn */
1239
	tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 1);
1240
	gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0);
1321
	gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0);
1241 1322
	tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1);
1242 1323
	return;
1243 1324
    case 0x4008:		/* shll2 Rn */

Also available in: Unified diff