Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: src/mips/assembler-mips.cc

Issue 12391055: Cleaned up CpuFeature scope handling. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed nits Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips/code-stubs-mips.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 29 matching lines...) Expand all
40 #include "mips/assembler-mips-inl.h" 40 #include "mips/assembler-mips-inl.h"
41 #include "serialize.h" 41 #include "serialize.h"
42 42
43 namespace v8 { 43 namespace v8 {
44 namespace internal { 44 namespace internal {
45 45
46 #ifdef DEBUG 46 #ifdef DEBUG
47 bool CpuFeatures::initialized_ = false; 47 bool CpuFeatures::initialized_ = false;
48 #endif 48 #endif
49 unsigned CpuFeatures::supported_ = 0; 49 unsigned CpuFeatures::supported_ = 0;
50 unsigned CpuFeatures::found_by_runtime_probing_ = 0; 50 unsigned CpuFeatures::found_by_runtime_probing_only_ = 0;
51 51
52 52
53 ExternalReference ExternalReference::cpu_features() { 53 ExternalReference ExternalReference::cpu_features() {
54 ASSERT(CpuFeatures::initialized_); 54 ASSERT(CpuFeatures::initialized_);
55 return ExternalReference(&CpuFeatures::supported_); 55 return ExternalReference(&CpuFeatures::supported_);
56 } 56 }
57 57
58 58
59 // Get the CPU features enabled by the build. For cross compilation the 59 // Get the CPU features enabled by the build. For cross compilation the
60 // preprocessor symbols CAN_USE_FPU_INSTRUCTIONS 60 // preprocessor symbols CAN_USE_FPU_INSTRUCTIONS
61 // can be defined to enable FPU instructions when building the 61 // can be defined to enable FPU instructions when building the
62 // snapshot. 62 // snapshot.
63 static uint64_t CpuFeaturesImpliedByCompiler() { 63 static uint64_t CpuFeaturesImpliedByCompiler() {
64 uint64_t answer = 0; 64 uint64_t answer = 0;
65 #ifdef CAN_USE_FPU_INSTRUCTIONS 65 #ifdef CAN_USE_FPU_INSTRUCTIONS
66 answer |= 1u << FPU; 66 answer |= static_cast<uint64_t>(1) << FPU;
67 #endif // def CAN_USE_FPU_INSTRUCTIONS 67 #endif // def CAN_USE_FPU_INSTRUCTIONS
68 68
69 #ifdef __mips__ 69 #ifdef __mips__
70 // If the compiler is allowed to use FPU then we can use FPU too in our code 70 // If the compiler is allowed to use FPU then we can use FPU too in our code
71 // generation even when generating snapshots. This won't work for cross 71 // generation even when generating snapshots. This won't work for cross
72 // compilation. 72 // compilation.
73 #if(defined(__mips_hard_float) && __mips_hard_float != 0) 73 #if(defined(__mips_hard_float) && __mips_hard_float != 0)
74 answer |= 1u << FPU; 74 answer |= static_cast<uint64_t>(1) << FPU;
75 #endif // defined(__mips_hard_float) && __mips_hard_float != 0 75 #endif // defined(__mips_hard_float) && __mips_hard_float != 0
76 #endif // def __mips__ 76 #endif // def __mips__
77 77
78 return answer; 78 return answer;
79 } 79 }
80 80
81 81
82 const char* DoubleRegister::AllocationIndexToString(int index) { 82 const char* DoubleRegister::AllocationIndexToString(int index) {
83 if (CpuFeatures::IsSupported(FPU)) { 83 if (CpuFeatures::IsSupported(FPU)) {
84 ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters); 84 ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 if (Serializer::enabled()) { 122 if (Serializer::enabled()) {
123 // No probing for features if we might serialize (generate snapshot). 123 // No probing for features if we might serialize (generate snapshot).
124 return; 124 return;
125 } 125 }
126 126
127 // If the compiler is allowed to use fpu then we can use fpu too in our 127 // If the compiler is allowed to use fpu then we can use fpu too in our
128 // code generation. 128 // code generation.
129 #if !defined(__mips__) 129 #if !defined(__mips__)
130 // For the simulator=mips build, use FPU when FLAG_enable_fpu is enabled. 130 // For the simulator=mips build, use FPU when FLAG_enable_fpu is enabled.
131 if (FLAG_enable_fpu) { 131 if (FLAG_enable_fpu) {
132 supported_ |= 1u << FPU; 132 supported_ |= static_cast<uint64_t>(1) << FPU;
133 } 133 }
134 #else 134 #else
135 // Probe for additional features not already known to be available. 135 // Probe for additional features not already known to be available.
136 if (OS::MipsCpuHasFeature(FPU)) { 136 if (OS::MipsCpuHasFeature(FPU)) {
137 // This implementation also sets the FPU flags if 137 // This implementation also sets the FPU flags if
138 // runtime detection of FPU returns true. 138 // runtime detection of FPU returns true.
139 supported_ |= 1u << FPU; 139 supported_ |= static_cast<uint64_t>(1) << FPU;
140 found_by_runtime_probing_ |= 1u << FPU; 140 found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << FPU;
141 } 141 }
142 #endif 142 #endif
143 } 143 }
144 144
145 145
146 int ToNumber(Register reg) { 146 int ToNumber(Register reg) {
147 ASSERT(reg.is_valid()); 147 ASSERT(reg.is_valid());
148 const int kNumbers[] = { 148 const int kNumbers[] = {
149 0, // zero_reg 149 0, // zero_reg
150 1, // at 150 1, // at
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 867 }
868 868
869 869
870 void Assembler::GenInstrRegister(Opcode opcode, 870 void Assembler::GenInstrRegister(Opcode opcode,
871 SecondaryField fmt, 871 SecondaryField fmt,
872 FPURegister ft, 872 FPURegister ft,
873 FPURegister fs, 873 FPURegister fs,
874 FPURegister fd, 874 FPURegister fd,
875 SecondaryField func) { 875 SecondaryField func) {
876 ASSERT(fd.is_valid() && fs.is_valid() && ft.is_valid()); 876 ASSERT(fd.is_valid() && fs.is_valid() && ft.is_valid());
877 ASSERT(CpuFeatures::IsEnabled(FPU)); 877 ASSERT(IsEnabled(FPU));
878 Instr instr = opcode | fmt | (ft.code() << kFtShift) | (fs.code() << kFsShift) 878 Instr instr = opcode | fmt | (ft.code() << kFtShift) | (fs.code() << kFsShift)
879 | (fd.code() << kFdShift) | func; 879 | (fd.code() << kFdShift) | func;
880 emit(instr); 880 emit(instr);
881 } 881 }
882 882
883 883
884 void Assembler::GenInstrRegister(Opcode opcode, 884 void Assembler::GenInstrRegister(Opcode opcode,
885 FPURegister fr, 885 FPURegister fr,
886 FPURegister ft, 886 FPURegister ft,
887 FPURegister fs, 887 FPURegister fs,
888 FPURegister fd, 888 FPURegister fd,
889 SecondaryField func) { 889 SecondaryField func) {
890 ASSERT(fd.is_valid() && fr.is_valid() && fs.is_valid() && ft.is_valid()); 890 ASSERT(fd.is_valid() && fr.is_valid() && fs.is_valid() && ft.is_valid());
891 ASSERT(CpuFeatures::IsEnabled(FPU)); 891 ASSERT(IsEnabled(FPU));
892 Instr instr = opcode | (fr.code() << kFrShift) | (ft.code() << kFtShift) 892 Instr instr = opcode | (fr.code() << kFrShift) | (ft.code() << kFtShift)
893 | (fs.code() << kFsShift) | (fd.code() << kFdShift) | func; 893 | (fs.code() << kFsShift) | (fd.code() << kFdShift) | func;
894 emit(instr); 894 emit(instr);
895 } 895 }
896 896
897 897
898 void Assembler::GenInstrRegister(Opcode opcode, 898 void Assembler::GenInstrRegister(Opcode opcode,
899 SecondaryField fmt, 899 SecondaryField fmt,
900 Register rt, 900 Register rt,
901 FPURegister fs, 901 FPURegister fs,
902 FPURegister fd, 902 FPURegister fd,
903 SecondaryField func) { 903 SecondaryField func) {
904 ASSERT(fd.is_valid() && fs.is_valid() && rt.is_valid()); 904 ASSERT(fd.is_valid() && fs.is_valid() && rt.is_valid());
905 ASSERT(CpuFeatures::IsEnabled(FPU)); 905 ASSERT(IsEnabled(FPU));
906 Instr instr = opcode | fmt | (rt.code() << kRtShift) 906 Instr instr = opcode | fmt | (rt.code() << kRtShift)
907 | (fs.code() << kFsShift) | (fd.code() << kFdShift) | func; 907 | (fs.code() << kFsShift) | (fd.code() << kFdShift) | func;
908 emit(instr); 908 emit(instr);
909 } 909 }
910 910
911 911
912 void Assembler::GenInstrRegister(Opcode opcode, 912 void Assembler::GenInstrRegister(Opcode opcode,
913 SecondaryField fmt, 913 SecondaryField fmt,
914 Register rt, 914 Register rt,
915 FPUControlRegister fs, 915 FPUControlRegister fs,
916 SecondaryField func) { 916 SecondaryField func) {
917 ASSERT(fs.is_valid() && rt.is_valid()); 917 ASSERT(fs.is_valid() && rt.is_valid());
918 ASSERT(CpuFeatures::IsEnabled(FPU)); 918 ASSERT(IsEnabled(FPU));
919 Instr instr = 919 Instr instr =
920 opcode | fmt | (rt.code() << kRtShift) | (fs.code() << kFsShift) | func; 920 opcode | fmt | (rt.code() << kRtShift) | (fs.code() << kFsShift) | func;
921 emit(instr); 921 emit(instr);
922 } 922 }
923 923
924 924
925 // Instructions with immediate value. 925 // Instructions with immediate value.
926 // Registers are in the order of the instruction encoding, from left to right. 926 // Registers are in the order of the instruction encoding, from left to right.
927 void Assembler::GenInstrImmediate(Opcode opcode, 927 void Assembler::GenInstrImmediate(Opcode opcode,
928 Register rs, 928 Register rs,
(...skipping 14 matching lines...) Expand all
943 Instr instr = opcode | (rs.code() << kRsShift) | SF | (j & kImm16Mask); 943 Instr instr = opcode | (rs.code() << kRsShift) | SF | (j & kImm16Mask);
944 emit(instr); 944 emit(instr);
945 } 945 }
946 946
947 947
948 void Assembler::GenInstrImmediate(Opcode opcode, 948 void Assembler::GenInstrImmediate(Opcode opcode,
949 Register rs, 949 Register rs,
950 FPURegister ft, 950 FPURegister ft,
951 int32_t j) { 951 int32_t j) {
952 ASSERT(rs.is_valid() && ft.is_valid() && (is_int16(j) || is_uint16(j))); 952 ASSERT(rs.is_valid() && ft.is_valid() && (is_int16(j) || is_uint16(j)));
953 ASSERT(CpuFeatures::IsEnabled(FPU)); 953 ASSERT(IsEnabled(FPU));
954 Instr instr = opcode | (rs.code() << kRsShift) | (ft.code() << kFtShift) 954 Instr instr = opcode | (rs.code() << kRsShift) | (ft.code() << kFtShift)
955 | (j & kImm16Mask); 955 | (j & kImm16Mask);
956 emit(instr); 956 emit(instr);
957 } 957 }
958 958
959 959
960 void Assembler::GenInstrJump(Opcode opcode, 960 void Assembler::GenInstrJump(Opcode opcode,
961 uint32_t address) { 961 uint32_t address) {
962 BlockTrampolinePoolScope block_trampoline_pool(this); 962 BlockTrampolinePoolScope block_trampoline_pool(this);
963 ASSERT(is_uint26(address)); 963 ASSERT(is_uint26(address));
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after
1865 1865
1866 1866
1867 void Assembler::cvt_d_s(FPURegister fd, FPURegister fs) { 1867 void Assembler::cvt_d_s(FPURegister fd, FPURegister fs) {
1868 GenInstrRegister(COP1, S, f0, fs, fd, CVT_D_S); 1868 GenInstrRegister(COP1, S, f0, fs, fd, CVT_D_S);
1869 } 1869 }
1870 1870
1871 1871
1872 // Conditions. 1872 // Conditions.
1873 void Assembler::c(FPUCondition cond, SecondaryField fmt, 1873 void Assembler::c(FPUCondition cond, SecondaryField fmt,
1874 FPURegister fs, FPURegister ft, uint16_t cc) { 1874 FPURegister fs, FPURegister ft, uint16_t cc) {
1875 ASSERT(CpuFeatures::IsEnabled(FPU)); 1875 ASSERT(IsEnabled(FPU));
1876 ASSERT(is_uint3(cc)); 1876 ASSERT(is_uint3(cc));
1877 ASSERT((fmt & ~(31 << kRsShift)) == 0); 1877 ASSERT((fmt & ~(31 << kRsShift)) == 0);
1878 Instr instr = COP1 | fmt | ft.code() << 16 | fs.code() << kFsShift 1878 Instr instr = COP1 | fmt | ft.code() << 16 | fs.code() << kFsShift
1879 | cc << 8 | 3 << 4 | cond; 1879 | cc << 8 | 3 << 4 | cond;
1880 emit(instr); 1880 emit(instr);
1881 } 1881 }
1882 1882
1883 1883
1884 void Assembler::fcmp(FPURegister src1, const double src2, 1884 void Assembler::fcmp(FPURegister src1, const double src2,
1885 FPUCondition cond) { 1885 FPUCondition cond) {
1886 ASSERT(CpuFeatures::IsEnabled(FPU)); 1886 ASSERT(IsEnabled(FPU));
1887 ASSERT(src2 == 0.0); 1887 ASSERT(src2 == 0.0);
1888 mtc1(zero_reg, f14); 1888 mtc1(zero_reg, f14);
1889 cvt_d_w(f14, f14); 1889 cvt_d_w(f14, f14);
1890 c(cond, D, src1, f14, 0); 1890 c(cond, D, src1, f14, 0);
1891 } 1891 }
1892 1892
1893 1893
1894 void Assembler::bc1f(int16_t offset, uint16_t cc) { 1894 void Assembler::bc1f(int16_t offset, uint16_t cc) {
1895 ASSERT(CpuFeatures::IsEnabled(FPU)); 1895 ASSERT(IsEnabled(FPU));
1896 ASSERT(is_uint3(cc)); 1896 ASSERT(is_uint3(cc));
1897 Instr instr = COP1 | BC1 | cc << 18 | 0 << 16 | (offset & kImm16Mask); 1897 Instr instr = COP1 | BC1 | cc << 18 | 0 << 16 | (offset & kImm16Mask);
1898 emit(instr); 1898 emit(instr);
1899 } 1899 }
1900 1900
1901 1901
1902 void Assembler::bc1t(int16_t offset, uint16_t cc) { 1902 void Assembler::bc1t(int16_t offset, uint16_t cc) {
1903 ASSERT(CpuFeatures::IsEnabled(FPU)); 1903 ASSERT(IsEnabled(FPU));
1904 ASSERT(is_uint3(cc)); 1904 ASSERT(is_uint3(cc));
1905 Instr instr = COP1 | BC1 | cc << 18 | 1 << 16 | (offset & kImm16Mask); 1905 Instr instr = COP1 | BC1 | cc << 18 | 1 << 16 | (offset & kImm16Mask);
1906 emit(instr); 1906 emit(instr);
1907 } 1907 }
1908 1908
1909 1909
1910 // Debugging. 1910 // Debugging.
1911 void Assembler::RecordJSReturn() { 1911 void Assembler::RecordJSReturn() {
1912 positions_recorder()->WriteRecordedPositions(); 1912 positions_recorder()->WriteRecordedPositions();
1913 CheckBuffer(); 1913 CheckBuffer();
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
2296 } 2296 }
2297 2297
2298 if (patched) { 2298 if (patched) {
2299 CPU::FlushICache(pc+2, sizeof(Address)); 2299 CPU::FlushICache(pc+2, sizeof(Address));
2300 } 2300 }
2301 } 2301 }
2302 2302
2303 } } // namespace v8::internal 2303 } } // namespace v8::internal
2304 2304
2305 #endif // V8_TARGET_ARCH_MIPS 2305 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips/code-stubs-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698