aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2025-11-27 17:45:17 +0100
committerMike Pall <mike>2025-11-27 17:45:17 +0100
commitf80b349d5490aa289b2925d297f3f3c618977570 (patch)
tree8d8fb0d2beb3e863592139d603ada63e5aa6ce77 /src/vm_ppc.dasc
parent3215838aa744d148e79a8ea0bd7c014e984302cb (diff)
downloadluajit-f80b349d5490aa289b2925d297f3f3c618977570.tar.gz
luajit-f80b349d5490aa289b2925d297f3f3c618977570.tar.bz2
luajit-f80b349d5490aa289b2925d297f3f3c618977570.zip
Unify Lua number to FFI integer conversions.
Phew. #1411
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r--src/vm_ppc.dasc146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index 2ddeefbf..1761e39b 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -3160,6 +3160,152 @@ static void build_subroutines(BuildCtx *ctx)
3160 | blr 3160 | blr
3161 | 3161 |
3162 |//----------------------------------------------------------------------- 3162 |//-----------------------------------------------------------------------
3163 |//-- Number conversion functions ----------------------------------------
3164 |//-----------------------------------------------------------------------
3165 |
3166 |// int64_t lj_vm_num2int_check(double x)
3167 |->vm_num2int_check:
3168 |.if FPU
3169 | subi sp, sp, 16
3170 | stfd FARG1, 0(sp)
3171 | lwz CARG1, 0(sp)
3172 | lwz CARG2, 4(sp)
3173 |.endif
3174 | slwi TMP1, CARG1, 1
3175 |.if PPE
3176 | or TMP1, TMP1, CARG2
3177 | cmpwi TMP1, 0
3178 |.else
3179 | or. TMP1, TMP1, CARG2
3180 |.endif
3181 | beq >2 // Return 0 for +-0.
3182 | rlwinm RB, CARG1, 12, 21, 31
3183 | subfic RB, RB, 1054
3184 | cmplwi RB, 32
3185 | bge >1 // Fail if |x| < 0x1p0 || |x| >= 0x1p32.
3186 | slwi CARG3, CARG1, 11
3187 | rlwimi CARG3, CARG2, 11, 21, 31 // Left-aligned mantissa.
3188 | subfic TMP1, RB, 32
3189 | slw TMP1, CARG3, TMP1
3190 | slwi TMP2, CARG2, 11
3191 |.if PPE
3192 | or. TMP1, TMP1, TMP2
3193 |.else
3194 | or TMP1, TMP1, TMP2
3195 | cmpwi TMP1, 0
3196 |.endif
3197 | bne >1 // Fail if fractional part != 0.
3198 | oris CARG3, CARG3, 0x8000 // Merge leading 1.
3199 | srw CRET2, CARG3, RB // lo = right-aligned absolute value.
3200 | srawi CARG4, CARG1, 31 // sign = 0 or -1.
3201 |.if GPR64
3202 | add CRET2, CRET2, CARG4
3203 | cmpwi CRET2, 0
3204 |.else
3205 | add. CRET2, CRET2, CARG4
3206 |.endif
3207 | blt >1 // Fail if fractional part != 0.
3208 | xor CRET2, CRET2, CARG4 // lo = sign?-lo:lo = (lo+sign)^sign.
3209 |2:
3210 |.if GPR64
3211 | rldicl CRET1, CRET1, 0, 32
3212 |.else
3213 | li CRET1, 0
3214 |.endif
3215 |.if FPU
3216 | addi sp, sp, 16
3217 |.endif
3218 | blr
3219 |1:
3220 |.if GPR64
3221 | lus CRET1, 0x8000
3222 | rldicr CRET1, CRET1, 32, 32
3223 |.else
3224 | lus CRET1, 0x8000
3225 | lus CRET2, 0x8000
3226 |.endif
3227 |.if FPU
3228 | addi sp, sp, 16
3229 |.endif
3230 | blr
3231 |
3232 |// int64_t lj_vm_num2i64(double x)
3233 |->vm_num2i64:
3234 |// fallthrough, same as lj_vm_num2u64.
3235 |
3236 |// uint64_t lj_vm_num2u64(double x)
3237 |->vm_num2u64:
3238 |.if FPU
3239 | subi sp, sp, 16
3240 | stfd FARG1, 0(sp)
3241 | lwz CARG1, 0(sp)
3242 | lwz CARG2, 4(sp)
3243 |.endif
3244 | rlwinm RB, CARG1, 12, 21, 31
3245 | addi RB, RB, -1023
3246 | cmplwi RB, 116
3247 | bge >3 // Exponent out of range.
3248 | srawi CARG4, CARG1, 31 // sign = 0 or -1.
3249 | clrlwi CARG1, CARG1, 12
3250 | subfic RB, RB, 52
3251 | oris CARG1, CARG1, 0x0010
3252 | cmpwi RB, 0
3253 | blt >2 // Shift mantissa left or right?
3254 | subfic TMP1, RB, 32 // 64 bit right shift.
3255 | srw CARG2, CARG2, RB
3256 | slw TMP2, CARG1, TMP1
3257 | addi TMP1, RB, -32
3258 | or CARG2, CARG2, TMP2
3259 | srw TMP2, CARG1, TMP1
3260 | or CARG2, CARG2, TMP2
3261 | srw CARG1, CARG1, RB
3262 |1:
3263 | addc CARG2, CARG2, CARG4
3264 | adde CARG1, CARG1, CARG4
3265 | xor CRET2, CARG2, CARG4
3266 | xor CRET1, CARG1, CARG4
3267 |.if GPR64
3268 | rldimi CRET2, CRET1, 0, 32
3269 | mr CRET1, CRET2
3270 |.endif
3271 | addi sp, sp, 16
3272 | blr
3273 |2:
3274 | subfic TMP1, RB, 0 // 64 bit left shift.
3275 | addi RB, RB, -32
3276 | slw CARG1, CARG1, TMP1
3277 | srw TMP2, CARG2, RB
3278 | addi RB, TMP1, -32
3279 | or CARG1, CARG1, TMP2
3280 | slw TMP2, CARG2, RB
3281 | or CARG1, CARG1, TMP2
3282 | slw CARG2, CARG2, TMP1
3283 | b <1
3284 |3:
3285 | li CRET1, 0
3286 |.if not GPR64
3287 | li CRET2, 0
3288 |.endif
3289 |.if FPU
3290 | addi sp, sp, 16
3291 |.endif
3292 | blr
3293 |
3294 |// int32_t lj_vm_tobit(double x)
3295 |.if FPU
3296 |->vm_tobit:
3297 | lus TMP0, 0x59c0 // 2^52 + 2^51 (float).
3298 | subi sp, sp, 16
3299 | stw TMP0, 0(sp)
3300 | lfs FARG2, 0(sp)
3301 | fadd FARG1, FARG1, FARG2
3302 | stfd FARG1, 0(sp)
3303 | lwz CRET1, 4(sp)
3304 | addi sp, sp, 16
3305 | blr
3306 |.endif
3307 |
3308 |//-----------------------------------------------------------------------
3163 |//-- Miscellaneous functions -------------------------------------------- 3309 |//-- Miscellaneous functions --------------------------------------------
3164 |//----------------------------------------------------------------------- 3310 |//-----------------------------------------------------------------------
3165 | 3311 |