diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/steps.py b/Tools/BuildSlaveSupport/build.webkit.org-config/steps.py
index c27d262..a605af2 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/steps.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/steps.py
@@ -331,6 +331,10 @@
 
     def start(self):
         platform = self.getProperty('platform')
+        architecture = self.getProperty("architecture")
+        # Currently run-javascriptcore-test doesn't support run those binaries remotely
+        if architecture in ['mips', 'armv7', 'aarch64']:
+            self.command += ['--no-testmasm', '--no-testair', '--no-testb3', '--no-testdfg', '--no-testapi']
         # Linux bots have currently problems with JSC tests that try to use large amounts of memory.
         # Check: https://bugs.webkit.org/show_bug.cgi?id=175140
         if platform in ('gtk', 'wpe'):
@@ -344,16 +348,21 @@
 
     def countFailures(self, cmd):
         logText = cmd.logs['stdio'].getText()
+        count = 0
 
         match = re.search(r'^Results for JSC stress tests:\r?\n\s+(\d+) failure', logText, re.MULTILINE)
         if match:
-            return int(match.group(1))
+            count += int(match.group(1))
+
+        match = re.search(r'Results for JSC test binaries:\r?\n\s+(\d+) failure', logText, re.MULTILINE)
+        if match:
+            count += int(match.group(1))
 
         match = re.search(r'^Results for Mozilla tests:\r?\n\s+(\d+) regression', logText, re.MULTILINE)
         if match:
-            return int(match.group(1))
+            count += int(match.group(1))
 
-        return 0
+        return count
 
 
 class RunRemoteJavaScriptCoreTests(RunJavaScriptCoreTests):
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/steps_unittest.py b/Tools/BuildSlaveSupport/build.webkit.org-config/steps_unittest.py
index 4f875d3..65315bd 100755
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/steps_unittest.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/steps_unittest.py
@@ -122,6 +122,18 @@
         self.assertResults(FAILURE, ["5 JSC tests failed"], 1,  """Results for JSC stress tests:
     5 failures found.""")
 
+    def test_jsc_stress_failures_with_binary_results_output(self):
+        self.assertResults(FAILURE, ["8 JSC tests failed"], 1,  """Results for JSC stress tests:
+    5 failures found.
+Results for JSC test binaries:
+    3 failures found.""")
+
+    def test_jsc_stress_failures_with_binary_result_output(self):
+        self.assertResults(FAILURE, ["6 JSC tests failed"], 1,  """Results for JSC stress tests:
+    5 failures found.
+Results for JSC test binaries:
+    1 failure found.""")
+
 
 class RunTest262TestsTest(unittest.TestCase):
     def assertResults(self, expected_result, expected_text, rc, stdio):
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index dfa3d67..96071b4 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,19 @@
+2019-07-12  Zhifei Fang  <zhifei_fang@apple.com>
+
+        run-javascriptcore-tests won't report test results for testmasm, testair, testb3, testdfg and test api
+        https://bugs.webkit.org/show_bug.cgi?id=199489
+        <rdar://problem/47891081>
+
+        Reviewed by Aakash Jain.
+
+        * BuildSlaveSupport/build.webkit.org-config/steps.py:
+        (RunJavaScriptCoreTests.countFailures):
+        * BuildSlaveSupport/build.webkit.org-config/steps_unittest.py:
+        * Scripts/run-javascriptcore-tests:
+        (runTest):
+        (reportTestFailures):
+        (runJSCStressTests):
+
 2019-07-12  Aakash Jain  <aakash_jain@apple.com>
 
         [ews-build] Make layout-tests' full_results.json accessible in Buildbot
diff --git a/Tools/Scripts/run-javascriptcore-tests b/Tools/Scripts/run-javascriptcore-tests
index cfe61a2..6f63d1a 100755
--- a/Tools/Scripts/run-javascriptcore-tests
+++ b/Tools/Scripts/run-javascriptcore-tests
@@ -92,6 +92,8 @@
 my $remoteHost = 0;
 my $failFast = 1;
 my %jsonData = ();
+my @testResults = ();
+my $isTestFailed = 0;
 my $remoteConfigFile;
 my $jsonFileName;
 my $verbose = 0;
@@ -398,17 +400,39 @@
     my $exitStatus = exitStatus($testResult);
     print "$testName completed with rc=$testResult ($exitStatus)\n\n";
 
+    my $testStatus = ($exitStatus == 0)? JSON::PP::true: JSON::PP::false;
+    if ($testResult) {
+        $isTestFailed = 1;
+        push @testResults, $testName;
+    }
     if (defined($jsonFileName)) {
-        my $testStatus = ($exitStatus == 0)? JSON::PP::true: JSON::PP::false;
         $jsonData{$jsonTestStatusName} = $testStatus;
     }
 
     if ($testResult && $failFast) {
+        reportTestFailures();
         writeJsonDataIfApplicable();
         exit exitStatus($testResult);
     }
 }
 
+sub reportTestFailures {
+  my $numJSCtestFailures = @testResults;
+  if ($numJSCtestFailures) {
+      print "\n** The following JSC test binaries failures have been introduced:\n";
+      foreach my $testFailure (@testResults) {
+          print "\t$testFailure\n";
+      }
+  }
+  print "\n";
+
+  print "Results for JSC test binaries:\n";
+  printThingsFound($numJSCtestFailures, "failure", "failures", "found");
+  print "    OK.\n" if $numJSCtestFailures == 0;
+
+  print "\n";
+}
+
 if ($runTestMasm) { runTest("testmasm", "allMasmTestsPassed") }
 if ($runTestAir) { runTest("testair", "allAirTestsPassed") }
 if ($runTestB3) { runTest("testb3", "allB3TestsPassed") }
@@ -420,6 +444,11 @@
 chdirWebKit();
 
 runJSCStressTests();
+reportTestFailures();
+
+if ($isTestFailed) {
+  exit(1);
+}
 
 sub runJSCStressTests
 {
@@ -573,6 +602,7 @@
     my $numJSCStressFailures = @jscStressFailList;
 
     if ($numJSCStressFailures) {
+        $isTestFailed = 1;
         print "\n** The following JSC stress test failures have been introduced:\n";
         foreach my $testFailure (@jscStressFailList) {
             print "\t$testFailure\n";
@@ -591,7 +621,6 @@
     }
 
     writeJsonDataIfApplicable();
-    exit(1) if $numJSCStressFailures;
 }
 
 sub readAllLines
