diff options
| author | Mike Pall <mike> | 2025-11-27 17:45:17 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2025-11-27 17:45:17 +0100 |
| commit | f80b349d5490aa289b2925d297f3f3c618977570 (patch) | |
| tree | 8d8fb0d2beb3e863592139d603ada63e5aa6ce77 /src/vm_ppc.dasc | |
| parent | 3215838aa744d148e79a8ea0bd7c014e984302cb (diff) | |
| download | luajit-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.dasc | 146 |
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 | | |
