add back /proc/cpuinfo as a fallback for some platforms
diff --git a/src/sysinfo.cc b/src/sysinfo.cc
index 2787e87..4fb3261 100644
--- a/src/sysinfo.cc
+++ b/src/sysinfo.cc
@@ -508,6 +508,55 @@
     hardware_threads.max_hthreads = 1;
   }
   return hardware_threads.max_hthreads;
+#else
+  // Fallback for platforms (such as WASM) that aren't covered above.
+  int num_cpus = 0;
+  int max_id = -1;
+  std::ifstream f("/proc/cpuinfo");
+  if (!f.is_open()) {
+    std::cerr << "Failed to open /proc/cpuinfo\n";
+    return -1;
+  }
+#if defined(__alpha__)
+  const std::string Key = "cpus detected";
+#else
+  const std::string Key = "processor";
+#endif
+  std::string ln;
+  while (std::getline(f, ln)) {
+    if (ln.empty()) continue;
+    std::size_t split_idx = ln.find(':');
+    std::string value;
+#if defined(__s390__)
+    // s390 has another format in /proc/cpuinfo
+    // it needs to be parsed differently
+    if (split_idx != std::string::npos)
+      value = ln.substr(Key.size() + 1, split_idx - Key.size() - 1);
+#else
+    if (split_idx != std::string::npos) value = ln.substr(split_idx + 1);
+#endif
+    if (ln.size() >= Key.size() && ln.compare(0, Key.size(), Key) == 0) {
+      num_cpus++;
+      if (!value.empty()) {
+        const int cur_id = benchmark::stoi(value);
+        max_id = std::max(cur_id, max_id);
+      }
+    }
+  }
+  if (f.bad()) {
+    PrintErrorAndDie("Failure reading /proc/cpuinfo");
+  }
+  if (!f.eof()) {
+    PrintErrorAndDie("Failed to read to end of /proc/cpuinfo");
+  }
+  f.close();
+
+  if ((max_id + 1) != num_cpus) {
+    fprintf(stderr,
+            "CPU ID assignments in /proc/cpuinfo seem messed up."
+            " This is usually caused by a bad BIOS.\n");
+  }
+  return num_cpus;
 #endif
   BENCHMARK_UNREACHABLE();
 }
@@ -516,7 +565,7 @@
   int num_cpus = GetNumCPUsImpl();
   if (num_cpus < 1) {
     std::cerr << "Unable to extract number of CPUs.\n";
-    /* There is at least one CPU which we run on. */
+    // There must be at least one CPU on which we're running.
     num_cpus = 1;
   }
   return num_cpus;