Support building for multiple MIPS ABIs: o32 (default), n32 and eabi32 (#135)

* Support building for multiple MIPS ABIs: o32 (default), n32 and eabi32

* Default is EABI32

* Try fix mgu register name error

* Restore comment

* Make o32 default again, warn about bad emulators
This commit is contained in:
Tharo
2025-11-27 15:33:59 +00:00
committed by GitHub
parent a1d942cf71
commit e77e6683d9
11 changed files with 411 additions and 63 deletions

View File

@@ -108,12 +108,19 @@
.set x, y
#endif
#if !defined(_MIPS_SIM) || _MIPS_SIM != _ABIO32
.set $t4, $ta0
.set $t5, $ta1
.set $t6, $ta2
.set $t7, $ta3
#endif
#endif
/**
* Stack Alignment
*/
#if (_MIPS_SIM == _ABIO32)
#if defined(_MIPS_SIM) && (_MIPS_SIM == _ABIO32)
#define NARGSAVE 4 /* space for 4 args must be allocated */
#define ALSZ (8-1)
#define ALMASK ~(8-1)

View File

@@ -7,7 +7,92 @@
#define _MIPS_SIM_ABI64 _ABI64
#endif
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
#if !defined(_MIPS_SIM) /* EABI32 */
#define zero $0
#define AT $at
#define v0 $2
#define v1 $3
#define a0 $4
#define a1 $5
#define a2 $6
#define a3 $7
#define t0 $8
#define a4 $8
#define t1 $9
#define a5 $9
#define t2 $10
#define a6 $10
#define t3 $11
#define a7 $11
#define t4 $12
#define ta0 $12
#define t5 $13
#define ta1 $13
#define t6 $14
#define ta2 $14
#define t7 $15
#define ta3 $15
#define s0 $16
#define s1 $17
#define s2 $18
#define s3 $19
#define s4 $20
#define s5 $21
#define s6 $22
#define s7 $23
#define t8 $24
#define t9 $25
#define jp $25
#define k0 $26
#define k1 $27
#define GP $28
#define sp $29
#define fp $30
#define s8 $30
#define ra $31
#define fv0 $f0
#define fv0f $f1
#define fv1 $f2
#define fv1f $f3
#define ft0 $f4
#define ft0f $f5
#define ft1 $f6
#define ft1f $f7
#define ft2 $f8
#define ft2f $f9
#define ft3 $f10
#define ft3f $f11
#define fa0 $f12
#define fa0f $f13
#define fa1 $f14
#define fa1f $f15
#define fa2 $f16
#define fa2f $f17
#define ft4 $f16
#define ft4f $f17
#define fa3 $f18
#define fa3f $f19
#define ft5 $f16
#define ft5f $f17
#define fs0 $f20
#define fs0f $f21
#define fs1 $f22
#define fs1f $f23
#define fs2 $f24
#define fs2f $f25
#define fs3 $f26
#define fs3f $f27
#define fs4 $f28
#define fs4f $f29
#define fs5 $f30
#define fs5f $f31
#else
#if (_MIPS_SIM == _MIPS_SIM_ABI32) /* O32 */
#define zero $0
#define AT $at
#define v0 $2
@@ -41,14 +126,130 @@
#define jp $25
#define k0 $26
#define k1 $27
#define gp $28
#define GP $28
#define sp $29
#define fp $30
#define s8 $30
#define ra $31
#define fv0 $f0
#define fv0f $f1
#define fv1 $f2
#define fv1f $f3
#define fa0 $f12
#define fa0f $f13
#define fa1 $f14
#define fa1f $f15
#define ft0 $f4
#define ft0f $f5
#define ft1 $f6
#define ft1f $f7
#define ft2 $f8
#define ft2f $f9
#define ft3 $f10
#define ft3f $f11
#define ft4 $f16
#define ft4f $f17
#define ft5 $f18
#define ft5f $f19
#define fs0 $f20
#define fs0f $f21
#define fs1 $f22
#define fs1f $f23
#define fs2 $f24
#define fs2f $f25
#define fs3 $f26
#define fs3f $f27
#define fs4 $f28
#define fs4f $f29
#define fs5 $f30
#define fs5f $f31
#endif
#if (_MIPS_SIM == _MIPS_SIM_ABI64)
#if (_MIPS_SIM == _MIPS_SIM_NABI32) /* N32 */
#define zero $0
#define AT $1
#define v0 $2
#define v1 $3
#define a0 $4
#define a1 $5
#define a2 $6
#define a3 $7
#define a4 $8
#define t0 $8
#define ta0 $8
#define a5 $9
#define t1 $9
#define ta1 $9
#define a6 $10
#define t2 $10
#define ta2 $10
#define a7 $11
#define t3 $11
#define ta3 $11
#define t4 $12
#define t5 $13
#define t6 $14
#define t7 $15
#define s0 $16
#define s1 $17
#define s2 $18
#define s3 $19
#define s4 $20
#define s5 $21
#define s6 $22
#define s7 $23
#define t8 $24
#define t9 $25
#define k0 $26
#define kt0 $26
#define k1 $27
#define kt1 $27
#define GP $28
#define sp $29
#define s8 $30
#define fp $30
#define ra $31
#define fv0 $f0
#define ft14 $f1
#define fv1 $f2
#define ft15 $f3
#define ft0 $f4
#define ft1 $f5
#define ft2 $f6
#define ft3 $f7
#define ft4 $f8
#define ft5 $f9
#define ft6 $f10
#define ft7 $f11
#define fa0 $f12
#define fa1 $f13
#define fa2 $f14
#define fa3 $f15
#define fa4 $f16
#define fa5 $f17
#define fa6 $f18
#define fa7 $f19
#define fs0 $f20
#define ft8 $f21
#define fs1 $f22
#define ft9 $f23
#define fs2 $f24
#define ft10 $f25
#define fs3 $f26
#define ft11 $f27
#define fs4 $f28
#define ft12 $f29
#define fs5 $f30
#define ft13 $f31
#endif
#if (_MIPS_SIM == _MIPS_SIM_ABI64) /* O64 */
#define zero $0
#define AT $at
#define v0 $2
@@ -82,49 +283,12 @@
#define jp $25
#define k0 $26
#define k1 $27
#define gp $28
#define GP $28
#define sp $29
#define fp $30
#define s8 $30
#define ra $31
#endif
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
#define fv0 $f0
#define fv0f $f1
#define fv1 $f2
#define fv1f $f3
#define fa0 $f12
#define fa0f $f13
#define fa1 $f14
#define fa1f $f15
#define ft0 $f4
#define ft0f $f5
#define ft1 $f6
#define ft1f $f7
#define ft2 $f8
#define ft2f $f9
#define ft3 $f10
#define ft3f $f11
#define ft4 $f16
#define ft4f $f17
#define ft5 $f18
#define ft5f $f19
#define fs0 $f20
#define fs0f $f21
#define fs1 $f22
#define fs1f $f23
#define fs2 $f24
#define fs2f $f25
#define fs3 $f26
#define fs3f $f27
#define fs4 $f28
#define fs4f $f29
#define fs5 $f30
#define fs5f $f31
#endif
#if (_MIPS_SIM == _MIPS_SIM_ABI64)
#define fv0 $f0
#define fv1 $f2
#define fa0 $f12
@@ -157,6 +321,9 @@
#define fs5 $f29
#define fs6 $f30
#define fs7 $f31
#endif
#endif
#define fcr31 $31

View File

@@ -43,8 +43,15 @@ typedef struct __OSThreadContext {
/* 0x0E8 */ u64 lo, hi;
/* 0x0F8 */ u32 sr, pc, cause, badvaddr, rcp;
/* 0x10C */ u32 fpcsr;
#if !defined(_MIPS_SIM) || _MIPS_SIM != _ABIN32
/* 0x110 */ __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14;
/* 0x150 */ __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
#else
__OSfp fp0, fp1, fp2, fp3, fp4, fp5, fp6, fp7;
__OSfp fp8, fp9, fp10, fp11, fp12, fp13, fp14, fp15;
__OSfp fp16, fp17, fp18, fp19, fp20, fp21, fp22, fp23;
__OSfp fp24, fp25, fp26, fp27, fp28, fp29, fp30, fp31;
#endif
} __OSThreadContext; // size = 0x190
typedef struct __OSThreadprofile {
@@ -122,6 +129,7 @@ typedef struct __OSThreadTail {
#define THREAD_BADVADDR (THREAD_CONTEXT + 0x104)
#define THREAD_RCP (THREAD_CONTEXT + 0x108)
#define THREAD_FPCSR (THREAD_CONTEXT + 0x10C)
#if !defined(_MIPS_SIM) || _MIPS_SIM != _ABIN32
#define THREAD_FP0 (THREAD_CONTEXT + 0x110)
#define THREAD_FP2 (THREAD_CONTEXT + 0x118)
#define THREAD_FP4 (THREAD_CONTEXT + 0x120)
@@ -138,6 +146,40 @@ typedef struct __OSThreadTail {
#define THREAD_FP26 (THREAD_CONTEXT + 0x178)
#define THREAD_FP28 (THREAD_CONTEXT + 0x180)
#define THREAD_FP30 (THREAD_CONTEXT + 0x188)
#else
#define THREAD_FP0 (THREAD_CONTEXT + 0x110)
#define THREAD_FP1 (THREAD_CONTEXT + 0x118)
#define THREAD_FP2 (THREAD_CONTEXT + 0x120)
#define THREAD_FP3 (THREAD_CONTEXT + 0x128)
#define THREAD_FP4 (THREAD_CONTEXT + 0x130)
#define THREAD_FP5 (THREAD_CONTEXT + 0x138)
#define THREAD_FP6 (THREAD_CONTEXT + 0x140)
#define THREAD_FP7 (THREAD_CONTEXT + 0x148)
#define THREAD_FP8 (THREAD_CONTEXT + 0x150)
#define THREAD_FP9 (THREAD_CONTEXT + 0x158)
#define THREAD_FP10 (THREAD_CONTEXT + 0x160)
#define THREAD_FP11 (THREAD_CONTEXT + 0x168)
#define THREAD_FP12 (THREAD_CONTEXT + 0x170)
#define THREAD_FP13 (THREAD_CONTEXT + 0x178)
#define THREAD_FP14 (THREAD_CONTEXT + 0x180)
#define THREAD_FP15 (THREAD_CONTEXT + 0x188)
#define THREAD_FP16 (THREAD_CONTEXT + 0x190)
#define THREAD_FP17 (THREAD_CONTEXT + 0x198)
#define THREAD_FP18 (THREAD_CONTEXT + 0x1A0)
#define THREAD_FP19 (THREAD_CONTEXT + 0x1A8)
#define THREAD_FP20 (THREAD_CONTEXT + 0x1B0)
#define THREAD_FP21 (THREAD_CONTEXT + 0x1B8)
#define THREAD_FP22 (THREAD_CONTEXT + 0x1C0)
#define THREAD_FP23 (THREAD_CONTEXT + 0x1C8)
#define THREAD_FP24 (THREAD_CONTEXT + 0x1D0)
#define THREAD_FP25 (THREAD_CONTEXT + 0x1D8)
#define THREAD_FP26 (THREAD_CONTEXT + 0x1E0)
#define THREAD_FP27 (THREAD_CONTEXT + 0x1E8)
#define THREAD_FP28 (THREAD_CONTEXT + 0x1F0)
#define THREAD_FP29 (THREAD_CONTEXT + 0x1F8)
#define THREAD_FP30 (THREAD_CONTEXT + 0x200)
#define THREAD_FP31 (THREAD_CONTEXT + 0x208)
#endif
#endif

View File

@@ -4,7 +4,8 @@
#include "stdarg.h"
// IDO doesn't support long double types, improve portability for compilers supporting them
#ifdef __sgi
// Also make N32/N64 ABIs use double, TODO support long double in these ABIs (128-bit float)
#if defined(__sgi) || (defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32)
#define LONG_DOUBLE_TYPE double
#else
#define LONG_DOUBLE_TYPE long double