mozglue/build/mips.cpp
author Chris Peterson <cpeterson@mozilla.com>
Fri, 08 Jul 2016 14:39:53 -0700
changeset 304291 96875d7ae6f2f4cb0f56cd872eaae90345933563
parent 292998 6e11636c6aa2193cdf842e6fd00442e0342ce6f3
child 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1277775 - Replace MOZ_CONSTEXPR{_VAR,_TMPL} with constexpr. r=froydnj

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* compile-time and runtime tests for whether to use MIPS-specific extensions */

#include "mips.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum{
  MIPS_FLAG_LOONGSON3 = 1,
};

static unsigned
get_mips_cpu_flags(void)
{
  unsigned  flags = 0;
  FILE     *fin;

  fin = fopen("/proc/cpuinfo","r");
  if (fin != nullptr) {
    char buf[1024];
    memset(buf, 0, sizeof(buf));
    fread(buf, sizeof(char), sizeof(buf) - 1, fin);
    fclose(fin);
    if (strstr(buf, "Loongson-3"))
        flags |= MIPS_FLAG_LOONGSON3;
  }
  return flags;
}

static bool
check_loongson3(void)
{
  // Cache a local copy so we only have to read /proc/cpuinfo once.
  static unsigned mips_cpu_flags = get_mips_cpu_flags();
  return (mips_cpu_flags & MIPS_FLAG_LOONGSON3) != 0;
}

namespace mozilla {
  namespace mips_private {
    bool isLoongson3 = check_loongson3();
  } // namespace mips_private
} // namespace mozilla