Index: nss/nss/coreconf/config.gypi
===================================================================
--- nss.orig/nss/coreconf/config.gypi
+++ nss/nss/coreconf/config.gypi
@@ -125,6 +125,7 @@
     'disable_fips%': 1,
     'mozpkix_only%': 0,
     'coverage%': 0,
+    'softfp_cflags%': '',
   },
   'target_defaults': {
     # Settings specific to targets should go here.
Index: nss/nss/lib/freebl/Makefile
===================================================================
--- nss.orig/nss/lib/freebl/Makefile
+++ nss/nss/lib/freebl/Makefile
@@ -781,8 +781,12 @@ $(OBJDIR)/$(PROG_PREFIX)intel-gcm-wrap$(
 endif
 
 ifeq ($(CPU_ARCH),arm)
-$(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a -mfpu=crypto-neon-fp-armv8
-$(OBJDIR)/$(PROG_PREFIX)gcm-arm32-neon$(OBJ_SUFFIX): CFLAGS += -mfpu=neon
+# When the compiler uses the softfloat ABI, we want to use the compatible softfp ABI when
+# enabling NEON for these objects.
+# Confusingly, __SOFTFP__ is the name of the define for the softfloat ABI, not for the softfp ABI.
+USES_SOFTFLOAT_ABI := $(shell $(CC) -o - -E -dM - $(CFLAGS) < /dev/null | grep __SOFTFP__ > /dev/null && echo 1)
+$(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a -mfpu=crypto-neon-fp-armv8$(if $(USES_SOFTFLOAT_ABI), -mfloat-abi=softfp)
+$(OBJDIR)/$(PROG_PREFIX)gcm-arm32-neon$(OBJ_SUFFIX): CFLAGS += -mfpu=neon$(if $(USES_SOFTFLOAT_ABI), -mfloat-abi=softfp)
 endif
 ifeq ($(CPU_ARCH),aarch64)
 $(OBJDIR)/$(PROG_PREFIX)aes-armv8$(OBJ_SUFFIX): CFLAGS += -march=armv8-a+crypto
Index: nss/nss/lib/freebl/aes-armv8.c
===================================================================
--- nss.orig/nss/lib/freebl/aes-armv8.c
+++ nss/nss/lib/freebl/aes-armv8.c
@@ -8,7 +8,7 @@
 #if ((defined(__clang__) ||                                         \
       (defined(__GNUC__) && defined(__GNUC_MINOR__) &&              \
        (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8)))) && \
-     (defined(__ARM_NEON) || defined(__ARM_NEON__)))
+     defined(IS_LITTLE_ENDIAN))
 
 #ifndef __ARM_FEATURE_CRYPTO
 #error "Compiler option is invalid"
Index: nss/nss/lib/freebl/freebl.gyp
===================================================================
--- nss.orig/nss/lib/freebl/freebl.gyp
+++ nss/nss/lib/freebl/freebl.gyp
@@ -126,10 +126,12 @@
         '<(DEPTH)/exports.gyp:nss_exports'
       ],
       'cflags': [
-        '-mfpu=neon'
+        '-mfpu=neon',
+        '<@(softfp_cflags)',
       ],
       'cflags_mozilla': [
-        '-mfpu=neon'
+        '-mfpu=neon',
+        '<@(softfp_cflags)',
       ]
     },
     {
@@ -179,11 +181,13 @@
         [ 'target_arch=="arm"', {
           'cflags': [
             '-march=armv8-a',
-            '-mfpu=crypto-neon-fp-armv8'
+            '-mfpu=crypto-neon-fp-armv8',
+            '<@(softfp_cflags)',
           ],
           'cflags_mozilla': [
             '-march=armv8-a',
-            '-mfpu=crypto-neon-fp-armv8'
+            '-mfpu=crypto-neon-fp-armv8',
+            '<@(softfp_cflags)',
           ],
         }, 'target_arch=="arm64" or target_arch=="aarch64"', {
           'cflags': [
@@ -533,6 +537,11 @@
       }, {
         'have_int128_support%': 0,
       }],
+      [ 'target_arch=="arm"', {
+        # When the compiler uses the softfloat ABI, we want to use the compatible softfp ABI when enabling NEON for these objects.
+        # Confusingly, __SOFTFP__ is the name of the define for the softfloat ABI, not for the softfp ABI.
+        'softfp_cflags': '<!(${CC:-cc} -o - -E -dM - ${CFLAGS} < /dev/null | grep __SOFTFP__ > /dev/null && echo -mfloat-abi=softfp || true)',
+      }],
     ],
   }
 }
Index: nss/nss/lib/freebl/gcm-arm32-neon.c
===================================================================
--- nss.orig/nss/lib/freebl/gcm-arm32-neon.c
+++ nss/nss/lib/freebl/gcm-arm32-neon.c
@@ -11,7 +11,7 @@
 #include "secerr.h"
 #include "prtypes.h"
 
-#if defined(__ARM_NEON__) || defined(__ARM_NEON)
+#if defined(IS_LITTLE_ENDIAN)
 
 #include <arm_neon.h>
 
@@ -199,4 +199,4 @@ gcm_HashZeroX_hw(gcmHashContext *ghash)
     return SECSuccess;
 }
 
-#endif /* __ARM_NEON__ || __ARM_NEON */
+#endif /* IS_LITTLE_ENDIAN */
Index: nss/nss/lib/freebl/gcm.c
===================================================================
--- nss.orig/nss/lib/freebl/gcm.c
+++ nss/nss/lib/freebl/gcm.c
@@ -21,11 +21,8 @@
 #if defined(__aarch64__) && defined(IS_LITTLE_ENDIAN) && \
     (defined(__clang__) || defined(__GNUC__) && __GNUC__ > 6)
 #define USE_ARM_GCM
-#elif defined(__arm__) && defined(IS_LITTLE_ENDIAN) && \
-    (defined(__ARM_NEON__) || defined(__ARM_NEON))
-/* We don't test on big endian platform, so disable this on big endian.
- * Also, we don't check whether compiler support NEON well, so this uses
- * that compiler uses -mfpu=neon only. */
+#elif defined(__arm__) && defined(IS_LITTLE_ENDIAN)
+/* We don't test on big endian platform, so disable this on big endian. */
 #define USE_ARM_GCM
 #endif
 
Index: nss/nss/lib/freebl/rijndael.c
===================================================================
--- nss.orig/nss/lib/freebl/rijndael.c
+++ nss/nss/lib/freebl/rijndael.c
@@ -20,8 +20,7 @@
 #include "gcm.h"
 #include "mpi.h"
 
-#if (!defined(IS_LITTLE_ENDIAN) && !defined(NSS_X86_OR_X64)) || \
-    (defined(__arm__) && !defined(__ARM_NEON) && !defined(__ARM_NEON__))
+#if !defined(IS_LITTLE_ENDIAN) && !defined(NSS_X86_OR_X64)
 // not test yet on big endian platform of arm
 #undef USE_HW_AES
 #endif
