1
0
forked from GitHub/gf-core

enough fixes to get the JIT compiler compile for ARM. It is still broken if you try to use it

This commit is contained in:
kr.angelov
2014-09-30 12:39:31 +00:00
parent b7798f9348
commit 312d4ff52e
4 changed files with 40 additions and 42 deletions

View File

@@ -636,10 +636,11 @@ pgf_jit_function(PgfReader* rdr, PgfAbstr* abstr,
PgfSegmentPatch* patch = PgfSegmentPatch* patch =
gu_buf_index(rdr->jit_state->segment_patches, PgfSegmentPatch, i); gu_buf_index(rdr->jit_state->segment_patches, PgfSegmentPatch, i);
if (patch->segment == segment) { if (patch->segment == segment) {
if (patch->is_abs) if (patch->is_abs) {
jit_patch_movi(patch->ref,jit_get_ip().ptr); jit_patch_movi(patch->ref,jit_get_ip().ptr);
else } else {
jit_patch(patch->ref); jit_patch(patch->ref);
}
} }
} }
@@ -1128,9 +1129,9 @@ pgf_jit_done(PgfReader* rdr, PgfAbstr* abstr)
PgfAbsCat* arg = PgfAbsCat* arg =
gu_map_get(abstr->cats, patch->cid, PgfAbsCat*); gu_map_get(abstr->cats, patch->cid, PgfAbsCat*);
if (arg != NULL) if (arg != NULL) {
jit_patch_calli(patch->ref,(jit_insn*) arg->predicate); jit_patch_calli(patch->ref,(jit_insn*) arg->predicate);
else { } else {
PgfAbsFun* con = PgfAbsFun* con =
gu_map_get(abstr->funs, patch->cid, PgfAbsFun*); gu_map_get(abstr->funs, patch->cid, PgfAbsFun*);
if (con == NULL) if (con == NULL)

View File

@@ -61,6 +61,7 @@ struct jit_local_state {
jit_thumb_t thumb; jit_thumb_t thumb;
jit_insn* thumb_pc; jit_insn* thumb_pc;
jit_insn* thumb_tmp; jit_insn* thumb_tmp;
int tmp;
/* hackish mostly to make test cases work; use arm instruction /* hackish mostly to make test cases work; use arm instruction
* set in jmpi if did not yet see a prolog */ * set in jmpi if did not yet see a prolog */
int after_prolog; int after_prolog;
@@ -132,20 +133,14 @@ jit_v_order[JIT_V_NUM] = {
#endif #endif
#define jit_movi_i(r0, i0) \ #define jit_movi_i(r0, i0) \
{ \ ((!jit_no_set_flags() && r0 < 8 && !(i0 & 0xffffff80)) ? \
int i; \ T1_MOVI(r0, i0) : \
if (!jit_no_set_flags() && r0 < 8 && !(i0 & 0xffffff80)) \ ((_jitl.tmp = encode_thumb_immediate(i0)) != -1) ? \
T1_MOVI(r0, i0); \ T2_MOVI(r0, _jitl.tmp) : \
else if ((i = encode_thumb_immediate(i0)) != -1) \ ((_jitl.tmp = encode_thumb_immediate(~i0)) != -1) ? \
T2_MOVI(r0, i); \ T2_MVNI(r0, _jitl.tmp) : \
else if ((i = encode_thumb_immediate(~i0)) != -1) \ ( T2_MOVWI(r0, _jit_US(i0)), \
T2_MVNI(r0, i); \ ((i0 & 0xffff0000) ? T2_MOVTI(r0, _jit_US((unsigned)i0 >> 16)) : 0) ))
else { \
T2_MOVWI(r0, _jit_US(i0)); \
if (i0 & 0xffff0000) \
T2_MOVTI(r0, _jit_US((unsigned)i0 >> 16)); \
} \
}
#ifdef USE_THUMB_CODE #ifdef USE_THUMB_CODE
#define jit_movi_p(r0, i0) \ #define jit_movi_p(r0, i0) \
@@ -361,19 +356,7 @@ jit_v_order[JIT_V_NUM] = {
} \ } \
} }
#else #else
#define jit_addi_i(r0, r1, i0) \ #define jit_addi_i(r0, r1, i0) 0
{ \
int i; \
if ((i = encode_arm_immediate(i0)) != -1) \
_ADDI(r0, r1, i); \
else if ((i = encode_arm_immediate(-i0)) != -1) \
_SUBI(r0, r1, i); \
else { \
jit_gpr_t reg = r0 != r1 ? r0 : JIT_TMP; \
jit_movi_i(reg, i0); \
_ADD(r0, r1, reg); \
} \
}
#endif #endif
#ifdef USE_THUMB_CODE #ifdef USE_THUMB_CODE
@@ -1172,18 +1155,18 @@ next: \
#define jit_jmpi(i0) \ #define jit_jmpi(i0) \
(_jitl.thumb_tmp = _jit.x.pc, \ (_jitl.thumb_tmp = _jit.x.pc, \
(_jitl.after_prolog) ? \ (_jitl.after_prolog) ? \
((_s20P((((long)i0 - (long)l) >> 1) - 2)) ? \ ((_s20P((((long)i0 - (long)_jitl.thumb_tmp) >> 1) - 2)) ? \
T2_B(encode_thumb_jump((((long)i0 - (long)l) >> 1) - 2)) : \ T2_B(encode_thumb_jump((((long)i0 - (long)_jitl.thumb_tmp) >> 1) - 2)) : \
(jit_movi_p(JIT_TMP, i0), jit_jmpr(JIT_TMP))) : \ (jit_movi_p(JIT_TMP, i0), jit_jmpr(JIT_TMP))) : \
(assert(_s24P((((long)i0 - (long)l) >> 2) - 2)), \ (assert(_s24P((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2)), \
_CC_B(ARM_CC_AL, ((((long)i0 - (long)l) >> 2) - 2) & 0x00ffffff)) \ _CC_B(ARM_CC_AL, ((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2) & 0x00ffffff)) \
_jitl.thumb_tmp) _jitl.thumb_tmp)
#else #else
#define jit_jmpi(i0) \ #define jit_jmpi(i0) \
(_jit.thumb_tmp = _jit.x.pc, \ (_jitl.thumb_tmp = _jit.x.pc, \
assert(_s24P((((long)i0 - (long)l) >> 2) - 2)), \ assert(_s24P((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2)), \
_CC_B(ARM_CC_AL, ((((long)i0 - (long)l) >> 2) - 2) & 0x00ffffff), \ _CC_B(ARM_CC_AL, ((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2) & 0x00ffffff), \
_jit.thumb_tmp) _jitl.thumb_tmp)
#endif #endif
#ifdef USE_THUMB_CODE #ifdef USE_THUMB_CODE
@@ -1214,7 +1197,7 @@ next: \
(jit_movi_i(JIT_TMP, i1), T2_CMP(r0, JIT_TMP))))), \ (jit_movi_i(JIT_TMP, i1), T2_CMP(r0, JIT_TMP))))), \
/* use only thumb2 conditional as does not know if will be patched */ \ /* use only thumb2 conditional as does not know if will be patched */ \
_jitl.thumb_tmp = _jit.x.pc, \ _jitl.thumb_tmp = _jit.x.pc, \
assert(_s20P((((long)i0 - (long)l) >> 1) - 2)), \ assert(_s20P((((long)i0 - (long)_jitl.thumb_tmp) >> 1) - 2)), \
T2_CC_B(cc, encode_thumb_cc_jump((((long)i0 - (long)l) >> 1) - 2)), \ T2_CC_B(cc, encode_thumb_cc_jump((((long)i0 - (long)l) >> 1) - 2)), \
_jitl.thumb_tmp) _jitl.thumb_tmp)
#else #else
@@ -1225,8 +1208,8 @@ next: \
_CMNI(r0, encode_arm_immediate(-i1)) : \ _CMNI(r0, encode_arm_immediate(-i1)) : \
(jit_movi_i(JIT_TMP, i1), _CMP(r0, JIT_TMP)))), \ (jit_movi_i(JIT_TMP, i1), _CMP(r0, JIT_TMP)))), \
_jitl.thumb_tmp = _jit.x.pc, \ _jitl.thumb_tmp = _jit.x.pc, \
assert(_s24P((((long)i0 - (long)l) >> 2) - 2)), \ assert(_s24P((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2)), \
_CC_B(cc, ((((long)i0 - (long)l) >> 2) - 2) & 0x00ffffff), \ _CC_B(cc, ((((long)i0 - (long)_jitl.thumb_tmp) >> 2) - 2) & 0x00ffffff), \
_jitl.thumb_tmp) _jitl.thumb_tmp)
#endif #endif
@@ -2190,6 +2173,12 @@ next: \
} }
#endif #endif
#ifdef USE_THUMB_CODE
#define jit_bare_ret(IM) T2_POP(1<<JIT_PC)
#else
#define jit_bare_ret(IM) _POP(1<<JIT_PC)
#endif
/* just to pass make check... */ /* just to pass make check... */
#ifdef JIT_NEED_PUSH_POP #ifdef JIT_NEED_PUSH_POP
# define jit_pushr_i(r0) \ # define jit_pushr_i(r0) \
@@ -2201,5 +2190,8 @@ next: \
(assert(_jitl.pop > 0), \ (assert(_jitl.pop > 0), \
_jitl.pop--, \ _jitl.pop--, \
jit_ldxi_i(r0, JIT_FP, _jitl.push[_jitl.pop])) jit_ldxi_i(r0, JIT_FP, _jitl.push[_jitl.pop]))
#else
# define jit_pushr_i(r0) 0
# define jit_popr_i(r0) 0
#endif #endif
#endif /* __lightning_core_arm_h */ #endif /* __lightning_core_arm_h */

View File

@@ -1104,5 +1104,9 @@ arm_retval_d(jit_state_t _jit, jit_fpr_t r0)
} }
/* else assume chaining call to jit_retval_d as done in tests/funcfp.c */ /* else assume chaining call to jit_retval_d as done in tests/funcfp.c */
} }
#else
#define jit_ldxi_d(r0, r1, i0) 0
#define jit_movi_d(r0, i0) 0
#define jit_bner_d(i0, r0, r1) 0
#endif #endif
#endif /* __lightning_fp_arm_h */ #endif /* __lightning_fp_arm_h */

View File

@@ -1,6 +1,7 @@
#include "data.h" #include "data.h"
#include "expr.h" #include "expr.h"
#include "literals.h" #include "literals.h"
#include "evaluator.h"
#include "reader.h" #include "reader.h"
#include <gu/defs.h> #include <gu/defs.h>