aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-03-07 14:31:51 +0100
committerMike Pall <mike>2010-03-07 14:31:51 +0100
commite807d4693151ee24a7790748632fd17021bde70f (patch)
tree2cc0981de8322870d340e5c5fae6aa77ff63588d /src
parentb4299256cd895df5323efaaf52e2aa11c504b669 (diff)
downloadluajit-e807d4693151ee24a7790748632fd17021bde70f.tar.gz
luajit-e807d4693151ee24a7790748632fd17021bde70f.tar.bz2
luajit-e807d4693151ee24a7790748632fd17021bde70f.zip
Generate indirect calls for out-of-range distances on x64.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm.c8
-rw-r--r--src/lj_target_x86.h6
2 files changed, 14 insertions, 0 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index 9f33cfd9..367fe430 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -461,6 +461,14 @@ static void emit_jcc(ASMState *as, int cc, MCode *target)
461static void emit_call_(ASMState *as, MCode *target) 461static void emit_call_(ASMState *as, MCode *target)
462{ 462{
463 MCode *p = as->mcp; 463 MCode *p = as->mcp;
464#if LJ_64
465 if (target-p != (int32_t)(target-p)) {
466 /* Assumes RID_RET is never an argument to calls and always clobbered. */
467 emit_rr(as, XO_GROUP5, XOg_CALL, RID_RET);
468 emit_loadu64(as, RID_RET, (uint64_t)target);
469 return;
470 }
471#endif
464 *(int32_t *)(p-4) = jmprel(p, target); 472 *(int32_t *)(p-4) = jmprel(p, target);
465 p[-5] = XI_CALL; 473 p[-5] = XI_CALL;
466 as->mcp = p - 5; 474 as->mcp = p - 5;
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h
index 65f829ac..ad4e3d1a 100644
--- a/src/lj_target_x86.h
+++ b/src/lj_target_x86.h
@@ -224,6 +224,8 @@ typedef enum {
224 XO_TEST = XO_(85), 224 XO_TEST = XO_(85),
225 XO_GROUP3b = XO_(f6), 225 XO_GROUP3b = XO_(f6),
226 XO_GROUP3 = XO_(f7), 226 XO_GROUP3 = XO_(f7),
227 XO_GROUP5b = XO_(fe),
228 XO_GROUP5 = XO_(ff),
227 XO_MOVZXb = XO_0f(b6), 229 XO_MOVZXb = XO_0f(b6),
228 XO_MOVZXw = XO_0f(b7), 230 XO_MOVZXw = XO_0f(b7),
229 XO_MOVSXb = XO_0f(be), 231 XO_MOVSXb = XO_0f(be),
@@ -278,6 +280,10 @@ typedef enum {
278 XOg_TEST, XOg_TEST_, XOg_NOT, XOg_NEG, XOg_MUL, XOg_IMUL, XOg_DIV, XOg_IDIV 280 XOg_TEST, XOg_TEST_, XOg_NOT, XOg_NEG, XOg_MUL, XOg_IMUL, XOg_DIV, XOg_IDIV
279} x86Group3; 281} x86Group3;
280 282
283typedef enum {
284 XOg_INC, XOg_DEC, XOg_CALL, XOg_CALLfar, XOg_JMP, XOg_JMPfar, XOg_PUSH
285} x86Group5;
286
281/* x86 condition codes. */ 287/* x86 condition codes. */
282typedef enum { 288typedef enum {
283 CC_O, CC_NO, CC_B, CC_NB, CC_E, CC_NE, CC_BE, CC_NBE, 289 CC_O, CC_NO, CC_B, CC_NB, CC_E, CC_NE, CC_BE, CC_NBE,