diff options
author | Mike Pall <mike> | 2010-03-07 14:31:51 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-03-07 14:31:51 +0100 |
commit | e807d4693151ee24a7790748632fd17021bde70f (patch) | |
tree | 2cc0981de8322870d340e5c5fae6aa77ff63588d /src | |
parent | b4299256cd895df5323efaaf52e2aa11c504b669 (diff) | |
download | luajit-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.c | 8 | ||||
-rw-r--r-- | src/lj_target_x86.h | 6 |
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) | |||
461 | static void emit_call_(ASMState *as, MCode *target) | 461 | static 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 | ||
283 | typedef 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. */ |
282 | typedef enum { | 288 | typedef 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, |