Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 | 80 |
| 81 void OS::Setup() { | 81 void OS::Setup() { |
| 82 // Seed the random number generator. | 82 // Seed the random number generator. |
| 83 // Convert the current time to a 64-bit integer first, before converting it | 83 // Convert the current time to a 64-bit integer first, before converting it |
| 84 // to an unsigned. Going directly can cause an overflow and the seed to be | 84 // to an unsigned. Going directly can cause an overflow and the seed to be |
| 85 // set to all ones. The seed will be identical for different instances that | 85 // set to all ones. The seed will be identical for different instances that |
| 86 // call this setup code within the same millisecond. | 86 // call this setup code within the same millisecond. |
| 87 uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis()); | 87 uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis()); |
| 88 srandom(static_cast<unsigned int>(seed)); | 88 srandom(static_cast<unsigned int>(seed)); |
| 89 limit_mutex = CreateMutex(); | 89 limit_mutex = CreateMutex(); |
| 90 | |
| 91 #ifdef __arm__ | |
| 92 // When running on ARM hardware check that the EABI used by V8 and | |
| 93 // by the C code is the same. | |
| 94 bool hard_float = OS::ArmUsingHardFloat(); | |
| 95 if (hard_float) { | |
| 96 #if !USE_EABI_HARDFLOAT | |
| 97 PrintF("ERROR: Binary compiled with -mfloat-abi=hard but without " | |
| 98 "-DUSE_EABI_HARDFLOAT\n"); | |
| 99 exit(1); | |
| 100 #endif | |
| 101 } else { | |
| 102 #if USE_EABI_HARDFLOAT | |
| 103 PrintF("ERROR: Binary not compiled with -mfloat-abi=hard but with " | |
| 104 "-DUSE_EABI_HARDFLOAT\n"); | |
| 105 exit(1); | |
| 106 #endif | |
| 107 } | |
| 108 #endif | |
| 90 } | 109 } |
| 91 | 110 |
| 92 | 111 |
| 93 uint64_t OS::CpuFeaturesImpliedByPlatform() { | 112 uint64_t OS::CpuFeaturesImpliedByPlatform() { |
| 94 #if (defined(__VFP_FP__) && !defined(__SOFTFP__)) | 113 #if (defined(__VFP_FP__) && !defined(__SOFTFP__)) |
| 95 // Here gcc is telling us that we are on an ARM and gcc is assuming | 114 // Here gcc is telling us that we are on an ARM and gcc is assuming |
| 96 // that we have VFP3 instructions. If gcc can assume it then so can | 115 // that we have VFP3 instructions. If gcc can assume it then so can |
| 97 // we. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6. | 116 // we. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6. |
| 98 return 1u << VFP3 | 1u << ARMv7; | 117 return 1u << VFP3 | 1u << ARMv7; |
| 99 #elif CAN_USE_ARMV7_INSTRUCTIONS | 118 #elif CAN_USE_ARMV7_INSTRUCTIONS |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 what = search_string; | 154 what = search_string; |
| 136 } | 155 } |
| 137 } | 156 } |
| 138 } | 157 } |
| 139 fclose(f); | 158 fclose(f); |
| 140 | 159 |
| 141 // Did not find string in the proc file. | 160 // Did not find string in the proc file. |
| 142 return false; | 161 return false; |
| 143 } | 162 } |
| 144 | 163 |
| 164 | |
| 145 bool OS::ArmCpuHasFeature(CpuFeature feature) { | 165 bool OS::ArmCpuHasFeature(CpuFeature feature) { |
| 146 const char* search_string = NULL; | 166 const char* search_string = NULL; |
| 147 // Simple detection of VFP at runtime for Linux. | 167 // Simple detection of VFP at runtime for Linux. |
| 148 // It is based on /proc/cpuinfo, which reveals hardware configuration | 168 // It is based on /proc/cpuinfo, which reveals hardware configuration |
| 149 // to user-space applications. According to ARM (mid 2009), no similar | 169 // to user-space applications. According to ARM (mid 2009), no similar |
| 150 // facility is universally available on the ARM architectures, | 170 // facility is universally available on the ARM architectures, |
| 151 // so it's up to individual OSes to provide such. | 171 // so it's up to individual OSes to provide such. |
| 152 switch (feature) { | 172 switch (feature) { |
| 153 case VFP3: | 173 case VFP3: |
| 154 search_string = "vfpv3"; | 174 search_string = "vfpv3"; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 170 // available on architectures with vfpv3. | 190 // available on architectures with vfpv3. |
| 171 // Checking neon on its own is not enough as it is possible to have neon | 191 // Checking neon on its own is not enough as it is possible to have neon |
| 172 // without vfp. | 192 // without vfp. |
| 173 if (CPUInfoContainsString("vfp") && CPUInfoContainsString("neon")) { | 193 if (CPUInfoContainsString("vfp") && CPUInfoContainsString("neon")) { |
| 174 return true; | 194 return true; |
| 175 } | 195 } |
| 176 } | 196 } |
| 177 | 197 |
| 178 return false; | 198 return false; |
| 179 } | 199 } |
| 200 | |
| 201 | |
| 202 // Simple helper function to detect whether the C code is compiler with | |
|
Karl Klose
2011/04/29 06:25:46
compiler -> compiled
Søren Thygesen Gjesse
2011/04/29 06:55:13
Done.
| |
| 203 // option -mfloat-abi=hard. The register d0 is loaded with 1.0 and the register | |
| 204 // pair r0, r1 is loaded with 0.0. If -mfloat-abi=hard is pased to GCC then | |
| 205 // calling this will return 1.0 and otherwise 0.0. | |
| 206 static void ArmUsingHardFloatHelper() { | |
| 207 asm("mov r0, #0"); | |
| 208 asm("mov r1, #0"); | |
| 209 asm("movt r1, #16368"); | |
| 210 asm("vmov d0, r0, r1"); | |
| 211 asm("mov r0, #0"); | |
| 212 asm("mov r1, #0"); | |
| 213 } | |
| 214 | |
| 215 | |
| 216 bool OS::ArmUsingHardFloat() { | |
| 217 // Cast helper function from returning void to returning double. | |
| 218 typedef double (*F)(); | |
| 219 F f = FUNCTION_CAST<F>(FUNCTION_ADDR(ArmUsingHardFloatHelper)); | |
| 220 return f() == 1.0; | |
| 221 } | |
| 180 #endif // def __arm__ | 222 #endif // def __arm__ |
| 181 | 223 |
| 182 | 224 |
| 183 #ifdef __mips__ | 225 #ifdef __mips__ |
| 184 bool OS::MipsCpuHasFeature(CpuFeature feature) { | 226 bool OS::MipsCpuHasFeature(CpuFeature feature) { |
| 185 const char* search_string = NULL; | 227 const char* search_string = NULL; |
| 186 const char* file_name = "/proc/cpuinfo"; | 228 const char* file_name = "/proc/cpuinfo"; |
| 187 // Simple detection of FPU at runtime for Linux. | 229 // Simple detection of FPU at runtime for Linux. |
| 188 // It is based on /proc/cpuinfo, which reveals hardware configuration | 230 // It is based on /proc/cpuinfo, which reveals hardware configuration |
| 189 // to user-space applications. According to MIPS (early 2010), no similar | 231 // to user-space applications. According to MIPS (early 2010), no similar |
| (...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 | 1125 |
| 1084 void Sampler::Stop() { | 1126 void Sampler::Stop() { |
| 1085 ASSERT(IsActive()); | 1127 ASSERT(IsActive()); |
| 1086 SignalSender::RemoveActiveSampler(this); | 1128 SignalSender::RemoveActiveSampler(this); |
| 1087 SetActive(false); | 1129 SetActive(false); |
| 1088 } | 1130 } |
| 1089 | 1131 |
| 1090 #endif // ENABLE_LOGGING_AND_PROFILING | 1132 #endif // ENABLE_LOGGING_AND_PROFILING |
| 1091 | 1133 |
| 1092 } } // namespace v8::internal | 1134 } } // namespace v8::internal |
| OLD | NEW |