diff options
| author | Mike Pall <mike> | 2014-12-16 22:22:51 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2014-12-16 22:25:52 +0100 |
| commit | 82e6e5fb5f17e497b3341322998ede75ec29e554 (patch) | |
| tree | a17ff2d568561af328dde2b1cf20deb40d6badb4 | |
| parent | 9679a949ffa2e295f1a1f4d277f39ab864adaac4 (diff) | |
| download | luajit-82e6e5fb5f17e497b3341322998ede75ec29e554.tar.gz luajit-82e6e5fb5f17e497b3341322998ede75ec29e554.tar.bz2 luajit-82e6e5fb5f17e497b3341322998ede75ec29e554.zip | |
x86: Fix stack slot reservation for FP math functions.
Followup fix for commit ad03eba7.
| -rw-r--r-- | src/lj_asm.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index aaab3255..e740e8a8 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -2088,21 +2088,26 @@ static void asm_setup_regsp(ASMState *as) | |||
| 2088 | if (inloop) | 2088 | if (inloop) |
| 2089 | as->modset = RSET_SCRATCH; | 2089 | as->modset = RSET_SCRATCH; |
| 2090 | break; | 2090 | break; |
| 2091 | #if !LJ_TARGET_X86ORX64 && !LJ_SOFTFP | 2091 | #if !LJ_SOFTFP |
| 2092 | case IR_ATAN2: case IR_LDEXP: | 2092 | case IR_ATAN2: |
| 2093 | #if LJ_TARGET_X86 | ||
| 2094 | if (as->evenspill < 4) /* Leave room to call atan2(). */ | ||
| 2095 | as->evenspill = 4; | ||
| 2096 | #endif | ||
| 2097 | #if !LJ_TARGET_X86ORX64 | ||
| 2098 | case IR_LDEXP: | ||
| 2099 | #endif | ||
| 2093 | #endif | 2100 | #endif |
| 2094 | case IR_POW: | 2101 | case IR_POW: |
| 2095 | if (!LJ_SOFTFP && irt_isnum(ir->t)) { | 2102 | if (!LJ_SOFTFP && irt_isnum(ir->t)) { |
| 2096 | #if LJ_TARGET_X86ORX64 | ||
| 2097 | ir->prev = REGSP_HINT(RID_XMM0); | ||
| 2098 | if (inloop) | 2103 | if (inloop) |
| 2099 | as->modset |= RSET_RANGE(RID_XMM0, RID_XMM1+1)|RID2RSET(RID_EAX); | 2104 | as->modset |= RSET_SCRATCH; |
| 2105 | #if LJ_TARGET_X86 | ||
| 2106 | break; | ||
| 2100 | #else | 2107 | #else |
| 2101 | ir->prev = REGSP_HINT(RID_FPRET); | 2108 | ir->prev = REGSP_HINT(RID_FPRET); |
| 2102 | if (inloop) | ||
| 2103 | as->modset |= RSET_SCRATCH; | ||
| 2104 | #endif | ||
| 2105 | continue; | 2109 | continue; |
| 2110 | #endif | ||
| 2106 | } | 2111 | } |
| 2107 | /* fallthrough for integer POW */ | 2112 | /* fallthrough for integer POW */ |
| 2108 | case IR_DIV: case IR_MOD: | 2113 | case IR_DIV: case IR_MOD: |
| @@ -2115,26 +2120,25 @@ static void asm_setup_regsp(ASMState *as) | |||
| 2115 | break; | 2120 | break; |
| 2116 | case IR_FPMATH: | 2121 | case IR_FPMATH: |
| 2117 | #if LJ_TARGET_X86ORX64 | 2122 | #if LJ_TARGET_X86ORX64 |
| 2118 | if (ir->op2 == IRFPM_EXP2) { /* May be joined to pow. */ | 2123 | if (ir->op2 <= IRFPM_TRUNC) { |
| 2119 | ir->prev = REGSP_HINT(RID_XMM0); | 2124 | if (!(as->flags & JIT_F_SSE4_1)) { |
| 2120 | #if !LJ_64 | 2125 | ir->prev = REGSP_HINT(RID_XMM0); |
| 2121 | if (as->evenspill < 4) /* Leave room for 16 byte scratch area. */ | 2126 | if (inloop) |
| 2127 | as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX); | ||
| 2128 | continue; | ||
| 2129 | } | ||
| 2130 | break; | ||
| 2131 | } else if (ir->op2 == IRFPM_EXP2 && !LJ_64) { | ||
| 2132 | if (as->evenspill < 4) /* Leave room to call pow(). */ | ||
| 2122 | as->evenspill = 4; | 2133 | as->evenspill = 4; |
| 2123 | #endif | ||
| 2124 | if (inloop) | ||
| 2125 | as->modset |= RSET_RANGE(RID_XMM0, RID_XMM2+1)|RID2RSET(RID_EAX); | ||
| 2126 | continue; | ||
| 2127 | } else if (ir->op2 <= IRFPM_TRUNC && !(as->flags & JIT_F_SSE4_1)) { | ||
| 2128 | ir->prev = REGSP_HINT(RID_XMM0); | ||
| 2129 | if (inloop) | ||
| 2130 | as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX); | ||
| 2131 | continue; | ||
| 2132 | } | 2134 | } |
| 2135 | #endif | ||
| 2136 | if (inloop) | ||
| 2137 | as->modset |= RSET_SCRATCH; | ||
| 2138 | #if LJ_TARGET_X86 | ||
| 2133 | break; | 2139 | break; |
| 2134 | #else | 2140 | #else |
| 2135 | ir->prev = REGSP_HINT(RID_FPRET); | 2141 | ir->prev = REGSP_HINT(RID_FPRET); |
| 2136 | if (inloop) | ||
| 2137 | as->modset |= RSET_SCRATCH; | ||
| 2138 | continue; | 2142 | continue; |
| 2139 | #endif | 2143 | #endif |
| 2140 | #if LJ_TARGET_X86ORX64 | 2144 | #if LJ_TARGET_X86ORX64 |
