diff options
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r-- | src/buildvm_ppc.dasc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index b9564621..c257de45 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -1963,14 +1963,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
1963 | |// | 1963 | |// |
1964 | |.macro vm_round, name, mode | 1964 | |.macro vm_round, name, mode |
1965 | | // Used temporaries: TMP0, TMP1, TMP2, TMP3. | 1965 | | // Used temporaries: TMP0, TMP1, TMP2, TMP3. |
1966 | |->name: // Input: CARG2, output: CRET2 | 1966 | |->name.._efd: // Input: CARG2, output: CRET2 |
1967 | | evmergehi CARG1, CARG2, CARG2 | 1967 | | evmergehi CARG1, CARG2, CARG2 |
1968 | |->name.._hilo: | 1968 | |->name.._hilo: |
1969 | | // Input: CARG1 (hi), CARG2 (hi, lo), output: CRET2 | 1969 | | // Input: CARG1 (hi), CARG2 (hi, lo), output: CRET2 |
1970 | | rlwinm TMP2, CARG1, 12, 21, 31 | 1970 | | rlwinm TMP2, CARG1, 12, 21, 31 |
1971 | | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 | 1971 | | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 |
1972 | | li TMP1, -1 | 1972 | | li TMP1, -1 |
1973 | | cmplwi cr1, TMP2, 51 // 0 <= exp < 51? | 1973 | | cmplwi cr1, TMP2, 51 // 0 <= exp <= 51? |
1974 | | subfic TMP0, TMP2, 52 | 1974 | | subfic TMP0, TMP2, 52 |
1975 | | bgt cr1, >1 | 1975 | | bgt cr1, >1 |
1976 | | lus TMP3, 0xfff0 | 1976 | | lus TMP3, 0xfff0 |
@@ -2022,12 +2022,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
2022 | | blr | 2022 | | blr |
2023 | |.endmacro | 2023 | |.endmacro |
2024 | | | 2024 | | |
2025 | |->vm_floor: | ||
2026 | | mflr CARG3 | ||
2027 | | bl ->vm_floor_hilo | ||
2028 | | mtlr CARG3 | ||
2029 | | evmergehi CRET1, CRET2, CRET2 | ||
2030 | | blr | ||
2031 | | | ||
2025 | | vm_round vm_floor, 0 | 2032 | | vm_round vm_floor, 0 |
2026 | | vm_round vm_ceil, 1 | 2033 | | vm_round vm_ceil, 1 |
2027 | #if LJ_HASJIT | 2034 | #if LJ_HASJIT |
2028 | | vm_round vm_trunc, 2 | 2035 | | vm_round vm_trunc, 2 |
2029 | #else | 2036 | #else |
2030 | |->vm_trunc: | 2037 | |->vm_trunc_efd: |
2031 | |->vm_trunc_hilo: | 2038 | |->vm_trunc_hilo: |
2032 | #endif | 2039 | #endif |
2033 | | | 2040 | | |
@@ -2060,7 +2067,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2060 | |2: | 2067 | |2: |
2061 | | cmplwi CARG5, 5; beq >1; bgt >2 | 2068 | | cmplwi CARG5, 5; beq >1; bgt >2 |
2062 | | evmr CARG3, CARG2; efddiv CRET2, CARG2, CARG4; evmr RB, CARG4 | 2069 | | evmr CARG3, CARG2; efddiv CRET2, CARG2, CARG4; evmr RB, CARG4 |
2063 | | mflr RC; bl ->vm_floor; mtlr RC | 2070 | | mflr RC; bl ->vm_floor_efd; mtlr RC |
2064 | | efdmul CRET2, CRET2, RB; efdsub CRET2, CARG3, CRET2 | 2071 | | efdmul CRET2, CRET2, RB; efdsub CRET2, CARG3, CRET2 |
2065 | | evmergehi CRET1, CRET2, CRET2; blr | 2072 | | evmergehi CRET1, CRET2, CRET2; blr |
2066 | |1: | 2073 | |1: |
@@ -2387,7 +2394,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2387 | | ins_arithpre RD, SAVE0 | 2394 | | ins_arithpre RD, SAVE0 |
2388 | |->BC_MODVN_Z: | 2395 | |->BC_MODVN_Z: |
2389 | | efddiv CARG2, RD, SAVE0 | 2396 | | efddiv CARG2, RD, SAVE0 |
2390 | | bl ->vm_floor // floor(b/c) | 2397 | | bl ->vm_floor_efd // floor(b/c) |
2391 | | efdmul TMP0, CRET2, SAVE0 | 2398 | | efdmul TMP0, CRET2, SAVE0 |
2392 | | ins_next1 | 2399 | | ins_next1 |
2393 | | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c | 2400 | | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c |