Revision 22478e79
b/target-arm/helper.c | ||
---|---|---|
64 | 64 |
env->vfp.xregs[ARM_VFP_MVFR0] = 0x11111111; |
65 | 65 |
env->vfp.xregs[ARM_VFP_MVFR1] = 0x00000000; |
66 | 66 |
memcpy(env->cp15.c0_c1, arm1136_cp15_c0_c1, 8 * sizeof(uint32_t)); |
67 |
memcpy(env->cp15.c0_c1, arm1136_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
67 |
memcpy(env->cp15.c0_c2, arm1136_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
68 | 68 |
env->cp15.c0_cachetype = 0x1dd20d2; |
69 | 69 |
break; |
70 | 70 |
case ARM_CPUID_ARM11MPCORE: |
... | ... | |
76 | 76 |
env->vfp.xregs[ARM_VFP_MVFR0] = 0x11111111; |
77 | 77 |
env->vfp.xregs[ARM_VFP_MVFR1] = 0x00000000; |
78 | 78 |
memcpy(env->cp15.c0_c1, mpcore_cp15_c0_c1, 8 * sizeof(uint32_t)); |
79 |
memcpy(env->cp15.c0_c1, mpcore_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
79 |
memcpy(env->cp15.c0_c2, mpcore_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
80 | 80 |
env->cp15.c0_cachetype = 0x1dd20d2; |
81 | 81 |
break; |
82 | 82 |
case ARM_CPUID_CORTEXA8: |
... | ... | |
92 | 92 |
env->vfp.xregs[ARM_VFP_MVFR0] = 0x11110222; |
93 | 93 |
env->vfp.xregs[ARM_VFP_MVFR1] = 0x00011100; |
94 | 94 |
memcpy(env->cp15.c0_c1, cortexa8_cp15_c0_c1, 8 * sizeof(uint32_t)); |
95 |
memcpy(env->cp15.c0_c1, cortexa8_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
95 |
memcpy(env->cp15.c0_c2, cortexa8_cp15_c0_c2, 8 * sizeof(uint32_t));
|
|
96 | 96 |
env->cp15.c0_cachetype = 0x1dd20d2; |
97 | 97 |
break; |
98 | 98 |
case ARM_CPUID_CORTEXM3: |
b/target-arm/op_helper.c | ||
---|---|---|
185 | 185 |
int32_t top; |
186 | 186 |
uint32_t mask; |
187 | 187 |
|
188 |
shift = PARAM1; |
|
189 | 188 |
top = val >> shift; |
190 | 189 |
mask = (1u << shift) - 1; |
191 | 190 |
if (top > 0) { |
... | ... | |
203 | 202 |
{ |
204 | 203 |
uint32_t max; |
205 | 204 |
|
206 |
shift = PARAM1; |
|
207 | 205 |
max = (1u << shift) - 1; |
208 | 206 |
if (val < 0) { |
209 | 207 |
env->QF = 1; |
b/target-arm/translate.c | ||
---|---|---|
250 | 250 |
{ |
251 | 251 |
TCGv tmp1 = new_tmp(); |
252 | 252 |
TCGv tmp2 = new_tmp(); |
253 |
tcg_gen_ext8s_i32(tmp1, a);
|
|
254 |
tcg_gen_ext8s_i32(tmp2, b);
|
|
253 |
tcg_gen_ext16s_i32(tmp1, a);
|
|
254 |
tcg_gen_ext16s_i32(tmp2, b);
|
|
255 | 255 |
tcg_gen_mul_i32(tmp1, tmp1, tmp2); |
256 | 256 |
dead_tmp(tmp2); |
257 | 257 |
tcg_gen_sari_i32(a, a, 16); |
... | ... | |
5998 | 5998 |
gen_mulxy(tmp, tmp2, sh & 2, sh & 4); |
5999 | 5999 |
dead_tmp(tmp2); |
6000 | 6000 |
if (op1 == 2) { |
6001 |
tmp = tcg_temp_new(TCG_TYPE_I64); |
|
6002 |
tcg_gen_ext_i32_i64(tmp, cpu_T[0]); |
|
6003 |
gen_addq(s, tmp, rn, rd); |
|
6004 |
gen_storeq_reg(s, rn, rd, tmp); |
|
6001 |
tmp2 = tcg_temp_new(TCG_TYPE_I64); |
|
6002 |
tcg_gen_ext_i32_i64(tmp2, tmp); |
|
6003 |
dead_tmp(tmp); |
|
6004 |
gen_addq(s, tmp2, rn, rd); |
|
6005 |
gen_storeq_reg(s, rn, rd, tmp2); |
|
6005 | 6006 |
} else { |
6006 | 6007 |
if (op1 == 0) { |
6007 | 6008 |
tmp2 = load_reg(s, rn); |
... | ... | |
6372 | 6373 |
tmp = load_reg(s, rn); |
6373 | 6374 |
tmp2 = load_reg(s, rm); |
6374 | 6375 |
shift = (insn >> 7) & 0x1f; |
6375 |
if (shift) |
|
6376 |
tcg_gen_shli_i32(tmp2, tmp2, shift); |
|
6377 | 6376 |
if (insn & (1 << 6)) { |
6378 | 6377 |
/* pkhtb */ |
6378 |
if (shift == 0) |
|
6379 |
shift = 31; |
|
6380 |
tcg_gen_sari_i32(tmp2, tmp2, shift); |
|
6379 | 6381 |
tcg_gen_andi_i32(tmp, tmp, 0xffff0000); |
6380 | 6382 |
tcg_gen_ext16u_i32(tmp2, tmp2); |
6381 | 6383 |
} else { |
6382 | 6384 |
/* pkhbt */ |
6385 |
if (shift) |
|
6386 |
tcg_gen_shli_i32(tmp2, tmp2, shift); |
|
6383 | 6387 |
tcg_gen_ext16u_i32(tmp, tmp); |
6384 | 6388 |
tcg_gen_andi_i32(tmp2, tmp2, 0xffff0000); |
6385 | 6389 |
} |
6386 | 6390 |
tcg_gen_or_i32(tmp, tmp, tmp2); |
6391 |
dead_tmp(tmp2); |
|
6387 | 6392 |
store_reg(s, rd, tmp); |
6388 | 6393 |
} else if ((insn & 0x00200020) == 0x00200000) { |
6389 | 6394 |
/* [us]sat */ |
... | ... | |
6510 | 6515 |
tmp2 = tcg_temp_new(TCG_TYPE_I64); |
6511 | 6516 |
tcg_gen_ext_i32_i64(tmp2, tmp); |
6512 | 6517 |
dead_tmp(tmp); |
6513 |
gen_addq(s, tmp2, rn, rd);
|
|
6514 |
gen_storeq_reg(s, rn, rd, tmp2);
|
|
6518 |
gen_addq(s, tmp2, rd, rn);
|
|
6519 |
gen_storeq_reg(s, rd, rn, tmp2);
|
|
6515 | 6520 |
} else { |
6516 | 6521 |
/* smuad, smusd, smlad, smlsd */ |
6517 |
if (rn != 15)
|
|
6522 |
if (rd != 15)
|
|
6518 | 6523 |
{ |
6519 |
tmp2 = load_reg(s, rn);
|
|
6524 |
tmp2 = load_reg(s, rd);
|
|
6520 | 6525 |
gen_helper_add_setq(tmp, tmp, tmp2); |
6521 | 6526 |
dead_tmp(tmp2); |
6522 | 6527 |
} |
6523 |
store_reg(s, rd, tmp);
|
|
6528 |
store_reg(s, rn, tmp);
|
|
6524 | 6529 |
} |
6525 | 6530 |
} |
6526 | 6531 |
break; |
Also available in: Unified diff