diff options
| author | Mike Pall <mike> | 2011-10-22 01:59:10 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-10-22 01:59:10 +0200 |
| commit | c805a49d304c344d69630a4282d21d753c70e1bd (patch) | |
| tree | cb3aa44be781e82fcca3c9a82ccbe48176cba109 /src | |
| parent | ff7f7a7180d25da9d425671a48867b50bb7e7ac2 (diff) | |
| download | luajit-c805a49d304c344d69630a4282d21d753c70e1bd.tar.gz luajit-c805a49d304c344d69630a4282d21d753c70e1bd.tar.bz2 luajit-c805a49d304c344d69630a4282d21d753c70e1bd.zip | |
Separate/rename NUM/FLOAT <-> I64/U64 conversion functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_asm.c | 8 | ||||
| -rw-r--r-- | src/lj_ircall.h | 88 | ||||
| -rw-r--r-- | src/lj_opt_split.c | 8 |
3 files changed, 70 insertions, 34 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 4187a1d9..3d9a213b 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -1516,6 +1516,14 @@ static void asm_setup_regsp(ASMState *as) | |||
| 1516 | #endif | 1516 | #endif |
| 1517 | break; | 1517 | break; |
| 1518 | #endif | 1518 | #endif |
| 1519 | #if LJ_NEED_FP64 | ||
| 1520 | case IR_CONV: | ||
| 1521 | if (irt_isfp((ir-1)->t)) { | ||
| 1522 | ir->prev = REGSP_HINT(RID_FPRET); | ||
| 1523 | continue; | ||
| 1524 | } | ||
| 1525 | /* fallthrough */ | ||
| 1526 | #endif | ||
| 1519 | case IR_CALLN: case IR_CALLXS: | 1527 | case IR_CALLN: case IR_CALLXS: |
| 1520 | #if LJ_SOFTFP | 1528 | #if LJ_SOFTFP |
| 1521 | case IR_MIN: case IR_MAX: | 1529 | case IR_MIN: case IR_MAX: |
diff --git a/src/lj_ircall.h b/src/lj_ircall.h index 00209d4c..b1e0e446 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h | |||
| @@ -58,6 +58,14 @@ typedef struct CCallInfo { | |||
| 58 | #define IRCALLCOND_SOFTFP_FFI(x) NULL | 58 | #define IRCALLCOND_SOFTFP_FFI(x) NULL |
| 59 | #endif | 59 | #endif |
| 60 | 60 | ||
| 61 | #define LJ_NEED_FP64 LJ_TARGET_PPC | ||
| 62 | |||
| 63 | #if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64) | ||
| 64 | #define IRCALLCOND_FP64_FFI(x) x | ||
| 65 | #else | ||
| 66 | #define IRCALLCOND_FP64_FFI(x) NULL | ||
| 67 | #endif | ||
| 68 | |||
| 61 | #if LJ_HASFFI | 69 | #if LJ_HASFFI |
| 62 | #define IRCALLCOND_FFI(x) x | 70 | #define IRCALLCOND_FFI(x) x |
| 63 | #if LJ_32 | 71 | #if LJ_32 |
| @@ -130,21 +138,21 @@ typedef struct CCallInfo { | |||
| 130 | _(SOFTFP, softfp_i2d, 1, N, NUM, 0) \ | 138 | _(SOFTFP, softfp_i2d, 1, N, NUM, 0) \ |
| 131 | _(SOFTFP, softfp_d2i, 2, N, INT, 0) \ | 139 | _(SOFTFP, softfp_d2i, 2, N, INT, 0) \ |
| 132 | _(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \ | 140 | _(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \ |
| 133 | _(SOFTFP_FFI, softfp_l2d, 2, N, NUM, 0) \ | ||
| 134 | _(SOFTFP_FFI, softfp_ul2d, 2, N, NUM, 0) \ | ||
| 135 | _(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \ | 141 | _(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \ |
| 136 | _(SOFTFP_FFI, softfp_d2ui, 2, N, INT, 0) \ | 142 | _(SOFTFP_FFI, softfp_d2ui, 2, N, INT, 0) \ |
| 137 | _(SOFTFP_FFI, softfp_d2l, 2, N, I64, 0) \ | ||
| 138 | _(SOFTFP_FFI, softfp_d2ul, 2, N, U64, 0) \ | ||
| 139 | _(SOFTFP_FFI, softfp_d2f, 2, N, FLOAT, 0) \ | 143 | _(SOFTFP_FFI, softfp_d2f, 2, N, FLOAT, 0) \ |
| 140 | _(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \ | 144 | _(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \ |
| 141 | _(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \ | 145 | _(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \ |
| 142 | _(SOFTFP_FFI, softfp_l2f, 2, N, FLOAT, 0) \ | ||
| 143 | _(SOFTFP_FFI, softfp_ul2f, 2, N, FLOAT, 0) \ | ||
| 144 | _(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \ | 146 | _(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \ |
| 145 | _(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \ | 147 | _(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \ |
| 146 | _(SOFTFP_FFI, softfp_f2l, 1, N, I64, 0) \ | 148 | _(FP64_FFI, fp64_l2d, 2, N, NUM, 0) \ |
| 147 | _(SOFTFP_FFI, softfp_f2ul, 1, N, U64, 0) \ | 149 | _(FP64_FFI, fp64_ul2d, 2, N, NUM, 0) \ |
| 150 | _(FP64_FFI, fp64_l2f, 2, N, FLOAT, 0) \ | ||
| 151 | _(FP64_FFI, fp64_ul2f, 2, N, FLOAT, 0) \ | ||
| 152 | _(FP64_FFI, fp64_d2l, 2, N, I64, 0) \ | ||
| 153 | _(FP64_FFI, fp64_d2ul, 2, N, U64, 0) \ | ||
| 154 | _(FP64_FFI, fp64_f2l, 1, N, I64, 0) \ | ||
| 155 | _(FP64_FFI, fp64_f2ul, 1, N, U64, 0) \ | ||
| 148 | _(FFI, lj_carith_divi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ | 156 | _(FFI, lj_carith_divi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ |
| 149 | _(FFI, lj_carith_divu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ | 157 | _(FFI, lj_carith_divu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ |
| 150 | _(FFI, lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ | 158 | _(FFI, lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ |
| @@ -179,29 +187,29 @@ LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1]; | |||
| 179 | #define softfp_div __aeabi_ddiv | 187 | #define softfp_div __aeabi_ddiv |
| 180 | #define softfp_cmp __aeabi_cdcmple | 188 | #define softfp_cmp __aeabi_cdcmple |
| 181 | #define softfp_i2d __aeabi_i2d | 189 | #define softfp_i2d __aeabi_i2d |
| 190 | #define softfp_d2i __aeabi_d2iz | ||
| 182 | #define softfp_ui2d __aeabi_ui2d | 191 | #define softfp_ui2d __aeabi_ui2d |
| 183 | #define softfp_l2d __aeabi_l2d | ||
| 184 | #define softfp_ul2d __aeabi_ul2d | ||
| 185 | #define softfp_f2d __aeabi_f2d | 192 | #define softfp_f2d __aeabi_f2d |
| 186 | #define softfp_d2i __aeabi_d2iz | ||
| 187 | #define softfp_d2ui __aeabi_d2uiz | 193 | #define softfp_d2ui __aeabi_d2uiz |
| 188 | #define softfp_d2f __aeabi_d2f | 194 | #define softfp_d2f __aeabi_d2f |
| 189 | #define softfp_i2f __aeabi_i2f | 195 | #define softfp_i2f __aeabi_i2f |
| 190 | #define softfp_ui2f __aeabi_ui2f | 196 | #define softfp_ui2f __aeabi_ui2f |
| 191 | #define softfp_l2f __aeabi_l2f | ||
| 192 | #define softfp_ul2f __aeabi_ul2f | ||
| 193 | #define softfp_f2i __aeabi_f2iz | 197 | #define softfp_f2i __aeabi_f2iz |
| 194 | #define softfp_f2ui __aeabi_f2uiz | 198 | #define softfp_f2ui __aeabi_f2uiz |
| 199 | #define fp64_l2d __aeabi_l2d | ||
| 200 | #define fp64_ul2d __aeabi_ul2d | ||
| 201 | #define fp64_l2f __aeabi_l2f | ||
| 202 | #define fp64_ul2f __aeabi_ul2f | ||
| 195 | #if LJ_TARGET_OSX | 203 | #if LJ_TARGET_OSX |
| 196 | #define softfp_d2l __fixdfdi | 204 | #define fp64_d2l __fixdfdi |
| 197 | #define softfp_d2ul __fixunsdfdi | 205 | #define fp64_d2ul __fixunsdfdi |
| 198 | #define softfp_f2l __fixsfdi | 206 | #define fp64_f2l __fixsfdi |
| 199 | #define softfp_f2ul __fixunssfdi | 207 | #define fp64_f2ul __fixunssfdi |
| 200 | #else | 208 | #else |
| 201 | #define softfp_d2l __aeabi_d2lz | 209 | #define fp64_d2l __aeabi_d2lz |
| 202 | #define softfp_d2ul __aeabi_d2ulz | 210 | #define fp64_d2ul __aeabi_d2ulz |
| 203 | #define softfp_f2l __aeabi_f2lz | 211 | #define fp64_f2l __aeabi_f2lz |
| 204 | #define softfp_f2ul __aeabi_f2ulz | 212 | #define fp64_f2ul __aeabi_f2ulz |
| 205 | #endif | 213 | #endif |
| 206 | #else | 214 | #else |
| 207 | #error "Missing soft-float definitions for target architecture" | 215 | #error "Missing soft-float definitions for target architecture" |
| @@ -212,23 +220,43 @@ extern double softfp_mul(double a, double b); | |||
| 212 | extern double softfp_div(double a, double b); | 220 | extern double softfp_div(double a, double b); |
| 213 | extern void softfp_cmp(double a, double b); | 221 | extern void softfp_cmp(double a, double b); |
| 214 | extern double softfp_i2d(int32_t a); | 222 | extern double softfp_i2d(int32_t a); |
| 223 | extern int32_t softfp_d2i(double a); | ||
| 224 | #if LJ_HASFFI | ||
| 215 | extern double softfp_ui2d(uint32_t a); | 225 | extern double softfp_ui2d(uint32_t a); |
| 216 | extern double softfp_l2d(int64_t a); | ||
| 217 | extern double softfp_ul2d(uint64_t a); | ||
| 218 | extern double softfp_f2d(float a); | 226 | extern double softfp_f2d(float a); |
| 219 | extern int32_t softfp_d2i(double a); | ||
| 220 | extern uint32_t softfp_d2ui(double a); | 227 | extern uint32_t softfp_d2ui(double a); |
| 221 | extern int64_t softfp_d2l(double a); | ||
| 222 | extern uint64_t softfp_d2ul(double a); | ||
| 223 | extern float softfp_d2f(double a); | 228 | extern float softfp_d2f(double a); |
| 224 | extern float softfp_i2f(int32_t a); | 229 | extern float softfp_i2f(int32_t a); |
| 225 | extern float softfp_ui2f(uint32_t a); | 230 | extern float softfp_ui2f(uint32_t a); |
| 226 | extern float softfp_l2f(int64_t a); | ||
| 227 | extern float softfp_ul2f(uint64_t a); | ||
| 228 | extern int32_t softfp_f2i(float a); | 231 | extern int32_t softfp_f2i(float a); |
| 229 | extern uint32_t softfp_f2ui(float a); | 232 | extern uint32_t softfp_f2ui(float a); |
| 230 | extern int64_t softfp_f2l(float a); | 233 | #endif |
| 231 | extern uint64_t softfp_f2ul(float a); | 234 | #endif |
| 235 | |||
| 236 | #if LJ_HASFFI && LJ_NEED_FP64 | ||
| 237 | #ifdef __GNUC__ | ||
| 238 | #define fp64_l2d __floatdidf | ||
| 239 | #define fp64_ul2d __floatundidf | ||
| 240 | #define fp64_l2f __floatdisf | ||
| 241 | #define fp64_ul2f __floatundisf | ||
| 242 | #define fp64_d2l __fixdfdi | ||
| 243 | #define fp64_d2ul __fixunsdfdi | ||
| 244 | #define fp64_f2l __fixsfdi | ||
| 245 | #define fp64_f2ul __fixunssfdi | ||
| 246 | #else | ||
| 247 | #error "Missing fp64 helper definitions for this compiler" | ||
| 248 | #endif | ||
| 249 | #endif | ||
| 250 | |||
| 251 | #if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64) | ||
| 252 | extern double fp64_l2d(int64_t a); | ||
| 253 | extern double fp64_ul2d(uint64_t a); | ||
| 254 | extern float fp64_l2f(int64_t a); | ||
| 255 | extern float fp64_ul2f(uint64_t a); | ||
| 256 | extern int64_t fp64_d2l(double a); | ||
| 257 | extern uint64_t fp64_d2ul(double a); | ||
| 258 | extern int64_t fp64_f2l(float a); | ||
| 259 | extern uint64_t fp64_f2ul(float a); | ||
| 232 | #endif | 260 | #endif |
| 233 | 261 | ||
| 234 | #endif | 262 | #endif |
diff --git a/src/lj_opt_split.c b/src/lj_opt_split.c index 61275b03..bd785d65 100644 --- a/src/lj_opt_split.c +++ b/src/lj_opt_split.c | |||
| @@ -338,7 +338,7 @@ static void split_ir(jit_State *J) | |||
| 338 | #if LJ_32 && LJ_HASFFI | 338 | #if LJ_32 && LJ_HASFFI |
| 339 | if (st == IRT_I64 || st == IRT_U64) { | 339 | if (st == IRT_I64 || st == IRT_U64) { |
| 340 | hi = split_call_l(J, hisubst, oir, ir, | 340 | hi = split_call_l(J, hisubst, oir, ir, |
| 341 | st == IRT_I64 ? IRCALL_softfp_l2d : IRCALL_softfp_ul2d); | 341 | st == IRT_I64 ? IRCALL_fp64_l2d : IRCALL_fp64_ul2d); |
| 342 | break; | 342 | break; |
| 343 | } | 343 | } |
| 344 | #endif | 344 | #endif |
| @@ -435,10 +435,10 @@ static void split_ir(jit_State *J) | |||
| 435 | #if LJ_SOFTFP | 435 | #if LJ_SOFTFP |
| 436 | if (st == IRT_NUM) { /* NUM to 64 bit int conv. */ | 436 | if (st == IRT_NUM) { /* NUM to 64 bit int conv. */ |
| 437 | hi = split_call_l(J, hisubst, oir, ir, | 437 | hi = split_call_l(J, hisubst, oir, ir, |
| 438 | irt_isi64(ir->t) ? IRCALL_softfp_d2l : IRCALL_softfp_d2ul); | 438 | irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul); |
| 439 | } else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */ | 439 | } else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */ |
| 440 | nir->o = IR_CALLN; | 440 | nir->o = IR_CALLN; |
| 441 | nir->op2 = irt_isi64(ir->t) ? IRCALL_softfp_f2l : IRCALL_softfp_f2ul; | 441 | nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul; |
| 442 | hi = split_emit(J, IRTI(IR_HIOP), nref, nref); | 442 | hi = split_emit(J, IRTI(IR_HIOP), nref, nref); |
| 443 | } | 443 | } |
| 444 | #else | 444 | #else |
| @@ -518,7 +518,7 @@ static void split_ir(jit_State *J) | |||
| 518 | #if LJ_SOFTFP | 518 | #if LJ_SOFTFP |
| 519 | if (irt_isfloat(ir->t)) { | 519 | if (irt_isfloat(ir->t)) { |
| 520 | split_call_l(J, hisubst, oir, ir, | 520 | split_call_l(J, hisubst, oir, ir, |
| 521 | st == IRT_I64 ? IRCALL_softfp_l2f : IRCALL_softfp_ul2f); | 521 | st == IRT_I64 ? IRCALL_fp64_l2f : IRCALL_fp64_ul2f); |
| 522 | J->cur.nins--; /* Drop unused HIOP. */ | 522 | J->cur.nins--; /* Drop unused HIOP. */ |
| 523 | } | 523 | } |
| 524 | #else | 524 | #else |
