Fix JIT for ARMv6 (i.e., no thumb support)

This commit is contained in:
Matthew Flatt 2013-04-16 19:51:50 -06:00
parent e311de0522
commit bd1ac6d77e
2 changed files with 11 additions and 7 deletions

View File

@ -105,6 +105,7 @@ typedef enum {
#define jit_thumb_p() jit_cpu.thumb
#define jit_armv6_p() (jit_cpu.version >= 6)
#define jit_advsimd_p() ((jit_cpu.version >= 7) && jit_thumb_p())
typedef union _jit_thumb_t {
int i;
short s[2];
@ -519,6 +520,8 @@ encode_vfp_double(int mov, int inv, unsigned lo, unsigned hi)
{
int code, mode, imm, mask;
if (!jit_advsimd_p()) return -1;
if (hi != lo) {
if (mov && !inv) {
/* (I64)

View File

@ -55,6 +55,7 @@ jit_v_order[JIT_V_NUM] = {
#define jit_armv5_p() (jit_cpu.version >= 5)
#define jit_armv5e_p() (jit_cpu.version >= 5 && jit_cpu.extend)
#define jit_armv7r_p() 0
#define jit_armv6t_p() ((jit_cpu.version >= 6) && (jit_cpu.thumb))
#define jit_swf_p() (jit_cpu.vfp == 0)
#define jit_hardfp_p() jit_cpu.abi
@ -107,13 +108,13 @@ arm_movi_i(jit_state_t _jitp, jit_gpr_t r0, int i0)
}
}
else {
if (jit_armv6_p() && !(i0 & 0xffff0000))
if (jit_armv6t_p() && !(i0 & 0xffff0000))
_MOVWI(r0, i0);
else if ((i = encode_arm_immediate(i0)) != -1)
_MOVI(r0, i);
else if ((i = encode_arm_immediate(~i0)) != -1)
_MVNI(r0, i);
else if (jit_armv6_p()) {
else if (jit_armv6t_p()) {
_MOVWI(r0, _jit_US(i0));
if ((i0 & 0xffff0000))
_MOVTI(r0, _jit_US((unsigned)i0 >> 16));
@ -178,7 +179,7 @@ arm_movi_p(jit_state_t _jitp, jit_gpr_t r0, void *i0)
}
else {
l = _jitp->x.pc;
if (jit_armv6_p()) {
if (jit_armv6t_p()) {
_MOVWI(r0, _jit_US((unsigned)i0));
_MOVTI(r0, _jit_US((unsigned)i0 >> 16));
}
@ -232,7 +233,7 @@ arm_patch_movi(jit_insn *i0, void *i1)
}
else {
u.v = i0;
if (jit_armv6_p()) {
if (jit_armv6t_p()) {
q0 = im & 0xfff;
q1 = (im & 0xf000) << 4;
q2 = (im & 0xfff0000) >> 16;
@ -315,8 +316,8 @@ arm_patch_at(jit_state_t _jitp, jit_insn *jump, jit_insn *label)
jit_assert(_s24P(d));
u.i[0] = (u.i[0] & 0xff000000) | (d & 0x00ffffff);
}
else if (( jit_armv6_p() && (u.i[0] & 0x0ff00000) == ARM_MOVWI) ||
(!jit_armv6_p() && (u.i[0] & 0x0ff00000) == (ARM_MOV|ARM_I)))
else if (( jit_armv6t_p() && (u.i[0] & 0x0ff00000) == ARM_MOVWI) ||
(!jit_armv6t_p() && (u.i[0] & 0x0ff00000) == (ARM_MOV|ARM_I)))
jit_patch_movi(jump, label);
else
jit_assert(!"handled branch opcode");
@ -1309,7 +1310,7 @@ arm_branch(jit_state_t _jitp, int cc, jit_insn *i0)
_CC_B(cc, d & 0x00ffffff);
} else {
int im = (int)i0;
if (jit_armv6_p()) {
if (jit_armv6t_p()) {
_CC_MOVWI(cc, JIT_TMP, _jit_US(im));
_CC_MOVTI(cc, JIT_TMP, _jit_US((unsigned)im >> 16));
} else {