MIPS: Improve runtime detection and compatibility wrt arch. revisions.

TEST=
BUG=
R=jkummerow@chromium.org, paul.lind@imgtec.com

Review URL: https://codereview.chromium.org/618193005

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24486 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent d143beb6
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
'cflags': ['-mfp32'], 'cflags': ['-mfp32'],
}], }],
['mips_arch_variant=="r6"', { ['mips_arch_variant=="r6"', {
'cflags!': ['-mfp32'], 'cflags!': ['-mfp32', '-mfpxx'],
'cflags': ['-mips32r6', '-Wa,-mips32r6'], 'cflags': ['-mips32r6', '-Wa,-mips32r6'],
'ldflags': [ 'ldflags': [
'-mips32r6', '-mips32r6',
...@@ -312,14 +312,17 @@ ...@@ -312,14 +312,17 @@
}], }],
['mips_arch_variant=="r2"', { ['mips_arch_variant=="r2"', {
'cflags': ['-mips32r2', '-Wa,-mips32r2'], 'cflags': ['-mips32r2', '-Wa,-mips32r2'],
'ldflags': ['-mips32r2'],
}], }],
['mips_arch_variant=="r1"', { ['mips_arch_variant=="r1"', {
'cflags!': ['-mfp64'], 'cflags!': ['-mfp64', '-mfpxx'],
'cflags': ['-mips32', '-Wa,-mips32'], 'cflags': ['-mips32', '-Wa,-mips32'],
'ldflags': ['-mips32'],
}], }],
['mips_arch_variant=="rx"', { ['mips_arch_variant=="rx"', {
'cflags!': ['-mfp64'], 'cflags!': ['-mfp64', '-mfp32'],
'cflags': ['-mips32', '-Wa,-mips32'], 'cflags': ['-mips32', '-Wa,-mips32', '-mfpxx'],
'ldflags': ['-mips32'],
}], }],
], ],
}], }],
...@@ -400,7 +403,7 @@ ...@@ -400,7 +403,7 @@
'cflags': ['-mfp32'], 'cflags': ['-mfp32'],
}], }],
['mips_arch_variant=="r6"', { ['mips_arch_variant=="r6"', {
'cflags!': ['-mfp32'], 'cflags!': ['-mfp32', '-mfpxx'],
'cflags': ['-mips32r6', '-Wa,-mips32r6'], 'cflags': ['-mips32r6', '-Wa,-mips32r6'],
'ldflags': [ 'ldflags': [
'-mips32r6', '-mips32r6',
...@@ -410,17 +413,20 @@ ...@@ -410,17 +413,20 @@
}], }],
['mips_arch_variant=="r2"', { ['mips_arch_variant=="r2"', {
'cflags': ['-mips32r2', '-Wa,-mips32r2'], 'cflags': ['-mips32r2', '-Wa,-mips32r2'],
'ldflags': ['-mips32r2'],
}], }],
['mips_arch_variant=="r1"', { ['mips_arch_variant=="r1"', {
'cflags!': ['-mfp64'], 'cflags!': ['-mfp64', '-mfpxx'],
'cflags': ['-mips32', '-Wa,-mips32'], 'cflags': ['-mips32', '-Wa,-mips32'],
'ldflags': ['-mips32'],
}], }],
['mips_arch_variant=="rx"', { ['mips_arch_variant=="rx"', {
'cflags!': ['-mfp64'], 'cflags!': ['-mfp64', '-mfp32'],
'cflags': ['-mips32', '-Wa,-mips32'], 'cflags': ['-mips32', '-Wa,-mips32', '-mfpxx'],
'ldflags': ['-mips32'],
}], }],
['mips_arch_variant=="loongson"', { ['mips_arch_variant=="loongson"', {
'cflags!': ['-mfp64'], 'cflags!': ['-mfp64', '-mfp32', '-mfpxx'],
'cflags': ['-mips3', '-Wa,-mips3'], 'cflags': ['-mips3', '-Wa,-mips3'],
}], }],
], ],
......
...@@ -121,13 +121,18 @@ static uint32_t ReadELFHWCaps() { ...@@ -121,13 +121,18 @@ static uint32_t ReadELFHWCaps() {
int __detect_fp64_mode(void) { int __detect_fp64_mode(void) {
double result = 0; double result = 0;
// Bit representation of (double)1 is 0x3FF0000000000000. // Bit representation of (double)1 is 0x3FF0000000000000.
asm( __asm__ volatile(
"lui $t0, 0x3FF0\n\t" ".set push\n\t"
"ldc1 $f0, %0\n\t" ".set noreorder\n\t"
"mtc1 $t0, $f1\n\t" ".set oddspreg\n\t"
"sdc1 $f0, %0\n\t" "lui $t0, 0x3FF0\n\t"
: "+m" (result) "ldc1 $f0, %0\n\t"
: : "t0", "$f0", "$f1", "memory"); "mtc1 $t0, $f1\n\t"
"sdc1 $f0, %0\n\t"
".set pop\n\t"
: "+m"(result)
:
: "t0", "$f0", "$f1", "memory");
return !(result == 1); return !(result == 1);
} }
...@@ -135,9 +140,22 @@ int __detect_fp64_mode(void) { ...@@ -135,9 +140,22 @@ int __detect_fp64_mode(void) {
int __detect_mips_arch_revision(void) { int __detect_mips_arch_revision(void) {
// TODO(dusmil): Do the specific syscall as soon as it is implemented in mips // TODO(dusmil): Do the specific syscall as soon as it is implemented in mips
// kernel. Currently fail-back to the least common denominator which is // kernel.
// mips32 revision 1. uint32_t result = 0;
return 1; __asm__ volatile(
"move $v0, $zero\n\t"
// Encoding for "addi $v0, $v0, 1" on non-r6,
// which is encoding for "bovc $v0, %v0, 1" on r6.
// Use machine code directly to avoid compilation errors with different
// toolchains and maintain compatibility.
".word 0x20420001\n\t"
"sw $v0, %0\n\t"
: "=m"(result)
:
: "v0", "memory");
// Result is 0 on r6 architectures, 1 on other architecture revisions.
// Fall-back to the least common denominator which is mips32 revision 1.
return result ? 1 : 6;
} }
#endif #endif
......
...@@ -105,7 +105,7 @@ const uint32_t kHoleNanLower32Offset = 4; ...@@ -105,7 +105,7 @@ const uint32_t kHoleNanLower32Offset = 4;
(kArchVariant == check) (kArchVariant == check)
#else #else
#define IsMipsArchVariant(check) \ #define IsMipsArchVariant(check) \
(CpuFeatures::IsSupported(check)) (CpuFeatures::IsSupported(static_cast<CpuFeature>(check)))
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment