aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2022-07-08 14:57:01 +0200
committerMike Pall <mike>2022-07-08 14:57:01 +0200
commit674afcd4e21d0cf64de3219d347557a0aed8ecc7 (patch)
treecd7b2c5f2006544b339a4a2652c7e4b4e121cddb /src
parent2e98c3d0644fc0c265844908f43b7e4526dd819c (diff)
downloadluajit-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.dasc13
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: