mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-08 07:34:07 +00:00
Separate/rename NUM/FLOAT <-> I64/U64 conversion functions.
This commit is contained in:
parent
ff7f7a7180
commit
c805a49d30
@ -1515,6 +1515,14 @@ static void asm_setup_regsp(ASMState *as)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#if LJ_NEED_FP64
|
||||||
|
case IR_CONV:
|
||||||
|
if (irt_isfp((ir-1)->t)) {
|
||||||
|
ir->prev = REGSP_HINT(RID_FPRET);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* fallthrough */
|
||||||
#endif
|
#endif
|
||||||
case IR_CALLN: case IR_CALLXS:
|
case IR_CALLN: case IR_CALLXS:
|
||||||
#if LJ_SOFTFP
|
#if LJ_SOFTFP
|
||||||
|
@ -58,6 +58,14 @@ typedef struct CCallInfo {
|
|||||||
#define IRCALLCOND_SOFTFP_FFI(x) NULL
|
#define IRCALLCOND_SOFTFP_FFI(x) NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LJ_NEED_FP64 LJ_TARGET_PPC
|
||||||
|
|
||||||
|
#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)
|
||||||
|
#define IRCALLCOND_FP64_FFI(x) x
|
||||||
|
#else
|
||||||
|
#define IRCALLCOND_FP64_FFI(x) NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
#if LJ_HASFFI
|
#if LJ_HASFFI
|
||||||
#define IRCALLCOND_FFI(x) x
|
#define IRCALLCOND_FFI(x) x
|
||||||
#if LJ_32
|
#if LJ_32
|
||||||
@ -130,21 +138,21 @@ typedef struct CCallInfo {
|
|||||||
_(SOFTFP, softfp_i2d, 1, N, NUM, 0) \
|
_(SOFTFP, softfp_i2d, 1, N, NUM, 0) \
|
||||||
_(SOFTFP, softfp_d2i, 2, N, INT, 0) \
|
_(SOFTFP, softfp_d2i, 2, N, INT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \
|
_(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \
|
||||||
_(SOFTFP_FFI, softfp_l2d, 2, N, NUM, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_ul2d, 2, N, NUM, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \
|
_(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \
|
||||||
_(SOFTFP_FFI, softfp_d2ui, 2, N, INT, 0) \
|
_(SOFTFP_FFI, softfp_d2ui, 2, N, INT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_d2l, 2, N, I64, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_d2ul, 2, N, U64, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_d2f, 2, N, FLOAT, 0) \
|
_(SOFTFP_FFI, softfp_d2f, 2, N, FLOAT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \
|
_(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \
|
_(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_l2f, 2, N, FLOAT, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_ul2f, 2, N, FLOAT, 0) \
|
|
||||||
_(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \
|
_(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \
|
_(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \
|
||||||
_(SOFTFP_FFI, softfp_f2l, 1, N, I64, 0) \
|
_(FP64_FFI, fp64_l2d, 2, N, NUM, 0) \
|
||||||
_(SOFTFP_FFI, softfp_f2ul, 1, N, U64, 0) \
|
_(FP64_FFI, fp64_ul2d, 2, N, NUM, 0) \
|
||||||
|
_(FP64_FFI, fp64_l2f, 2, N, FLOAT, 0) \
|
||||||
|
_(FP64_FFI, fp64_ul2f, 2, N, FLOAT, 0) \
|
||||||
|
_(FP64_FFI, fp64_d2l, 2, N, I64, 0) \
|
||||||
|
_(FP64_FFI, fp64_d2ul, 2, N, U64, 0) \
|
||||||
|
_(FP64_FFI, fp64_f2l, 1, N, I64, 0) \
|
||||||
|
_(FP64_FFI, fp64_f2ul, 1, N, U64, 0) \
|
||||||
_(FFI, lj_carith_divi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
|
_(FFI, lj_carith_divi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
|
||||||
_(FFI, lj_carith_divu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \
|
_(FFI, lj_carith_divu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \
|
||||||
_(FFI, lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
|
_(FFI, lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
|
||||||
@ -179,29 +187,29 @@ LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1];
|
|||||||
#define softfp_div __aeabi_ddiv
|
#define softfp_div __aeabi_ddiv
|
||||||
#define softfp_cmp __aeabi_cdcmple
|
#define softfp_cmp __aeabi_cdcmple
|
||||||
#define softfp_i2d __aeabi_i2d
|
#define softfp_i2d __aeabi_i2d
|
||||||
#define softfp_ui2d __aeabi_ui2d
|
|
||||||
#define softfp_l2d __aeabi_l2d
|
|
||||||
#define softfp_ul2d __aeabi_ul2d
|
|
||||||
#define softfp_f2d __aeabi_f2d
|
|
||||||
#define softfp_d2i __aeabi_d2iz
|
#define softfp_d2i __aeabi_d2iz
|
||||||
|
#define softfp_ui2d __aeabi_ui2d
|
||||||
|
#define softfp_f2d __aeabi_f2d
|
||||||
#define softfp_d2ui __aeabi_d2uiz
|
#define softfp_d2ui __aeabi_d2uiz
|
||||||
#define softfp_d2f __aeabi_d2f
|
#define softfp_d2f __aeabi_d2f
|
||||||
#define softfp_i2f __aeabi_i2f
|
#define softfp_i2f __aeabi_i2f
|
||||||
#define softfp_ui2f __aeabi_ui2f
|
#define softfp_ui2f __aeabi_ui2f
|
||||||
#define softfp_l2f __aeabi_l2f
|
|
||||||
#define softfp_ul2f __aeabi_ul2f
|
|
||||||
#define softfp_f2i __aeabi_f2iz
|
#define softfp_f2i __aeabi_f2iz
|
||||||
#define softfp_f2ui __aeabi_f2uiz
|
#define softfp_f2ui __aeabi_f2uiz
|
||||||
|
#define fp64_l2d __aeabi_l2d
|
||||||
|
#define fp64_ul2d __aeabi_ul2d
|
||||||
|
#define fp64_l2f __aeabi_l2f
|
||||||
|
#define fp64_ul2f __aeabi_ul2f
|
||||||
#if LJ_TARGET_OSX
|
#if LJ_TARGET_OSX
|
||||||
#define softfp_d2l __fixdfdi
|
#define fp64_d2l __fixdfdi
|
||||||
#define softfp_d2ul __fixunsdfdi
|
#define fp64_d2ul __fixunsdfdi
|
||||||
#define softfp_f2l __fixsfdi
|
#define fp64_f2l __fixsfdi
|
||||||
#define softfp_f2ul __fixunssfdi
|
#define fp64_f2ul __fixunssfdi
|
||||||
#else
|
#else
|
||||||
#define softfp_d2l __aeabi_d2lz
|
#define fp64_d2l __aeabi_d2lz
|
||||||
#define softfp_d2ul __aeabi_d2ulz
|
#define fp64_d2ul __aeabi_d2ulz
|
||||||
#define softfp_f2l __aeabi_f2lz
|
#define fp64_f2l __aeabi_f2lz
|
||||||
#define softfp_f2ul __aeabi_f2ulz
|
#define fp64_f2ul __aeabi_f2ulz
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#error "Missing soft-float definitions for target architecture"
|
#error "Missing soft-float definitions for target architecture"
|
||||||
@ -212,23 +220,43 @@ extern double softfp_mul(double a, double b);
|
|||||||
extern double softfp_div(double a, double b);
|
extern double softfp_div(double a, double b);
|
||||||
extern void softfp_cmp(double a, double b);
|
extern void softfp_cmp(double a, double b);
|
||||||
extern double softfp_i2d(int32_t a);
|
extern double softfp_i2d(int32_t a);
|
||||||
extern double softfp_ui2d(uint32_t a);
|
|
||||||
extern double softfp_l2d(int64_t a);
|
|
||||||
extern double softfp_ul2d(uint64_t a);
|
|
||||||
extern double softfp_f2d(float a);
|
|
||||||
extern int32_t softfp_d2i(double a);
|
extern int32_t softfp_d2i(double a);
|
||||||
|
#if LJ_HASFFI
|
||||||
|
extern double softfp_ui2d(uint32_t a);
|
||||||
|
extern double softfp_f2d(float a);
|
||||||
extern uint32_t softfp_d2ui(double a);
|
extern uint32_t softfp_d2ui(double a);
|
||||||
extern int64_t softfp_d2l(double a);
|
|
||||||
extern uint64_t softfp_d2ul(double a);
|
|
||||||
extern float softfp_d2f(double a);
|
extern float softfp_d2f(double a);
|
||||||
extern float softfp_i2f(int32_t a);
|
extern float softfp_i2f(int32_t a);
|
||||||
extern float softfp_ui2f(uint32_t a);
|
extern float softfp_ui2f(uint32_t a);
|
||||||
extern float softfp_l2f(int64_t a);
|
|
||||||
extern float softfp_ul2f(uint64_t a);
|
|
||||||
extern int32_t softfp_f2i(float a);
|
extern int32_t softfp_f2i(float a);
|
||||||
extern uint32_t softfp_f2ui(float a);
|
extern uint32_t softfp_f2ui(float a);
|
||||||
extern int64_t softfp_f2l(float a);
|
#endif
|
||||||
extern uint64_t softfp_f2ul(float a);
|
#endif
|
||||||
|
|
||||||
|
#if LJ_HASFFI && LJ_NEED_FP64
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define fp64_l2d __floatdidf
|
||||||
|
#define fp64_ul2d __floatundidf
|
||||||
|
#define fp64_l2f __floatdisf
|
||||||
|
#define fp64_ul2f __floatundisf
|
||||||
|
#define fp64_d2l __fixdfdi
|
||||||
|
#define fp64_d2ul __fixunsdfdi
|
||||||
|
#define fp64_f2l __fixsfdi
|
||||||
|
#define fp64_f2ul __fixunssfdi
|
||||||
|
#else
|
||||||
|
#error "Missing fp64 helper definitions for this compiler"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)
|
||||||
|
extern double fp64_l2d(int64_t a);
|
||||||
|
extern double fp64_ul2d(uint64_t a);
|
||||||
|
extern float fp64_l2f(int64_t a);
|
||||||
|
extern float fp64_ul2f(uint64_t a);
|
||||||
|
extern int64_t fp64_d2l(double a);
|
||||||
|
extern uint64_t fp64_d2ul(double a);
|
||||||
|
extern int64_t fp64_f2l(float a);
|
||||||
|
extern uint64_t fp64_f2ul(float a);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -338,7 +338,7 @@ static void split_ir(jit_State *J)
|
|||||||
#if LJ_32 && LJ_HASFFI
|
#if LJ_32 && LJ_HASFFI
|
||||||
if (st == IRT_I64 || st == IRT_U64) {
|
if (st == IRT_I64 || st == IRT_U64) {
|
||||||
hi = split_call_l(J, hisubst, oir, ir,
|
hi = split_call_l(J, hisubst, oir, ir,
|
||||||
st == IRT_I64 ? IRCALL_softfp_l2d : IRCALL_softfp_ul2d);
|
st == IRT_I64 ? IRCALL_fp64_l2d : IRCALL_fp64_ul2d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -435,10 +435,10 @@ static void split_ir(jit_State *J)
|
|||||||
#if LJ_SOFTFP
|
#if LJ_SOFTFP
|
||||||
if (st == IRT_NUM) { /* NUM to 64 bit int conv. */
|
if (st == IRT_NUM) { /* NUM to 64 bit int conv. */
|
||||||
hi = split_call_l(J, hisubst, oir, ir,
|
hi = split_call_l(J, hisubst, oir, ir,
|
||||||
irt_isi64(ir->t) ? IRCALL_softfp_d2l : IRCALL_softfp_d2ul);
|
irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul);
|
||||||
} else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */
|
} else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */
|
||||||
nir->o = IR_CALLN;
|
nir->o = IR_CALLN;
|
||||||
nir->op2 = irt_isi64(ir->t) ? IRCALL_softfp_f2l : IRCALL_softfp_f2ul;
|
nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul;
|
||||||
hi = split_emit(J, IRTI(IR_HIOP), nref, nref);
|
hi = split_emit(J, IRTI(IR_HIOP), nref, nref);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -518,7 +518,7 @@ static void split_ir(jit_State *J)
|
|||||||
#if LJ_SOFTFP
|
#if LJ_SOFTFP
|
||||||
if (irt_isfloat(ir->t)) {
|
if (irt_isfloat(ir->t)) {
|
||||||
split_call_l(J, hisubst, oir, ir,
|
split_call_l(J, hisubst, oir, ir,
|
||||||
st == IRT_I64 ? IRCALL_softfp_l2f : IRCALL_softfp_ul2f);
|
st == IRT_I64 ? IRCALL_fp64_l2f : IRCALL_fp64_ul2f);
|
||||||
J->cur.nins--; /* Drop unused HIOP. */
|
J->cur.nins--; /* Drop unused HIOP. */
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user