diff options
| author | Mike Pall <mike> | 2022-07-08 14:57:01 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2022-07-08 14:57:01 +0200 |
| commit | 674afcd4e21d0cf64de3219d347557a0aed8ecc7 (patch) | |
| tree | cd7b2c5f2006544b339a4a2652c7e4b4e121cddb /src | |
| parent | 2e98c3d0644fc0c265844908f43b7e4526dd819c (diff) | |
| download | luajit-674afcd4e21d0cf64de3219d347557a0aed8ecc7.tar.gz luajit-674afcd4e21d0cf64de3219d347557a0aed8ecc7.tar.bz2 luajit-674afcd4e21d0cf64de3219d347557a0aed8ecc7.zip | |
x86/x64: Fix math.ceil(-0.9) result sign.
Reported by minoki.
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm_x86.dasc | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index 8c2740c3..7db5e710 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc | |||
| @@ -415,9 +415,6 @@ | |||
| 415 | |.macro sseconst_1, reg, tmp // Synthesize 1.0. | 415 | |.macro sseconst_1, reg, tmp // Synthesize 1.0. |
| 416 | | sseconst_hi reg, tmp, 3ff00000 | 416 | | sseconst_hi reg, tmp, 3ff00000 |
| 417 | |.endmacro | 417 | |.endmacro |
| 418 | |.macro sseconst_m1, reg, tmp // Synthesize -1.0. | ||
| 419 | | sseconst_hi reg, tmp, bff00000 | ||
| 420 | |.endmacro | ||
| 421 | |.macro sseconst_2p52, reg, tmp // Synthesize 2^52. | 418 | |.macro sseconst_2p52, reg, tmp // Synthesize 2^52. |
| 422 | | sseconst_hi reg, tmp, 43300000 | 419 | | sseconst_hi reg, tmp, 43300000 |
| 423 | |.endmacro | 420 | |.endmacro |
| @@ -3114,15 +3111,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 3114 | | addsd xmm1, xmm3 // (|x| + 2^52) - 2^52 | 3111 | | addsd xmm1, xmm3 // (|x| + 2^52) - 2^52 |
| 3115 | | subsd xmm1, xmm3 | 3112 | | subsd xmm1, xmm3 |
| 3116 | | orpd xmm1, xmm2 // Merge sign bit back in. | 3113 | | orpd xmm1, xmm2 // Merge sign bit back in. |
| 3114 | | sseconst_1 xmm3, RDa | ||
| 3117 | | .if mode == 1 // ceil(x)? | 3115 | | .if mode == 1 // ceil(x)? |
| 3118 | | sseconst_m1 xmm2, RDa // Must subtract -1 to preserve -0. | ||
| 3119 | | cmpsd xmm0, xmm1, 6 // x > result? | 3116 | | cmpsd xmm0, xmm1, 6 // x > result? |
| 3117 | | andpd xmm0, xmm3 | ||
| 3118 | | addsd xmm1, xmm0 // If yes, add 1. | ||
| 3119 | | orpd xmm1, xmm2 // Merge sign bit back in (again). | ||
| 3120 | | .else // floor(x)? | 3120 | | .else // floor(x)? |
| 3121 | | sseconst_1 xmm2, RDa | ||
| 3122 | | cmpsd xmm0, xmm1, 1 // x < result? | 3121 | | cmpsd xmm0, xmm1, 1 // x < result? |
| 3122 | | andpd xmm0, xmm3 | ||
| 3123 | | subsd xmm1, xmm0 // If yes, subtract 1. | ||
| 3123 | | .endif | 3124 | | .endif |
| 3124 | | andpd xmm0, xmm2 | ||
| 3125 | | subsd xmm1, xmm0 // If yes, subtract +-1. | ||
| 3126 | |.endif | 3125 | |.endif |
| 3127 | | movaps xmm0, xmm1 | 3126 | | movaps xmm0, xmm1 |
| 3128 | |1: | 3127 | |1: |
