From f2f8be496c8e34b4d909b688a95c6f8565201081 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Wed, 19 Jun 2019 14:30:44 +0800
Subject: [PATCH] fix compiling failure on mips64-n32 bsp

- Tweak mips64-n32 with mips32

- The toolchain of mips64-n32 supports both of macro
  `__mips64' and `__mips__', but 32bit is required here.

- N32 uses 64-bit registers but restricts addresses to 32 bits.
  https://www.linux-mips.org/pub/linux/mips/doc/ABI/MIPS-N32-ABI-Handbook.pdf
  Table 2-1 specifies the use of registers in n32 and native 64-bit mode.
  From the table, N32 and N64 have the same registers

Upstream-Status: Inappropriate [oe specific]

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
Signed-off-by: Mingli Yu <Mingli.Yu@windriver.com>
---
 build/moz.configure/init.configure                | 5 ++++-
 js/src/jit/mips-shared/Architecture-mips-shared.h | 4 +++-
 python/mozbuild/mozbuild/configure/constants.py   | 2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
index 648ac2d..d0bcaf8 100644
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -650,7 +650,10 @@ def split_triplet(triplet, allow_unknown=False):
         canonical_cpu = 'mips32'
         endianness = 'little' if 'el' in cpu else 'big'
     elif cpu in ('mips64', 'mips64el'):
-        canonical_cpu = 'mips64'
+        if 'n32' in triplet:
+            canonical_cpu = 'mips32'
+        else:
+            canonical_cpu = 'mips64'
         endianness = 'little' if 'el' in cpu else 'big'
     elif cpu.startswith('aarch64'):
         canonical_cpu = 'aarch64'
diff --git a/js/src/jit/mips-shared/Architecture-mips-shared.h b/js/src/jit/mips-shared/Architecture-mips-shared.h
index e95ffd4..caf83f7 100644
--- a/js/src/jit/mips-shared/Architecture-mips-shared.h
+++ b/js/src/jit/mips-shared/Architecture-mips-shared.h
@@ -28,6 +28,8 @@
 #elif (defined(_MIPS_SIM) && (_MIPS_SIM == _ABI64)) || \
     defined(JS_SIMULATOR_MIPS64)
 #define USES_N64_ABI
+#elif (defined(_MIPS_SIM) && (_MIPS_SIM == _ABIN32))
+#define USES_N32_ABI
 #else
 #error "Unsupported ABI"
 #endif
@@ -94,7 +96,7 @@ class Registers {
     ta1 = t5,
     ta2 = t6,
     ta3 = t7,
-#elif defined(USES_N64_ABI)
+#elif defined(USES_N64_ABI) || defined(USES_N32_ABI)
     a4 = r8,
     a5 = r9,
     a6 = r10,
diff --git a/python/mozbuild/mozbuild/configure/constants.py b/python/mozbuild/mozbuild/configure/constants.py
index 1067b6a..e0f0405 100644
--- a/python/mozbuild/mozbuild/configure/constants.py
+++ b/python/mozbuild/mozbuild/configure/constants.py
@@ -90,8 +90,8 @@ CPU_preprocessor_checks = OrderedDict((
     ('hppa', '__hppa__'),
     ('sparc64', '__sparc__ && __arch64__'),
     ('sparc', '__sparc__'),
-    ('mips64', '__mips64'),
     ('mips32', '__mips__'),
+    ('mips64', '__mips64'),
     ('sh4', '__sh__'),
 ))
 
-- 
2.7.4

