aboutsummaryrefslogtreecommitdiff
path: root/src/vm_mips.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r--src/vm_mips.dasc69
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 --------------------------------------------