changeset 302:d55f9d508074

- mips softfloat support for o32 callconv (calls and callbacks, little and big endian) - cleanup of some mips files, removed unnecessary file, renamings.. - doc/manual cleanups, changelog entry
author Tassilo Philipp
date Mon, 21 May 2018 02:48:12 +0200
parents 74948b02cfa0
children c81374ac9fba
files ChangeLog autovar/autovar_ARCH.h doc/manual/callconvs/callconv_mips32.tex doc/manual/callconvs/callconv_mips64.tex doc/manual/manual_overview.tex dyncall/dyncall_call.S dyncall/dyncall_call_mips_gas.S dyncall/dyncall_call_mips_n32.S dyncall/dyncall_call_mips_n32_gas.s dyncall/dyncall_call_mips_n64.S dyncall/dyncall_call_mips_n64_gas.s dyncall/dyncall_call_mips_o32.S dyncall/dyncall_call_mips_o32.h dyncall/dyncall_call_mips_o32_gas.s dyncall/dyncall_callvm_mips_o32.c dyncall/dyncall_macros.h dyncallback/dyncall_args_mips.h dyncallback/dyncall_args_mips_o32.c dyncallback/dyncall_callback_arch.S dyncallback/dyncall_callback_mips_gas.S dyncallback/dyncall_callback_mips_n32.S dyncallback/dyncall_callback_mips_n32_gas.s dyncallback/dyncall_callback_mips_n64.S dyncallback/dyncall_callback_mips_n64_gas.s dyncallback/dyncall_callback_mips_o32.S dyncallback/dyncall_callback_mips_o32_gas.s
diffstat 26 files changed, 879 insertions(+), 883 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun May 20 02:23:44 2018 +0200
+++ b/ChangeLog	Mon May 21 02:48:12 2018 +0200
@@ -1,6 +1,10 @@
 This file lists bigger/noteworthy changes, only...
 
 Version 1.1 (upcoming)
+dyncall:
+  o support for soft-float MIPS o32 (big- and little-endian)
+dyncallback:
+  o support for soft-float MIPS o32 (big- and little-endian)
 doc:
   o more detail in support matrix for bi-endian platforms
 buildsys:
--- a/autovar/autovar_ARCH.h	Sun May 20 02:23:44 2018 +0200
+++ b/autovar/autovar_ARCH.h	Mon May 21 02:48:12 2018 +0200
@@ -48,7 +48,7 @@
 # if defined(__thumb__)
 #   define ARCH_THUMB
 # endif
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || defined(__arm64) || defined(__arm64__)
 # define ARCH_ARM64
 #elif defined(__sh__)
 # define ARCH_SH
--- a/doc/manual/callconvs/callconv_mips32.tex	Sun May 20 02:23:44 2018 +0200
+++ b/doc/manual/callconvs/callconv_mips32.tex	Mon May 21 02:48:12 2018 +0200
@@ -23,7 +23,7 @@
 
 Multiple revisions of the MIPS Instruction set exist, namely MIPS I, MIPS II, MIPS III, MIPS IV, MIPS32 and MIPS64.
 Nowadays, MIPS32 and MIPS64 are the main ones used for 32-bit and 64-bit instruction sets, respectively.\\
-Given MIPS processor are often used for embedded devices, several add-on extensions exist for the MIPS family, for example: 
+Given MIPS processors are often used for embedded devices, several add-on extensions exist for the MIPS family, for example: 
 
 \begin{description}
 \item [MIPS-3D] simple floating-point SIMD instructions dedicated to common 3D tasks.
@@ -37,8 +37,8 @@
 
 \paragraph{\product{dyncall} support}
 
-Currently, dyncall supports for MIPS 32-bit architectures the widely-used O32 calling convention (for big- and little-endian targets),
-as well as EABI (which is used on the Homebrew SDK for the Playstation Portable). \product{dyncall} currently does not support MIPS16e
+Currently, dyncall supports for MIPS 32-bit architectures the widely-used O32 calling convention (for all four combinations of big/little-endian, and soft/hard-float targets),
+as well as EABI (little-endian/hard-float, which is used on the Homebrew SDK for the Playstation Portable). \product{dyncall} currently does not support MIPS16e
 (contrary to the like-minded ARM-THUMB, which is supported). Both, calls and callbacks are supported.
 
 \subsubsection{MIPS EABI 32-bit Calling Convention}
@@ -54,7 +54,7 @@
 {\bf \$2-\$3}                          & {\bf \$v0-\$v1}      & Integer results \\
 {\bf \$4-\$11}                         & {\bf \$a0-\$a7}      & Integer arguments, or double precision float arguments\\
 {\bf \$12-\$15,\$24}                   & {\bf \$t4-\$t7,\$t8} & Integer temporaries \\
-{\bf \$25}                             & {\bf \$t9}           & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\
+{\bf \$25}                             & {\bf \$t9}           & Integer temporary, holds address of called function for PIC calls (by convention) \\
 {\bf \$16-\$23}                        & {\bf \$s0-\$s7}      & Preserved \\
 {\bf \$26,\$27}                        & {\bf \$kt0,\$kt1}    & Reserved for kernel \\
 {\bf \$28}                             & {\bf \$gp}           & Global pointer, preserve \\
@@ -125,8 +125,8 @@
 \hline                                                             
 {\bf \$0}                    & {\bf \$zero}         & hardware zero \\
 {\bf \$1}                    & {\bf \$at}           & assembler temporary \\
-{\bf \$2-\$3}                & {\bf \$v0-\$v1}      & return value, scratch \\
-{\bf \$4-\$7}                & {\bf \$a0-\$a3}      & first integer arguments, scratch\\
+{\bf \$2-\$3}                & {\bf \$v0-\$v1}      & return value (only integer, on hard-float targets), scratch \\
+{\bf \$4-\$7}                & {\bf \$a0-\$a3}      & first arguments (only integer, on hard-float targets), scratch\\
 {\bf \$8-\$15,\$24}          & {\bf \$t0-\$t7,\$t8} & temporaries, scratch \\
 {\bf \$25}                   & {\bf \$t9}           & temporary, hold the address of the called function for all PIC calls (by convention) \\
 {\bf \$16-\$23}              & {\bf \$s0-\$s7}      & preserved \\
@@ -136,10 +136,10 @@
 {\bf \$30}                   & {\bf \$fp}           & frame pointer, preserve \\
 {\bf \$31}                   & {\bf \$ra}           & return address, preserve \\
 {\bf hi, lo}                 &                      & multiply/divide special registers \\
-{\bf \$f0-\$f3}              &                      & float return value, scratch \\
-{\bf \$f4-\$f11,\$f16-\$f19} &                      & float temporaries, scratch \\
-{\bf \$f12-\$f15}            &                      & first floating point arguments, scratch \\
-{\bf \$f20-\$f31}            &                      & preserved \\
+{\bf \$f0-\$f3}              &                      & only on hard-float targets: float return value, scratch \\
+{\bf \$f4-\$f11,\$f16-\$f19} &                      & only on hard-float targets: float temporaries, scratch \\
+{\bf \$f12-\$f15}            &                      & only on hard-float targets: first floating point arguments, scratch \\
+{\bf \$f20-\$f31}            &                      & only on hard-float targets: preserved \\
 \end{tabular*}
 \caption{Register usage on MIPS O32 calling convention}
 \end{table}
@@ -150,15 +150,16 @@
 \item Stack grows down
 \item Stack parameter order: right-to-left
 \item Caller cleans up the stack
-\item Caller is required to always leave a 16-byte spill area for\$a0-\$a3 at the and of {\bf its} frame, to be used and spilled to by the callee, if needed
-\item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes.
-\item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (see below for exceptions if first arg is a float)
+\item Caller is required to always leave a 16-byte spill area for \$a0-\$a3 at the and of {\bf its} frame, to be used and spilled to by the callee, if needed
+\item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes
+\item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (only on hard-float targets: see below for exceptions if first arg is a float)
 \item subsequent parameters are passed vie the stack
 \item 64-bit params passed via registers are passed using either two registers (starting at an even register number, skipping an odd one if necessary), or via the stack using an 8-byte alignment
-\item if the very first call argument is a float, up to 2 floats or doubles can be passed via \$f12 and \$f14, respectively, for first and second argument
-\item if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them
-\item note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers
-\item results are returned in \$v0 (32-bit int return values), \$f0 (32-bit float), \$v0 and \$v1 (64-bit int), \$f0 and \$f3 (64bit float)
+\item only on hard-float targets: if the very first call argument is a float, up to 2 floats or doubles can be passed via \$f12 and \$f14, respectively, for first and second argument
+\item only on hard-float targets: if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them
+\item only on hard-float targets: note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers
+\item results are returned in \$v0 and \$v1, with \$v0 for all values < 64bit (only integer, on hard-float targets)
+\item only on hard-float targets: floating point results are returned in \$f0 (32-bit float), or \$f0 and \$f3 (64bit float)
 \end{itemize}
 
 \paragraph{Stack layout}
@@ -198,7 +199,3 @@
 
 \newpage
 
-\subsubsection{MIPS N32 32-bit Calling Convention}
-
-@@@
-
--- a/doc/manual/callconvs/callconv_mips64.tex	Sun May 20 02:23:44 2018 +0200
+++ b/doc/manual/callconvs/callconv_mips64.tex	Mon May 21 02:48:12 2018 +0200
@@ -112,3 +112,8 @@
 \caption{Stack layout on mips64 n64 calling convention}
 \end{figure}
 
+
+\subsubsection{MIPS N32 Calling Convention}
+
+@@@
+
--- a/doc/manual/manual_overview.tex	Sun May 20 02:23:44 2018 +0200
+++ b/doc/manual/manual_overview.tex	Mon May 21 02:48:12 2018 +0200
@@ -196,35 +196,35 @@
 \begin{table}[h]
 \begin{tabular}{r>{\rule{0pt}{2.5ex}\tiny}l*{12}{c!{\color{gray3}\vrule}}c>{\tiny}l}
                            &    & \OSwinfam  & \OSlinux   & \OSdarwin  & \OSfreebsd & \OSnetbsd  & \OSopenbsd & \OSdflybsd & \OSsunos   & \OSplanN   & \OSbeos    & \OSminix   & \OSpsp     & \OSnds    \\%& \\
-\arrayrulecolor{gray3}%           ,- checked   ,- find@@@   ,- checked   ,- find@@@   ,- find@@@   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- new@@@   ,- checked    ,- checked   ,- checked
+\arrayrulecolor{gray3}%            
 \multirow{2}{*}{ARM}       & EB & \marknotx  & \markunkn  & \marknotx  & \markunkn  & \markunkn  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{atpcs (arm \& thumb), eabi (arm \& thumb), armhf} \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- find@@@   ,- dynOS     ,- real      ,- dynOS     ,- dynOS     ,- real/bbb  ,- checked   ,- checked   ,- checked   ,- new@@@   ,- new@@@     ,- checked   ,- checked
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- find@@@   ^- checked   ^- find@@@   ^- find@@@   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- new@@@   ^- checked    ^- checked   ^- checked
                            & EL & \markunkn  & \markcmpl  & \markcmpl  & \markcmpl  & \markcmpl  & \markcmpl  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \markunkn  & \marknotx  & \markcmpl \\%& \\
-\hline%                           ,- checked   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- find@@@   ^- dynOS     ^- real      ^- dynOS     ^- dynOS     ^- real/bbb  ^- checked   ^- checked   ^- checked   ^- new@@@   ^- new@@@     ^- checked   ^- checked
 \multirow{2}{*}{ARM64}     & EB & \marknotx  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{aapcs64, apple} \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- find@@@   ,- find@@@   ,- checked   ,- checked   ,- find@@@   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \markunkn  & \markcmpl  & \markcmpl  & \markcmpl  & \markunkn  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hline%                           ,- checked   ,- dynOS     ,- checked   ,- checked   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
-\multirow{2}{*}{MIPS}      & EB & \marknotx  & \markcmpl  & \marknotx  & \markcmpl  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{o32, n32, eabi / only hardfloat support} \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- checked   ,- find@@@   ,- checked   ,- checked   ,- dynOS     ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- find@@@   ^- find@@@   ^- checked   ^- checked   ^- find@@@   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
+\multirow{2}{*}{MIPS}      & EB & \marknotx  & \markcmpl  & \marknotx  & \markcmpl  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{o32 (hf \& sf), eabi (hf only)} \\
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- dynOS     ^- checked   ^- checked   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \marknotx  & \markunkn  & \marknotx  & \markcmpl  & \markcmpl  & \markunkn  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \markcmpl  & \marknotx \\%& \\
-\hline%                           ,- checked   ,- find@@@   ,- checked   ,- checked   ,- find@@@   ,- real/ERlt ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
-\multirow{2}{*}{MIPS64}    & EB & \marknotx  & \markunkn  & \marknotx  & \markcmpl  & \markunkn  & \markcmpl  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{n64 / only hardfloat support} \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- checked   ,- dynOS     ,- checked   ,- checked   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- checked   ^- find@@@   ^- checked   ^- checked   ^- dynOS     ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
+\multirow{2}{*}{MIPS64}    & EB & \marknotx  & \markunkn  & \marknotx  & \markcmpl  & \markunkn  & \markcmpl  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{n64 (hf only), n32 (hf only)} \\
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- find@@@   ^- checked   ^- checked   ^- find@@@   ^- real/ERlt ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \marknotx  & \markcmpl  & \marknotx  & \markcmpl  & \markunkn  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hline%                           ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- checked   ^- dynOS     ^- checked   ^- checked   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
 \multirow{2}{*}{SuperH}    & EB & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknimp  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hline%                           ,- checked   ,- dynOS     ,-dynOS      ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
 \multirow{2}{*}{PowerPC}   & EB & \marknotx  & \markcmpl  & \markcmpl  & \markimpl  & \markimpl  & \markunkn  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{apple, sysv}\\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- checked   ,- find@@@   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- dynOS     ^-dynOS      ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \marknotx  & \markunkn  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hline%                           ,- checked   ,- masanori@ ,- checked   ,- dynOS     ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hline%                           ^- checked   ^- find@@@   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
 \multirow{2}{*}{PowerPC64} & EB & \marknotx  & \markcmpl  & \markunkn  & \markcmpl  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \multirow{2}{*}{elf} \\
-\hhline{*{1}{|~}*{14}{|-}}%       ,- checked   ,- masanori@ ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked   ,- checked
+\hhline{*{1}{|~}*{14}{|-}}%       ^- checked   ^- masanori@ ^- checked   ^- dynOS     ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
                            & EL & \marknotx  & \markcmpl  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
-\hline
+\hline%                           ^- checked   ^- masanori@ ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked   ^- checked
 m68k                       &    & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknimp  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
 \hline
 m88k                       &    & \marknotx  & \marknimp  & \marknotx  & \marknotx  & \marknimp  & \marknimp  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx  & \marknotx \\%& \\
--- a/dyncall/dyncall_call.S	Sun May 20 02:23:44 2018 +0200
+++ b/dyncall/dyncall_call.S	Mon May 21 02:48:12 2018 +0200
@@ -67,7 +67,15 @@
 #  elif defined(DC__Arch_PPC64)
 #    include "dyncall_call_ppc64.S"
 #  elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64)
-#    include "dyncall_call_mips_gas.S"
+#    if defined(DC__ABI_MIPS_O32)
+#      include "dyncall_call_mips_o32.S"
+#    elif defined(DC__ABI_MIPS_N64)
+#      include "dyncall_call_mips_n64.S"
+#    elif defined(DC__ABI_MIPS_N32)
+#      include "dyncall_call_mips_n32.S"
+#    else
+#      include "dyncall_call_mips_eabi_gas.s"
+#    endif
 #  elif defined(DC__Arch_Sparc64)
 #    include "dyncall_call_sparc64.s"
 #  elif defined(DC__Arch_Sparc)
--- a/dyncall/dyncall_call_mips_gas.S	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncall
- File: dyncall/dyncall_call_mips_gas.S
- Description: auto-select (via C preprocessor) mips abi call kernel
- License:
-
-   Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
-                           Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-
-
-#if defined(DC__ABI_MIPS_O32)
-#include "dyncall_call_mips_o32_gas.s"
-#elif defined(DC__ABI_MIPS_N64)
-#include "dyncall_call_mips_n64_gas.s"
-#elif defined(DC__ABI_MIPS_N32)
-#include "dyncall_call_mips_n32_gas.s"
-#else
-#include "dyncall_call_mips_eabi_gas.s"
-#endif
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncall/dyncall_call_mips_n32.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,192 @@
+/*
+
+ Package: dyncall
+ Library: dyncall
+ File: dyncall/dyncall_call_mips_n32.S
+ Description: mips64 "n32" abi call kernel implementation in GNU Assembler
+ License:
+
+   Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>, 
+                           Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+	.section .mdebug.abiN32
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl  dcCall_mips_n32
+	.ent    dcCall_mips_n32
+dcCall_mips_n32:
+
+	/* Stack-frame prolog */
+
+	.frame  $fp,64,$31   /* vars=16, regs=3/0, args=0, extra=16 */
+	.mask   0xd0000000,-8
+	.fmask  0x00000000,0
+	subu    $sp,$sp,64
+	sd      $31,48($sp)  /* save return address register (ra) */
+	sd      $30,40($sp)  /* save frame pointer register (fp) */
+	sd      $28,32($sp)  /* save global pointer register (gp) */
+	move    $fp,$sp
+
+
+	/* arguments: */
+
+	/* $4 target function */
+	/* $5 register data */
+	/* $6 stack size */
+	/* $7 stack data */
+	
+
+	/* allocate argument stack space */
+
+	subu    $sp, $sp, $6
+	
+	/* copy stack data */
+
+	/* n32 abi call assumptions:
+	   - stack data is 16-byte aligned.
+	   - no extra-storage for arguments passed via registers.
+	*/
+
+	/* $12  source pointer (parameter stack data) */
+	/* $14  destination (stack pointer) */
+	/* $6   byte count */
+
+	move    $12, $7
+	move    $14, $sp
+
+.next:
+	beq     $6, $0, .skip
+	nop
+	daddiu  $6, $6, -8
+	ld      $2, 0($12)
+	sd      $2, 0($14)
+	daddiu  $12,$12, 8
+	daddiu  $14,$14, 8
+	b       .next
+.skip:
+	move    $25, $4
+
+	/* load registers */
+
+	/* locals: */
+	/* $13 = register data */
+	/* $14 = useDouble flags */
+	move    $13, $5
+	ld      $14, 128($13)
+	
+	/* load integer parameter registers */
+
+	ld      $4 , 0($13)
+	ld      $5 , 8($13)
+	ld      $6 ,16($13)
+	ld      $7 ,24($13)
+	ld      $8 ,32($13)
+	ld      $9 ,40($13)
+	ld      $10,48($13)
+	ld      $11,56($13)
+
+	/* load float-or-double floating pointer parameter registers 
+	   a 64-bit bitmask given at byte offset 128 of regdata indicates
+	   if loading a float (bit cleared) or double (bit set), starting
+	   at bit position 0 in bitmask.
+	*/
+.t0:
+	and     $15, $14, 1
+	bgtz    $15, .d0
+.f0:
+	l.s     $f12, 64($13)
+	j       .t1
+.d0:
+	l.d     $f12, 64($13)
+
+.t1:
+	and     $15, $14, 2
+	bgtz    $15, .d1
+.f1:
+	l.s     $f13, 72($13)
+	j       .t2
+.d1:
+	l.d     $f13, 72($13)
+.t2:
+	and     $15, $14, 4
+	bgtz    $15, .d2
+.f2:
+	l.s     $f14, 80($13)
+	j       .t3
+.d2:
+	l.d     $f14, 80($13)
+.t3:
+	and     $15, $14, 8
+	bgtz    $15, .d3
+.f3:
+	l.s     $f15, 88($13)
+	j       .t4
+.d3:
+	l.d     $f15, 88($13)
+.t4:
+	and     $15, $14, 16
+	bgtz    $15, .d4
+.f4:
+	l.s     $f16, 96($13)
+	j       .t5
+.d4:
+	l.d     $f16, 96($13)
+.t5:
+	and     $15, $14, 32
+	bgtz    $15, .d5
+.f5:
+	l.s     $f17,104($13)
+	j       .t6
+.d5:
+	l.d     $f17,104($13)
+.t6:
+	and     $15, $14, 64
+	bgtz    $15, .d6
+.f6:
+	l.s     $f18,112($13)
+	j       .t7
+.d6:
+	l.d     $f18,112($13)
+.t7:
+	and     $15, $14, 128
+	bgtz    $15, .d7
+.f7:
+	l.s     $f19,120($13)
+	j       .fregend
+.d7:
+	l.d     $f19,120($13)
+
+.fregend:
+
+	/* jump-and-link to register $25 */
+
+	jal     $31, $25
+	nop /* branch-delay slot - no nop according to gcc assembly */
+	    /* output, but let's play safe */
+
+	/* Stack-frame epilog */
+	move    $sp,$fp 
+	ld      $31,48($sp)  /* restore ra register */
+	ld      $fp,40($sp)  /* restore fp register */
+	ld      $28,32($sp)  /* restore gp register */
+	daddu   $sp,$sp,64
+	j       $31
+	.end    dcCall_mips_n64
+	.size   dcCall_mips_n64, .-dcCall_mips_n64
+
--- a/dyncall/dyncall_call_mips_n32_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncall
- File: dyncall/dyncall_call_mips_n32_gas.s
- Description: mips64 "n32" abi call kernel implementation in GNU Assembler
- License:
-
-   Copyright (c) 2007-2016 Daniel Adler <dadler@uni-goettingen.de>, 
-                           Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-	.section .mdebug.abiN32
-	.previous
-	.abicalls
-	.text
-	.align	2
-	.globl	dcCall_mips_n32
-	.ent	dcCall_mips_n32
-dcCall_mips_n32:
-
-	/* Stack-frame prolog */
-
-	.frame	$fp,64,$31		/* vars=16, regs=3/0, args=0, extra=16 */
-	.mask	0xd0000000,-8
-	.fmask	0x00000000,0
-	subu	$sp,$sp,64
-	sd	$31,48($sp)	/* save return address register (ra) */
-	sd	$30,40($sp)	/* save frame pointer register (fp) */
-	sd	$28,32($sp)	/* save global pointer register (gp) */
-	move	$fp,$sp
-
-
-	/* arguments: */
-		
-	/* $4 target function */
- 	/* $5 register data */
-	/* $6 stack size */
-	/* $7 stack data */
-	
-
-	/* allocate argument stack space */
-
-	subu	$sp, $sp, $6
-	
-	/* copy stack data */
-
-	/* n64 abi call assumptions:
-           - stack data is 16-byte aligned.
-           - no extra-storage for arguments passed via registers.
-        */
-
-	/* $12  source pointer (parameter stack data) */
-	/* $14  destination (stack pointer) */
-	/* $6   byte count */
-
-	move	$12, $7
-	move	$14, $sp
-
-.next:
-	beq	$6, $0, .skip
-	nop
-	daddiu	$6, $6, -8
-	ld	$2, 0($12)
-	sd	$2, 0($14)
-	daddiu	$12,$12, 8
-	daddiu	$14,$14, 8
-	b	.next
-.skip:
-	move	$25, $4
-
-	/* load registers */
-
-	/* locals: */
-	/* $13 = register data */
-	/* $14 = useDouble flags */
-	move	$13, $5
-	ld	$14, 128($13)
-	
-	/* load integer parameter registers */
-
-	ld	$4 , 0($13)
-	ld	$5 , 8($13)
-	ld	$6 ,16($13)
-	ld	$7 ,24($13)
-	ld	$8 ,32($13)
-	ld	$9 ,40($13)
-	ld	$10,48($13)
-	ld	$11,56($13)
-
-	/* load float-or-double floating pointer parameter registers 
-           a 64-bit bitmask given at byte offset 128 of regdata indicates
-           if loading a float (bit cleared) or double (bit set), starting
-           at bit position 0 in bitmask.
-        */
-.t0:
-	and     $15, $14, 1
-	bgtz	$15, .d0
-.f0:
-	l.s	$f12, 64($13)
-	j	.t1
-.d0:
-	l.d	$f12, 64($13)
-
-.t1:
-	and	$15, $14, 2
-	bgtz	$15, .d1
-.f1:
-	l.s	$f13, 72($13)
-	j	.t2
-.d1:
-	l.d	$f13, 72($13)
-.t2:	
-	and	$15, $14, 4
-	bgtz	$15, .d2
-.f2:
-	l.s	$f14, 80($13)
-	j	.t3
-.d2:	
-	l.d	$f14, 80($13)
-.t3:
-	and	$15, $14, 8
-	bgtz	$15, .d3
-.f3:
-	l.s	$f15, 88($13)
-	j	.t4
-.d3:
-	l.d	$f15, 88($13)
-.t4:
-	and	$15, $14, 16
-	bgtz	$15, .d4
-.f4:
-	l.s	$f16, 96($13)
-	j	.t5
-.d4:
-	l.d	$f16, 96($13)
-.t5:
-	and	$15, $14, 32
-	bgtz	$15, .d5
-.f5:
-	l.s	$f17,104($13)
-	j	.t6
-.d5:
-	l.d	$f17,104($13)
-.t6:
-	and	$15, $14, 64
-	bgtz	$15, .d6
-.f6:
-	l.s	$f18,112($13)
-	j	.t7
-.d6:
-	l.d	$f18,112($13)
-.t7:
-	and	$15, $14, 128
-	bgtz	$15, .d7
-.f7:
-	l.s	$f19,120($13)
-	j	.fregend
-.d7:
-	l.d	$f19,120($13)
-
-.fregend:
-
-	/* jump-and-link to register $25 */
-
-	jal	$31, $25
-	nop /* branch-delay slot - no nop according to gcc assembly */
-	    /* output, but let's play safe */	
-
-	/* Stack-frame epilog */	
-	move	$sp,$fp 
-	ld	$31,48($sp)	/* restore ra register */
-	ld	$fp,40($sp)	/* restore fp register */
-	ld	$28,32($sp)	/* restore gp register */
-	daddu	$sp,$sp,64
-	j	$31
-	.end	dcCall_mips_n64
-	.size	dcCall_mips_n64, .-dcCall_mips_n64
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncall/dyncall_call_mips_n64.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,192 @@
+/*
+
+ Package: dyncall
+ Library: dyncall
+ File: dyncall/dyncall_call_mips_n64.S
+ Description: mips "n64" abi call kernel implementation in GNU Assembler
+ License:
+
+   Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>, 
+                           Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+	.section .mdebug.abi64
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl  dcCall_mips_n64
+	.ent    dcCall_mips_n64
+dcCall_mips_n64:
+
+	/* Stack-frame prolog */
+
+	# .frame  $fp,64,$31   /* vars=16, regs=3/0, args=0, extra=16 */
+	# .mask   0xd0000000,-8
+	# .fmask  0x00000000,0
+	dsubu   $sp,$sp,64
+	sd      $31,48($sp)  /* save return address register (ra) */
+	sd      $30,40($sp)  /* save frame pointer register (fp) */
+	sd      $28,32($sp)  /* save global pointer register (gp) */
+	move    $fp,$sp
+
+
+	/* arguments: */
+
+	/* $4 target function */
+	/* $5 register data */
+	/* $6 stack size */
+	/* $7 stack data */
+	
+
+	/* allocate argument stack space */
+
+	dsubu   $sp, $sp, $6
+	
+	/* copy stack data */
+
+	/* n64 abi call assumptions:
+	   - stack data is 16-byte aligned.
+	   - no extra-storage for arguments passed via registers.
+	*/
+
+	/* $12  source pointer (parameter stack data) */
+	/* $14  destination (stack pointer) */
+	/* $6   byte count */
+
+	move    $12, $7
+	move    $14, $sp
+
+.next:
+	beq     $6, $0, .skip
+	# nop
+	daddiu  $6, $6, -8
+	ld      $2, 0($12)
+	sd      $2, 0($14)
+	daddiu  $12,$12, 8
+	daddiu  $14,$14, 8
+	b       .next
+.skip:
+	move    $25, $4
+
+	/* load registers */
+
+	/* locals: */
+	/* $13 = register data */
+	/* $14 = useDouble flags */
+	move    $13, $5
+	ld      $14, 128($13)
+	
+	/* load integer parameter registers */
+
+	ld      $4 , 0($13)
+	ld      $5 , 8($13)
+	ld      $6 ,16($13)
+	ld      $7 ,24($13)
+	ld      $8 ,32($13)
+	ld      $9 ,40($13)
+	ld      $10,48($13)
+	ld      $11,56($13)
+
+	/* load float-or-double floating pointer parameter registers 
+	   a 64-bit bitmask given at byte offset 128 of regdata indicates
+	   if loading a float (bit cleared) or double (bit set), starting
+	   at bit position 0 in bitmask.
+	*/
+.t0:
+	and     $15, $14, 1
+	bgtz    $15, .d0
+.f0:
+	l.s     $f12, 64($13)
+	j       .t1
+.d0:
+	l.d     $f12, 64($13)
+
+.t1:
+	and     $15, $14, 2
+	bgtz    $15, .d1
+.f1:
+	l.s     $f13, 72($13)
+	j       .t2
+.d1:
+	l.d     $f13, 72($13)
+.t2:
+	and     $15, $14, 4
+	bgtz    $15, .d2
+.f2:
+	l.s     $f14, 80($13)
+	j       .t3
+.d2:
+	l.d     $f14, 80($13)
+.t3:
+	and     $15, $14, 8
+	bgtz    $15, .d3
+.f3:
+	l.s     $f15, 88($13)
+	j       .t4
+.d3:
+	l.d     $f15, 88($13)
+.t4:
+	and     $15, $14, 16
+	bgtz    $15, .d4
+.f4:
+	l.s     $f16, 96($13)
+	j       .t5
+.d4:
+	l.d     $f16, 96($13)
+.t5:
+	and     $15, $14, 32
+	bgtz    $15, .d5
+.f5:
+	l.s     $f17,104($13)
+	j       .t6
+.d5:
+	l.d     $f17,104($13)
+.t6:
+	and     $15, $14, 64
+	bgtz    $15, .d6
+.f6:
+	l.s     $f18,112($13)
+	j       .t7
+.d6:
+	l.d     $f18,112($13)
+.t7:
+	and     $15, $14, 128
+	bgtz    $15, .d7
+.f7:
+	l.s     $f19,120($13)
+	j       .fregend
+.d7:
+	l.d     $f19,120($13)
+
+.fregend:
+
+	/* jump-and-link to register $25 */
+
+	jal     $31, $25
+	nop /* branch-delay slot - no nop according to gcc assembly */
+	    /* output, but let's play safe */
+
+	/* Stack-frame epilog */
+	move    $sp,$fp 
+	ld      $ra,48($sp)  /* restore ra register */
+	ld      $fp,40($sp)  /* restore fp register */
+	ld      $gp,32($sp)  /* restore gp register */
+	daddu   $sp,$sp,64
+	j       $ra
+	.end    dcCall_mips_n64
+	.size   dcCall_mips_n64, .-dcCall_mips_n64
+
--- a/dyncall/dyncall_call_mips_n64_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncall
- File: dyncall/dyncall_call_mips_n64_gas.s
- Description: mips "n64" abi call kernel implementation in GNU Assembler
- License:
-
-   Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>, 
-                           Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-	.section .mdebug.abi64
-	.previous
-	.abicalls
-	.text
-	.align	2
-	.globl	dcCall_mips_n64
-	.ent	dcCall_mips_n64
-dcCall_mips_n64:
-
-	/* Stack-frame prolog */
-
-	# .frame	$fp,64,$31		/* vars=16, regs=3/0, args=0, extra=16 */
-	# .mask	0xd0000000,-8
-	# .fmask	0x00000000,0
-	dsubu	$sp,$sp,64
-	sd	$31,48($sp)	/* save return address register (ra) */
-	sd	$30,40($sp)	/* save frame pointer register (fp) */
-	sd	$28,32($sp)	/* save global pointer register (gp) */
-	move	$fp,$sp
-
-
-	/* arguments: */
-		
-	/* $4 target function */
- 	/* $5 register data */
-	/* $6 stack size */
-	/* $7 stack data */
-	
-
-	/* allocate argument stack space */
-
-	dsubu	$sp, $sp, $6
-	
-	/* copy stack data */
-
-	/* n64 abi call assumptions:
-           - stack data is 16-byte aligned.
-           - no extra-storage for arguments passed via registers.
-        */
-
-	/* $12  source pointer (parameter stack data) */
-	/* $14  destination (stack pointer) */
-	/* $6   byte count */
-
-	move	$12, $7
-	move	$14, $sp
-
-.next:
-	beq	$6, $0, .skip
-	# nop
-	daddiu	$6, $6, -8
-	ld	$2, 0($12)
-	sd	$2, 0($14)
-	daddiu	$12,$12, 8
-	daddiu	$14,$14, 8
-	b	.next
-.skip:
-	move	$25, $4
-
-	/* load registers */
-
-	/* locals: */
-	/* $13 = register data */
-	/* $14 = useDouble flags */
-	move	$13, $5
-	ld	$14, 128($13)
-	
-	/* load integer parameter registers */
-
-	ld	$4 , 0($13)
-	ld	$5 , 8($13)
-	ld	$6 ,16($13)
-	ld	$7 ,24($13)
-	ld	$8 ,32($13)
-	ld	$9 ,40($13)
-	ld	$10,48($13)
-	ld	$11,56($13)
-
-	/* load float-or-double floating pointer parameter registers 
-           a 64-bit bitmask given at byte offset 128 of regdata indicates
-           if loading a float (bit cleared) or double (bit set), starting
-           at bit position 0 in bitmask.
-        */
-.t0:
-	and     $15, $14, 1
-	bgtz	$15, .d0
-.f0:
-	l.s	$f12, 64($13)
-	j	.t1
-.d0:
-	l.d	$f12, 64($13)
-
-.t1:
-	and	$15, $14, 2
-	bgtz	$15, .d1
-.f1:
-	l.s	$f13, 72($13)
-	j	.t2
-.d1:
-	l.d	$f13, 72($13)
-.t2:	
-	and	$15, $14, 4
-	bgtz	$15, .d2
-.f2:
-	l.s	$f14, 80($13)
-	j	.t3
-.d2:	
-	l.d	$f14, 80($13)
-.t3:
-	and	$15, $14, 8
-	bgtz	$15, .d3
-.f3:
-	l.s	$f15, 88($13)
-	j	.t4
-.d3:
-	l.d	$f15, 88($13)
-.t4:
-	and	$15, $14, 16
-	bgtz	$15, .d4
-.f4:
-	l.s	$f16, 96($13)
-	j	.t5
-.d4:
-	l.d	$f16, 96($13)
-.t5:
-	and	$15, $14, 32
-	bgtz	$15, .d5
-.f5:
-	l.s	$f17,104($13)
-	j	.t6
-.d5:
-	l.d	$f17,104($13)
-.t6:
-	and	$15, $14, 64
-	bgtz	$15, .d6
-.f6:
-	l.s	$f18,112($13)
-	j	.t7
-.d6:
-	l.d	$f18,112($13)
-.t7:
-	and	$15, $14, 128
-	bgtz	$15, .d7
-.f7:
-	l.s	$f19,120($13)
-	j	.fregend
-.d7:
-	l.d	$f19,120($13)
-
-.fregend:
-
-	/* jump-and-link to register $25 */
-
-	jal	$31, $25
-	nop /* branch-delay slot - no nop according to gcc assembly */
-	    /* output, but let's play safe */	
-
-	/* Stack-frame epilog */	
-	move	$sp,$fp 
-	ld	$ra,48($sp)	/* restore ra register */
-	ld	$fp,40($sp)	/* restore fp register */
-	ld	$gp,32($sp)	/* restore gp register */
-	daddu	$sp,$sp,64
-	j	$ra
-	.end	dcCall_mips_n64
-	.size	dcCall_mips_n64, .-dcCall_mips_n64
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncall/dyncall_call_mips_o32.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,109 @@
+/*
+
+ Package: dyncall
+ Library: dyncall
+ File: dyncall/dyncall_call_mips_o32.S
+ Description: mips "o32" abi call kernel implementation in GNU Assembler
+ License:
+
+   Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>, 
+                           Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+	/* $4   target function */
+	/* $5   register data */
+	/* $6   stack size (min 16-byte aligned to 8-bytes already) */
+	/* $7   stack data */
+
+
+
+	.section .mdebug.abi32
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl  dcCall_mips_o32
+	.ent    dcCall_mips_o32
+	.type   dcCall_mips_o32, @function
+dcCall_mips_o32:
+	.frame  $fp,40,$31      /* vars=8, regs=2/0, args=16, gp=8 */
+	.mask   0xc0000000,-4
+	.fmask  0x00000000,0
+	.set    noreorder
+	
+	addiu   $sp,$sp,-8
+	sw      $31,4($sp)      /* save link register */
+	sw      $fp,0($sp)      /* save frame pointer */
+	nop
+	move    $fp,$sp         /* frame pointer = sp */
+	sub     $sp, $sp, $6    /* increment stack */
+
+	/* copy stack data */
+
+	/* $12  source pointer (parameter stack data) */
+	/* $14  destination (stack pointer) */
+	/* $6   byte count */
+
+	move    $12, $7
+	move    $14, $sp
+
+.next:
+	beq     $6, $0, .skip
+	nop
+	lw      $2, 0($12)
+	nop
+	sw      $2, 0($14)
+	addiu   $12,$12, 4
+	addiu   $14,$14, 4
+	addiu   $6, $6, -4
+	j       .next
+	nop
+.skip:
+
+#if defined(DC__ABI_HARDFLOAT)
+	/* load two double-precision floating-point argument registers ($f12, $f14) - not for softfloat */
+
+	l.d     $f12, 0($5)
+	l.d     $f14, 8($5)
+#endif
+
+	/* prepare call */
+
+	move    $12, $7        /* $12  stack data */
+	move    $25, $4        /* $25  target function */
+
+	/* load first four integer arguments ($4-$7) */
+
+	lw      $4, 0($12)
+	lw      $5, 4($12)
+	lw      $6, 8($12)
+	lw      $7,12($12)
+
+	/* call target function */
+
+	jalr    $25
+	nop
+	move    $sp,$fp        /* restore stack pointer */
+	nop
+	lw      $31,4($sp)     /* restore return address */
+	lw      $fp,0($sp)     /* restore frame pointer */
+	addiu   $sp,$sp,8      /* end stack frame */
+	j       $31            /* return */
+	nop
+
+	.set    reorder
+	.end    dcCall_mips_o32 
+	.ident  "handwritten"
+
--- a/dyncall/dyncall_call_mips_o32.h	Sun May 20 02:23:44 2018 +0200
+++ b/dyncall/dyncall_call_mips_o32.h	Mon May 21 02:48:12 2018 +0200
@@ -37,10 +37,13 @@
 /* Call-kernel register data:
 
   Details:
+
   The structure holds the argument data for transfering float/double arguments
   via registers as well.
-  The call-kernel implements loads two doubles, which involves four
-  32-bit floating pointer registers.
+  The call-kernel on hardfloat platforms implements loads two doubles, which
+  involves four 32-bit floating pointer registers. It's unused for softfloat
+  platforms.
+
   Float arguments map as following:
   
     float argument 0 is at u[0][0] for little, u[0][1] for big endian and
@@ -49,12 +52,14 @@
 
 */
 
-typedef struct DCRegData_mips_o32_
+typedef struct
 {
+#if defined(DC__ABI_HARDFLOAT)
   union {
     double d;
     float  f[2];
   } u[2];
+#endif /* DC__ABI_HARDFLOAT */
 } DCRegData_mips_o32;
 
 
--- a/dyncall/dyncall_call_mips_o32_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncall
- File: dyncall/dyncall_call_mips_o32_gas.s
- Description: mips "o32" abi call kernel implementation in GNU Assembler
- License:
-
-   Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>, 
-                           Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-	/* $4   target function */
- 	/* $5   register data */
-	/* $6   stack size (min 16-byte aligned to 8-bytes already) */
-	/* $7   stack data */
-
-
-
-	.section .mdebug.abi32
-	.previous
-	.abicalls
-	.text
-	.align	2
-	.globl	dcCall_mips_o32
-	.ent	dcCall_mips_o32
-	.type	dcCall_mips_o32, @function
-dcCall_mips_o32:
-	.frame	$fp,40,$31		/* vars=8, regs=2/0, args=16, gp=8 */
-	.mask	0xc0000000,-4
-	.fmask	0x00000000,0
-	.set	noreorder
-	
-	addiu	$sp,$sp,-8
-	sw	$31,4($sp)	/* save link register */
-	sw	$fp,0($sp)	/* save frame pointer */
-	nop
-	move	$fp,$sp		/* frame pointer = sp */
-	sub	$sp, $sp, $6	/* increment stack */
-
-	/* copy stack data */
-
-	/* $12  source pointer (parameter stack data) */
-	/* $14  destination (stack pointer) */
-	/* $6   byte count */
-
-	move	$12, $7
-	move	$14, $sp
-
-.next:
-	beq	$6, $0, .skip
-	nop
-	lw	$2, 0($12)
-	nop
-	sw	$2, 0($14)
-	addiu	$12,$12, 4
-	addiu	$14,$14, 4
-	addiu	$6, $6, -4
-	j	.next
-	nop
-.skip:
-
-	/* load two double-precision floating-point argument registers ($f12, $f14) */
-
-	l.d     $f12, 0($5)
-	l.d     $f14, 8($5)
-
-	/* prepare call */
-
-	move	$12, $7		/* $12  stack data */
-	move	$25, $4		/* $25  target function */
-
-	/* load first four integer arguments ($4-$7) */
-
-	lw	$4, 0($12)
-	lw	$5, 4($12)
-	lw	$6, 8($12)
-	lw	$7,12($12)
-
-	/* call target function */
-
-	jalr	$25
-	nop
-	move	$sp,$fp 	/* restore stack pointer */
-	nop
-	lw	$31,4($sp)	/* restore return address */
-	lw	$fp,0($sp)	/* restore frame pointer */
-	addiu	$sp,$sp,8	/* end stack frame */
-	j	$31		/* return */
-	nop
-
-	.set	reorder
-	.end	dcCall_mips_o32 
-	.ident 	"handwritten"
-
--- a/dyncall/dyncall_callvm_mips_o32.c	Sun May 20 02:23:44 2018 +0200
+++ b/dyncall/dyncall_callvm_mips_o32.c	Mon May 21 02:48:12 2018 +0200
@@ -77,7 +77,7 @@
 
 static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x)
 {
-  dc_callvm_argInt_mips_o32(in_self, * (DCint*) &x );
+  dc_callvm_argInt_mips_o32(in_self, *(DCint*)&x);
 }
 
 static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x)
@@ -100,51 +100,55 @@
   dc_callvm_argInt_mips_o32(in_self, (DCint)x);
 }
 
-static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong Lv)
+static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong x)
 {
   DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
-    
+
   /* 64-bit values need to be aligned on 8 byte boundaries */
   dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
-  dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong));
-  self->mArgCount += 1;
+  dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
+  self->mArgCount++;
 }
 
 static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x)
 {
   DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
 
-  dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) );
+  dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
+
+#if defined(DC__ABI_HARDFLOAT)
   if (self->mArgCount < 2) {
-#if defined(DC__Endian_LITTLE)
+# if defined(DC__Endian_LITTLE)
     self->mRegData.u[self->mArgCount].f[0] = x;
-#else
+# else
     self->mRegData.u[self->mArgCount].f[1] = x;
-#endif
-#if 0
+# endif
+# if 0
     self->mRegData.u[self->mArgCount].f[1] = x;
    call kernel
         
-        mips:
-        lwc1	$f12, 4($5)       <--- byte offset 4
-	lwc1	$f13, 0($5)
-	lwc1	$f14, 12($5)      <--- byte offset 12 
-	lwc1	$f15, 8($5)
-        mipsel:
-        lwc1	$f12, 0($5)       <--- byte offset 4
-	lwc1	$f13, 4($5)
-	lwc1	$f14, 8($5)      <--- byte offset 12 
-	lwc1	$f15, 12($5)
+	mips:
+	lwc1  $f12,  4($5)    <--- byte offset 4
+	lwc1  $f13,  0($5)
+	lwc1  $f14, 12($5)    <--- byte offset 12 
+	lwc1  $f15,  8($5)
+	mipsel:
+	lwc1  $f12,  0($5)    <--- byte offset 4
+	lwc1  $f13,  4($5)
+	lwc1  $f14,  8($5)    <--- byte offset 12 
+	lwc1  $f15, 12($5)
 
-#if defined(DC__Endian_LITTLE)
+#  if defined(DC__Endian_LITTLE)
     /* index 0 and 2 */
     self->mRegData.floats[self->mArgCount*2] = x;
-#else
+#  else
     /* index 1 and 3 */
     self->mRegData.floats[self->mArgCount*2+1] = x;
-#endif
-#endif
+#  endif
+# endif
   }
+#endif /* DC__ABI_HARDFLOAT */
+
   self->mArgCount++;
 }
 
@@ -153,9 +157,13 @@
   DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
   /* 64-bit values need to be aligned on 8 byte boundaries */
   dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
-  dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) );
+  dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
+
+#if defined(DC__ABI_HARDFLOAT)
   if (self->mArgCount < 2)
     self->mRegData.u[self->mArgCount].d = x;
+#endif /* DC__ABI_HARDFLOAT */
+
   self->mArgCount++;
 }
 
--- a/dyncall/dyncall_macros.h	Sun May 20 02:23:44 2018 +0200
+++ b/dyncall/dyncall_macros.h	Mon May 21 02:48:12 2018 +0200
@@ -189,7 +189,7 @@
 # define DC__Arch_MIPS
 #elif defined(__arm__)
 # define DC__Arch_ARM
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || defined(__arm64) || defined(__arm64__)
 # define DC__Arch_ARM64
 #elif defined(__sh__)
 # define DC__Arch_SuperH
@@ -238,16 +238,21 @@
 #endif /* ARM */
 
 #if defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64)
-# if defined(_ABIO32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2)
+# if defined(_ABIO32) || defined(__mips_o32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2)
 #  define DC__ABI_MIPS_O32
-# elif defined(_ABI64) || defined(_mips_n64)
+# elif defined(_ABI64) || defined(__mips_n64)
 #  define DC__ABI_MIPS_N64
 # elif defined(_ABIN32)
 #  define DC__ABI_MIPS_N32
 # else
 #  define DC__ABI_MIPS_EABI
 # endif
-/*@@@implement/support: __mips_hard_float*/
+/* Set extra flag to know if FP hardware ABI, default to yes, if unsure */
+# if (defined(__mips_hard_float) && (__mips_hard_float == 1)) || !defined(__mips_soft_float) || (__mips_soft_float != 1)
+#  define DC__ABI_HARDFLOAT /* @@@ make this general for all archs? */
+# else
+#  define DC__ABI_SOFTFLOAT
+# endif
 #endif /* MIPS */
 
 #if defined(DC__Arch_PPC64)
@@ -266,16 +271,14 @@
 # define DC__Endian_BIG
 #else                                                      /* all others are bi-endian */
 /* @@@check flags used on following bi-endianness archs:
-DC__Arch_ARM
-DC__Arch_ARM64
 DC__Arch_Itanium
 DC__Arch_PPC32
 DC__Arch_PPC64
 DC__Arch_SuperH
 */
-# if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(_BIG_ENDIAN) || defined(MIPSEB) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
+# if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(MIPSEB) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) || defined(__ARMEB__) || defined(__AARCH64EB__)
 #  define DC__Endian_BIG
-# elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(_LITTLE_ENDIAN) || defined(MIPSEL) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
+# elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(MIPSEL) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(__ARMEL__) || defined(__AARCH64EL__)
 #  define DC__Endian_LITTLE
 # elif defined(DC__Arch_Sparc64) && !defined(__BYTE_ORDER__) /* Sparc64 default is big-endian, except if explicitly defined */
 #    define DC__Endian_BIG
--- a/dyncallback/dyncall_args_mips.h	Sun May 20 02:23:44 2018 +0200
+++ b/dyncallback/dyncall_args_mips.h	Mon May 21 02:48:12 2018 +0200
@@ -33,7 +33,7 @@
 {
 	/* Don't change order or types, laid out for asm code to fill in! */
 #if defined(DC__Arch_MIPS) && defined(DC__ABI_MIPS_O32)
-	DCint freg_count;
+	DCint freg_count; /* unused on soft-float targets, but keep as 4b-padding */
 #else
 #  define DCARGS_MIPS_NUM_IREGS 8
 #  define DCARGS_MIPS_NUM_FREGS 8
--- a/dyncallback/dyncall_args_mips_o32.c	Sun May 20 02:23:44 2018 +0200
+++ b/dyncallback/dyncall_args_mips_o32.c	Mon May 21 02:48:12 2018 +0200
@@ -29,7 +29,12 @@
 DCint dcbArgInt(DCArgs* p)
 {
   DCint value;
-  p->freg_count = 2; /* first int will disable float reg use. */
+
+#if defined(DC__ABI_HARDFLOAT)
+  /* first int will disable float reg use. */
+  p->freg_count = 2;
+#endif /* DC__ABI_HARDFLOAT */
+
   value = *((int*)p->stackptr);
   p->stackptr += sizeof(int);
   return value;
@@ -63,19 +68,23 @@
 DCfloat dcbArgFloat(DCArgs* p)
 {
   DCfloat result;
+
+#if defined(DC__ABI_HARDFLOAT)
   if(p->freg_count < 2) {
 	/* Stored float regs (max 2) are always 8b aligned. The way we look them up, */
 	/* relative to a diverging p->stackptr, we need consider this. Only works    */
 	/* with up to two float args, which is all we need. Hacky, but saves us      */
 	/* from one more variable and more bookkeeping in DCArgs.                    */
     result = ((DCfloat*)(p->stackptr + ((int)p->stackptr & 4)) - 4) /* '-4' b/c those regs are stored right before the args */
-#if defined(DC__Endian_LITTLE)
+# if defined(DC__Endian_LITTLE)
       [0];
-#else
+# else
       [1];
-#endif
+# endif
 	++p->freg_count;
-  } else {
+  } else
+#endif /* DC__ABI_HARDFLOAT */
+  {
     result = *((DCfloat*)p->stackptr);
   }
   p->stackptr += sizeof(DCfloat);
@@ -88,12 +97,16 @@
     DCfloat f[2];
   } d;
   p->stackptr += ((int)p->stackptr & 4); /* Skip one slot if not aligned. */
+
+#if defined(DC__ABI_HARDFLOAT)
   if(p->freg_count < 2) {
     /*result = *((DCdouble*)p->stackptr-2); this changes the value, slightly*/
     d.f[0] = ((DCfloat*)p->stackptr-4)[0]; /* '-4' b/c those regs are stored right before the args */
     d.f[1] = ((DCfloat*)p->stackptr-4)[1];
     ++p->freg_count;
-  } else {
+  } else
+#endif /* DC__ABI_HARDFLOAT */
+  {
     /*result = *((DCdouble*)p->stackptr); this changes the value, slightly*/
     d.f[0] = ((DCfloat*)p->stackptr)[0];
     d.f[1] = ((DCfloat*)p->stackptr)[1];
--- a/dyncallback/dyncall_callback_arch.S	Sun May 20 02:23:44 2018 +0200
+++ b/dyncallback/dyncall_callback_arch.S	Mon May 21 02:48:12 2018 +0200
@@ -65,7 +65,17 @@
 #  elif defined(DC__Arch_PPC64)
 #    include "dyncall_callback_ppc64.S"
 #  elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64)
-#    include "dyncall_callback_mips_gas.S"
+#    if defined(DC__ABI_MIPS_O32)
+#      include "dyncall_callback_mips_o32.S"
+#    elif defined(DC__ABI_MIPS_N64)
+#      include "dyncall_callback_mips_n64.S"
+#    elif defined(DC__ABI_MIPS_N32)
+#      include "dyncall_callback_mips_n32.S"
+#    elif defined(DC__ABI_MIPS_EABI)
+#      include "dyncall_callback_mips_eabi_gas.s"
+#    else
+#      error Unknown MIPS ABI.
+#    endif
 #  elif defined(DC__Arch_ARM_ARM)
 #    include "dyncall_callback_arm32_arm_gas.S"
 #  elif defined(DC__Arch_ARM_THUMB)
--- a/dyncallback/dyncall_callback_mips_gas.S	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncallback
- File: dyncallback/dyncall_callback_mips_gas.S
- Description: auto-select (via C preprocessor) mips abi callback implementation
- License:
-
-   Copyright (c) 2016-2018 Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-
-
-#if defined(DC__ABI_MIPS_EABI)
-#  include "dyncall_callback_mips_eabi_gas.s"
-#elif defined(DC__ABI_MIPS_O32)
-#  include "dyncall_callback_mips_o32_gas.s"
-#elif defined(DC__ABI_MIPS_N64)
-#  include "dyncall_callback_mips_n64_gas.s"
-#elif defined(DC__ABI_MIPS_N32)
-#  include "dyncall_callback_mips_n32_gas.s"
-#else
-#  error Unknown MIPS ABI.
-#endif
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncallback/dyncall_callback_mips_n32.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,35 @@
+/*
+
+ Package: dyncall
+ Library: dyncallback
+ File: dyncallback/dyncall_callback_mips_n32.S
+ Description: Callback Thunk - Implementation for mips64 n32
+ License:
+
+   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+	.section .mdebug.abiN32
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl dcCallbackThunkEntry
+	.ent   dcCallbackThunkEntry
+dcCallbackThunkEntry:
+
+	.end dcCallbackThunkEntry
+
--- a/dyncallback/dyncall_callback_mips_n32_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncallback
- File: dyncallback/dyncall_callback_mips_n32_gas.s
- Description: Callback Thunk - Implementation for mips64 n32
- License:
-
-   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-	.section .mdebug.abiN32
-	.previous
-	.abicalls
-	.text
-	.align  2
-	.globl dcCallbackThunkEntry
-	.ent   dcCallbackThunkEntry
-dcCallbackThunkEntry:
-
-	.end dcCallbackThunkEntry
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncallback/dyncall_callback_mips_n64.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,98 @@
+/*
+
+ Package: dyncall
+ Library: dyncallback
+ File: dyncallback/dyncall_callback_mips_n64.S
+ Description: Callback Thunk - Implementation for mips64 n64
+ License:
+
+   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+	/* input:
+		$t8    -> thunk
+		$t8+56 -> cb handler
+		$t8+64 -> userdata
+	*/
+
+	.section .mdebug.abi64
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl dcCallbackThunkEntry
+	.ent   dcCallbackThunkEntry
+dcCallbackThunkEntry:
+	.set    noreorder
+
+	/* Prolog. */
+	/* Frame size of 160b comes from following: */
+	/*   DCargs(fregs:64 + iregs:64 + regcounts:8 + stackptr:8) + retval:8 + ra:8 */
+	daddiu $sp, $sp, -160 /* open frame */
+	sd     $ra, 152($sp)  /* save link register */
+
+	.frame $fp,160,$31    /* specify our frame: fp,size,lr; creates virt $fp */
+	                      /* code below doesn't use $fp though, as n/a with -O1 */
+	/* Init return value */
+	sd $zero, 144($sp)
+
+	/* Store float and int args where our DCargs member arrays are, in local area. */
+	sd  $4,     0($sp)
+	sd  $5,     8($sp)
+	sd  $6,    16($sp)
+	sd  $7,    24($sp)
+	sd  $8,    32($sp)
+	sd  $9,    40($sp)
+	sd $10,    48($sp)
+	sd $11,    56($sp)
+	s.d $f12,  64($sp)
+	s.d $f13,  72($sp)
+	s.d $f14,  80($sp)
+	s.d $f15,  88($sp)
+	s.d $f16,  96($sp)
+	s.d $f17, 104($sp)
+	s.d $f18, 112($sp)
+	s.d $f19, 120($sp)
+
+	/* Init DCarg's reg_counts and stackptr. */
+	sd $zero, 128($sp)    /* reg_count */
+	daddiu $4, $sp, 160
+	sd     $4, 136($sp)   /* stackptr */
+
+	/* Prepare callback handler call. */
+	move   $4, $24        /* Param 0 = DCCallback*, $24 ($t8) holds pointer to thunk */
+	move   $5, $sp        /* Param 1 = DCArgs*, pointer to where pointer to args is stored */
+	daddiu $6, $sp, 144   /* Param 2 = results pointer to 8b of local data on stack */
+	ld     $7, 64($24)    /* Param 3 = userdata pointer */
+
+	ld     $25, 56($24)   /* store handler entry in $25 ($t9), required for PIC */
+	jalr   $25            /* jump */
+	nop                   /* branch delay nop */
+
+	/* Copy result in corresponding registers $2-$3 ($v0-$v1) and $f0 */
+	ld     $2, 144($sp)   /* note: ignoring second possible retval in $3, here */
+	l.d   $f0, 144($sp)
+
+	/* Epilog. Tear down frame and return. */
+	ld    $ra, 152($sp)   /* restore return address */
+	daddiu $sp, $sp, 160  /* close frame */
+	j     $ra             /* return */
+	nop                   /* branch delay nop */
+
+	.set    reorder
+	.end    dcCallbackThunkEntry
+	.ident  "handwritten"
+
--- a/dyncallback/dyncall_callback_mips_n64_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncallback
- File: dyncallback/dyncall_callback_mips_n64_gas.s
- Description: Callback Thunk - Implementation for mips64 n64
- License:
-
-   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-	/* input:
-		$t8    -> thunk
-		$t8+56 -> cb handler
-		$t8+64 -> userdata
-	*/
-
-	.section .mdebug.abi64
-	.previous
-	.abicalls
-	.text
-	.align  2
-	.globl dcCallbackThunkEntry
-	.ent   dcCallbackThunkEntry
-dcCallbackThunkEntry:
-	.set    noreorder
-
-	/* Prolog. */
-	/* Frame size of 160b comes from following: */
-	/*   DCargs(fregs:64 + iregs:64 + regcounts:8 + stackptr:8) + retval:8 + ra:8 */
-	daddiu $sp, $sp, -160 /* open frame */
-	sd     $ra, 152($sp)  /* save link register */
-
-	.frame $fp,160,$31    /* specify our frame: fp,size,lr; creates virt $fp */
-	                      /* code below doesn't use $fp though, as n/a with -O1 */
-	/* Init return value */
-	sd $zero, 144($sp)
-
-	/* Store float and int args where our DCargs member arrays are, in local area. */
-	sd  $4,     0($sp)
-	sd  $5,     8($sp)
-	sd  $6,    16($sp)
-	sd  $7,    24($sp)
-	sd  $8,    32($sp)
-	sd  $9,    40($sp)
-	sd $10,    48($sp)
-	sd $11,    56($sp)
-	s.d $f12,  64($sp)
-	s.d $f13,  72($sp)
-	s.d $f14,  80($sp)
-	s.d $f15,  88($sp)
-	s.d $f16,  96($sp)
-	s.d $f17, 104($sp)
-	s.d $f18, 112($sp)
-	s.d $f19, 120($sp)
-
-	/* Init DCarg's reg_counts and stackptr. */
-	sd $zero, 128($sp)    /* reg_count */
-	daddiu $4, $sp, 160
-	sd     $4, 136($sp)   /* stackptr */
-
-	/* Prepare callback handler call. */
-	move   $4, $24        /* Param 0 = DCCallback*, $24 ($t8) holds pointer to thunk */
-	move   $5, $sp        /* Param 1 = DCArgs*, pointer to where pointer to args is stored */
-	daddiu $6, $sp, 144   /* Param 2 = results pointer to 8b of local data on stack */
-	ld     $7, 64($24)    /* Param 3 = userdata pointer */
-
-	ld     $25, 56($24)   /* store handler entry in $25 ($t9), required for PIC */
-	jalr   $25            /* jump */
-	nop                   /* branch delay nop */
-
-	/* Copy result in corresponding registers $2-$3 ($v0-$v1) and $f0 */
-	ld     $2, 144($sp)   /* note: ignoring second possible retval in $3, here */
-	l.d   $f0, 144($sp)
-
-	/* Epilog. Tear down frame and return. */
-	ld    $ra, 152($sp)   /* restore return address */
-	daddiu $sp, $sp, 160  /* close frame */
-	j     $ra             /* return */
-	nop                   /* branch delay nop */
-
-	.set    reorder
-	.end    dcCallbackThunkEntry
-	.ident  "handwritten"
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dyncallback/dyncall_callback_mips_o32.S	Mon May 21 02:48:12 2018 +0200
@@ -0,0 +1,116 @@
+/*
+
+ Package: dyncall
+ Library: dyncallback
+ File: dyncallback/dyncall_callback_mips_o32.S
+ Description: Callback Thunk - Implementation mips32 o32
+ License:
+
+   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+	/* input:
+		$t4    -> thunk
+		$t4+20 -> cb handler
+		$t4+24 -> userdata
+	*/
+
+	.section .mdebug.abi32
+	.previous
+	.abicalls
+	.text
+	.align  2
+	.globl dcCallbackThunkEntry
+	.ent   dcCallbackThunkEntry
+	.type  dcCallbackThunkEntry, @function
+
+/* Called by thunk - thunk stores pointer to DCCallback in $12 ($t4), and */
+/* pointer to called function in $25 ($t9, required for PIC)              */
+dcCallbackThunkEntry:
+	.set    noreorder
+
+	/* Prolog. Just store the minimum, return address, spill area.     */
+	/* Frame size of 56b comes from following areas (each 8b aligned): */
+	/*   local: fpregs:16 + retval:8 + DCArgs:8 */
+	/*   save:  ra:4 (+ pad:4)                  */
+	/*   param: spill:16                        */
+	subu  $sp, 56       /* open frame */
+	sw    $ra, 20($sp)  /* save link register */
+
+	.frame $fp,56,$31   /* specify our frame: fp,size,lr; creates virt $fp */
+	                    /* code below doesn't use $fp though, as n/a with -O1 */
+	/* Init return value */
+	sw $zero, 32($sp)
+	sw $zero, 36($sp)
+
+	/* Store the arguments passed via registers somewhere for dcArg* to access. */
+	/* For $4-$7 ($a0-$a3), use dedicated spill area (caller doesn't spill, but */
+	/* provides it at end of _caller's_ frame, so $fp points right to it).      */
+	/* For $f12 and $f14 use our space (in local data), which is adjacent.      */
+#if defined(DC__ABI_HARDFLOAT)
+	s.d $f12, 40($sp)   /* -16($fp) */
+	s.d $f14, 48($sp)   /*  -8($fp) */
+#endif /* DC__ABI_HARDFLOAT */
+	sw $4,    56($sp)   /*   0($fp) */
+	sw $5,    60($sp)   /*   4($fp) */
+	sw $6,    64($sp)   /*   8($fp) */
+	sw $7,    68($sp)   /*  12($fp) */
+
+	/* Init DCArg, which contains reg_count and stackptr* to the args. Point  */
+	/* stackptr to the area where the non-float args start (which is at $fp). */
+	addiu $4, $sp, 56   /* <- non-$fp replacement for: */
+	sw    $4, 28($sp)   /* <-   sw $fp, 28($sp)        */
+#if defined(DC__ABI_HARDFLOAT)
+	sw $zero, 24($sp)   /* init num float-regs (unused for soft-float) */
+#endif /* DC__ABI_HARDFLOAT */
+
+	/* Prepare callback handler call. */
+	move  $4, $12       /* Param 0 = DCCallback*, $12 ($t4) holds pointer to thunk */
+	addiu $5, $sp, 24   /* Param 1 = DCArgs*, pointer to where pointer to args is stored */
+	addiu $6, $sp, 32   /* Param 2 = results pointer to 8b of local data on stack */
+	lw    $7, 24($12)   /* Param 3 = userdata pointer */
+
+	lw    $25, 20($12)  /* store handler entry in $25 ($t9), required for PIC */
+	jalr  $25           /* jump */
+	nop                 /* branch delay nop */
+
+	/* Copy result to corresponding registers */
+	/* Handle single precision soft-float retvals differently on big-endian */
+	/* targets as they are right-justified in their 8b stack lots           */
+#if !defined(DC__ABI_HARDFLOAT) && defined(DC__Endian_BIG)
+	xori  $4, $2, 'f'   /* $4 = 0 if cb-handler returned 'f' in $2 */
+#endif
+	lw    $2, 32($sp)
+	lw    $3, 36($sp)
+#if defined(DC__ABI_HARDFLOAT)
+	l.d   $f0, 32($sp)
+#elif defined(DC__Endian_BIG)
+	bgtz  $4, .nonf32r  /* if no 'f' returned, $2 and $3 are good */
+	nop                 /* branch delay nop */
+	move  $2, $3
+.nonf32r:
+#endif /* DC__ABI_HARDFLOAT */
+
+	/* Epilog. Tear down frame and return. */
+	lw    $ra, 20($sp)  /* restore return address */
+	addiu $sp, $sp, 56  /* close frame */
+	j     $ra           /* return */
+	nop                 /* branch delay nop */
+
+	.set    reorder
+	.end    dcCallbackThunkEntry
+	.ident  "handwritten"
+
--- a/dyncallback/dyncall_callback_mips_o32_gas.s	Sun May 20 02:23:44 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
-
- Package: dyncall
- Library: dyncallback
- File: dyncallback/dyncall_callback_mips_o32_gas.s
- Description: Callback Thunk - Implementation mips32 o32
- License:
-
-   Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
-
-   Permission to use, copy, modify, and distribute this software for any
-   purpose with or without fee is hereby granted, provided that the above
-   copyright notice and this permission notice appear in all copies.
-
-   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-	/* input:
-		$t4    -> thunk
-		$t4+20 -> cb handler
-		$t4+24 -> userdata
-	*/
-
-	.section .mdebug.abi32
-	.previous
-	.abicalls
-	.text
-	.align  2
-	.globl dcCallbackThunkEntry
-	.ent   dcCallbackThunkEntry
-	.type  dcCallbackThunkEntry, @function
-
-/* Called by thunk - thunk stores pointer to DCCallback in $12 ($t4), and */
-/* pointer to called function in $25 ($t9, required for PIC)              */
-dcCallbackThunkEntry:
-	.set    noreorder
-
-	/* Prolog. Just store the minimum, return address, spill area.     */
-	/* Frame size of 56b comes from following areas (each 8b aligned): */
-	/*   local: fpregs:16 + retval:8 + DCArgs:8 */
-	/*   save:  ra:4 (+ pad:4)                  */
-	/*   param: spill:16                        */
-	subu  $sp, 56       /* open frame */
-	sw    $ra, 20($sp)  /* save link register */
-
-	.frame $fp,56,$31   /* specify our frame: fp,size,lr; creates virt $fp */
-	                    /* code below doesn't use $fp though, as n/a with -O1 */
-	/* Init return value */
-	sw $zero, 32($sp)
-	sw $zero, 36($sp)
-
-	/* Store the arguments passed via registers somewhere for dcArg* to access. */
-	/* For $4-$7 ($a0-$a3), use dedicated spill area (caller doesn't spill, but */
-	/* provides it at end of _caller's_ frame, so $fp points right to it).      */
-	/* For $f12 and $f14 use our space (in local data), which is adjacent.      */
-	s.d $f12, 40($sp) /* -16($fp) */
-	s.d $f14, 48($sp) /*  -8($fp) */
-	sw $4,    56($sp) /*   0($fp) */
-	sw $5,    60($sp) /*   4($fp) */
-	sw $6,    64($sp) /*   8($fp) */
-	sw $7,    68($sp) /*  12($fp) */
-
-	/* Init DCArg, which contains reg_count and stackptr* to the args. Point  */
-	/* stackptr to the area where the non-float args start (which is at $fp). */
-	addiu $4, $sp, 56 /* non-$fp replacement for: */
-	sw    $4, 28($sp) /*   sw $fp, 28($sp) */
-	sw $zero, 24($sp)
-
-	/* Prepare callback handler call. */
-	move  $4, $12       /* Param 0 = DCCallback*, $12 ($t4) holds pointer to thunk */
-	addiu $5, $sp, 24   /* Param 1 = DCArgs*, pointer to where pointer to args is stored */
-	addiu $6, $sp, 32   /* Param 2 = results pointer to 8b of local data on stack */
-	lw    $7, 24($12)   /* Param 3 = userdata pointer */
-
-	lw    $25, 20($12)  /* store handler entry in $25 ($t9), required for PIC */
-	jalr  $25           /* jump */
-	nop                 /* branch delay nop */
-
-	/* Copy result in corresponding registers $2-$3 ($v0-$v1) and $f0 */
-	lw     $2, 32($sp)
-	lw     $3, 36($sp)
-	l.d   $f0, 32($sp)
-
-	/* Epilog. Tear down frame and return. */
-	lw    $ra, 20($sp)  /* restore return address */
-	addiu $sp, $sp, 56  /* close frame */
-	j     $ra           /* return */
-	nop                 /* branch delay nop */
-
-	.set    reorder
-	.end    dcCallbackThunkEntry
-	.ident  "handwritten"
-