diff options
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r-- | src/vm_mips.dasc | 69 |
1 files changed, 57 insertions, 12 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index 37506139..0c84c13b 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
@@ -1768,7 +1768,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1768 | | b ->fff_res | 1768 | | b ->fff_res |
1769 | |. li RD, (2+1)*8 | 1769 | |. li RD, (2+1)*8 |
1770 | | | 1770 | | |
1771 | |.macro math_minmax, name, intins, fpins | 1771 | |.macro math_minmax, name, intins, ismax |
1772 | | .ffunc_1 name | 1772 | | .ffunc_1 name |
1773 | | addu TMP3, BASE, NARGS8:RC | 1773 | | addu TMP3, BASE, NARGS8:RC |
1774 | | bne SFARG1HI, TISNUM, >5 | 1774 | | bne SFARG1HI, TISNUM, >5 |
@@ -1822,13 +1822,21 @@ static void build_subroutines(BuildCtx *ctx) | |||
1822 | |.endif | 1822 | |.endif |
1823 | |7: | 1823 | |7: |
1824 | |.if FPU | 1824 | |.if FPU |
1825 | |.if ismax | ||
1826 | | c.olt.d FARG1, FRET1 | ||
1827 | |.else | ||
1825 | | c.olt.d FRET1, FARG1 | 1828 | | c.olt.d FRET1, FARG1 |
1826 | | fpins FRET1, FARG1 | 1829 | |.endif |
1830 | | movf.d FRET1, FARG1 | ||
1831 | |.else | ||
1832 | |.if ismax | ||
1833 | | bal ->vm_sfcmpogt | ||
1827 | |.else | 1834 | |.else |
1828 | | bal ->vm_sfcmpolt | 1835 | | bal ->vm_sfcmpolt |
1836 | |.endif | ||
1829 | |. nop | 1837 | |. nop |
1830 | | intins SFARG1LO, SFARG2LO, CRET1 | 1838 | | movz SFARG1LO, SFARG2LO, CRET1 |
1831 | | intins SFARG1HI, SFARG2HI, CRET1 | 1839 | | movz SFARG1HI, SFARG2HI, CRET1 |
1832 | |.endif | 1840 | |.endif |
1833 | | b <6 | 1841 | | b <6 |
1834 | |. addiu TMP2, TMP2, 8 | 1842 | |. addiu TMP2, TMP2, 8 |
@@ -1849,8 +1857,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
1849 | | | 1857 | | |
1850 | |.endmacro | 1858 | |.endmacro |
1851 | | | 1859 | | |
1852 | | math_minmax math_min, movz, movf.d | 1860 | | math_minmax math_min, movz, 0 |
1853 | | math_minmax math_max, movn, movt.d | 1861 | | math_minmax math_max, movn, 1 |
1854 | | | 1862 | | |
1855 | |//-- String library ----------------------------------------------------- | 1863 | |//-- String library ----------------------------------------------------- |
1856 | | | 1864 | | |
@@ -2692,6 +2700,43 @@ static void build_subroutines(BuildCtx *ctx) | |||
2692 | |. move CRET1, CRET2 | 2700 | |. move CRET1, CRET2 |
2693 | |.endif | 2701 | |.endif |
2694 | | | 2702 | | |
2703 | |->vm_sfcmpogt: | ||
2704 | |.if not FPU | ||
2705 | | sll AT, SFARG2HI, 1 | ||
2706 | | sll TMP0, SFARG1HI, 1 | ||
2707 | | or CRET1, SFARG2LO, SFARG1LO | ||
2708 | | or TMP1, AT, TMP0 | ||
2709 | | or TMP1, TMP1, CRET1 | ||
2710 | | beqz TMP1, >8 // Both args +-0: return 0. | ||
2711 | |. sltu CRET1, r0, SFARG2LO | ||
2712 | | lui TMP1, 0xffe0 | ||
2713 | | addu AT, AT, CRET1 | ||
2714 | | sltu CRET1, r0, SFARG1LO | ||
2715 | | sltu AT, TMP1, AT | ||
2716 | | addu TMP0, TMP0, CRET1 | ||
2717 | | sltu TMP0, TMP1, TMP0 | ||
2718 | | or TMP1, AT, TMP0 | ||
2719 | | bnez TMP1, >9 // Either arg is NaN: return 0 or 1; | ||
2720 | |. and AT, SFARG2HI, SFARG1HI | ||
2721 | | bltz AT, >5 // Both args negative? | ||
2722 | |. nop | ||
2723 | | beq SFARG2HI, SFARG1HI, >8 | ||
2724 | |. sltu CRET1, SFARG2LO, SFARG1LO | ||
2725 | | jr ra | ||
2726 | |. slt CRET1, SFARG2HI, SFARG1HI | ||
2727 | |5: // Swap conditions if both operands are negative. | ||
2728 | | beq SFARG2HI, SFARG1HI, >8 | ||
2729 | |. sltu CRET1, SFARG1LO, SFARG2LO | ||
2730 | | jr ra | ||
2731 | |. slt CRET1, SFARG1HI, SFARG2HI | ||
2732 | |8: | ||
2733 | | jr ra | ||
2734 | |. nop | ||
2735 | |9: | ||
2736 | | jr ra | ||
2737 | |. li CRET1, 0 | ||
2738 | |.endif | ||
2739 | | | ||
2695 | |// Soft-float comparison. Equivalent to c.ole.d a, b or c.ole.d b, a. | 2740 | |// Soft-float comparison. Equivalent to c.ole.d a, b or c.ole.d b, a. |
2696 | |// Input: SFARG*, TMP3. Output: CRET1. Temporaries: AT, TMP0, TMP1. | 2741 | |// Input: SFARG*, TMP3. Output: CRET1. Temporaries: AT, TMP0, TMP1. |
2697 | |->vm_sfcmpolex: | 2742 | |->vm_sfcmpolex: |
@@ -2734,24 +2779,24 @@ static void build_subroutines(BuildCtx *ctx) | |||
2734 | |. li CRET1, 0 | 2779 | |. li CRET1, 0 |
2735 | |.endif | 2780 | |.endif |
2736 | | | 2781 | | |
2737 | |.macro sfmin_max, name, intins | 2782 | |.macro sfmin_max, name, fpcall |
2738 | |->vm_sf .. name: | 2783 | |->vm_sf .. name: |
2739 | |.if JIT and not FPU | 2784 | |.if JIT and not FPU |
2740 | | move TMP2, ra | 2785 | | move TMP2, ra |
2741 | | bal ->vm_sfcmpolt | 2786 | | bal ->fpcall |
2742 | |. nop | 2787 | |. nop |
2743 | | move TMP0, CRET1 | 2788 | | move TMP0, CRET1 |
2744 | | move SFRETHI, SFARG1HI | 2789 | | move SFRETHI, SFARG1HI |
2745 | | move SFRETLO, SFARG1LO | 2790 | | move SFRETLO, SFARG1LO |
2746 | | move ra, TMP2 | 2791 | | move ra, TMP2 |
2747 | | intins SFRETHI, SFARG2HI, TMP0 | 2792 | | movz SFRETHI, SFARG2HI, TMP0 |
2748 | | jr ra | 2793 | | jr ra |
2749 | |. intins SFRETLO, SFARG2LO, TMP0 | 2794 | |. movz SFRETLO, SFARG2LO, TMP0 |
2750 | |.endif | 2795 | |.endif |
2751 | |.endmacro | 2796 | |.endmacro |
2752 | | | 2797 | | |
2753 | | sfmin_max min, movz | 2798 | | sfmin_max min, vm_sfcmpolt |
2754 | | sfmin_max max, movn | 2799 | | sfmin_max max, vm_sfcmpogt |
2755 | | | 2800 | | |
2756 | |//----------------------------------------------------------------------- | 2801 | |//----------------------------------------------------------------------- |
2757 | |//-- Miscellaneous functions -------------------------------------------- | 2802 | |//-- Miscellaneous functions -------------------------------------------- |