Changeset 87364 in webkit
- Timestamp:
- May 25, 2011 11:58:55 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r87359 r87364 1 2011-05-25 Gavin Barraclough <barraclough@apple.com> 2 3 Reviewed by Sam Weinig. 4 5 https://bugs.webkit.org/show_bug.cgi?id=61506 6 7 Move the silent spill/fill methods in the DFG JIT to the JITCodeGenerator 8 so that they are available to the SpeculativeJIT. 9 10 * dfg/DFGJITCodeGenerator.h: 11 (JSC::DFG::JITCodeGenerator::silentSpillGPR): 12 (JSC::DFG::JITCodeGenerator::silentSpillFPR): 13 (JSC::DFG::JITCodeGenerator::silentFillGPR): 14 (JSC::DFG::JITCodeGenerator::silentFillFPR): 15 (JSC::DFG::JITCodeGenerator::silentSpillAllRegisters): 16 (JSC::DFG::JITCodeGenerator::silentFillAllRegisters): 17 * dfg/DFGNonSpeculativeJIT.h: 18 1 19 2011-05-25 Ryosuke Niwa <rniwa@webkit.org> 2 20 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h
r85271 r87364 154 154 } 155 155 156 // These methods are used when generating 'unexpected' 157 // calls out from JIT code to C++ helper routines - 158 // they spill all live values to the appropriate 159 // slots in the RegisterFile without changing any state 160 // in the GenerationInfo. 161 void silentSpillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg) 162 { 163 GenerationInfo& info = m_generationInfo[spillMe]; 164 ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble); 165 166 if (!info.needsSpill() || (info.gpr() == exclude)) 167 return; 168 169 DataFormat registerFormat = info.registerFormat(); 170 171 if (registerFormat == DataFormatInteger) { 172 m_jit.orPtr(GPRInfo::tagTypeNumberRegister, info.gpr()); 173 m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe)); 174 } else { 175 ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell); 176 m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe)); 177 } 178 } 179 void silentSpillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg) 180 { 181 GenerationInfo& info = m_generationInfo[spillMe]; 182 ASSERT(info.registerFormat() == DataFormatDouble); 183 184 if (!info.needsSpill() || (info.fpr() == exclude)) 185 return; 186 187 boxDouble(info.fpr(), canTrample); 188 m_jit.storePtr(canTrample, JITCompiler::addressFor(spillMe)); 189 } 190 191 void silentFillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg) 192 { 193 GenerationInfo& info = m_generationInfo[spillMe]; 194 if (info.gpr() == exclude) 195 return; 196 197 NodeIndex nodeIndex = info.nodeIndex(); 198 Node& node = m_jit.graph()[nodeIndex]; 199 ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble); 200 DataFormat registerFormat = info.registerFormat(); 201 202 if (registerFormat == DataFormatInteger) { 203 if (node.isConstant()) { 204 ASSERT(isInt32Constant(nodeIndex)); 205 m_jit.move(Imm32(valueOfInt32Constant(nodeIndex)), info.gpr()); 206 } else 207 m_jit.load32(JITCompiler::addressFor(spillMe), info.gpr()); 208 return; 209 } 210 211 if (node.isConstant()) 212 m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr()); 213 else { 214 ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell); 215 m_jit.loadPtr(JITCompiler::addressFor(spillMe), info.gpr()); 216 } 217 } 218 void silentFillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg) 219 { 220 GenerationInfo& info = m_generationInfo[spillMe]; 221 if (info.fpr() == exclude) 222 return; 223 224 NodeIndex nodeIndex = info.nodeIndex(); 225 Node& node = m_jit.graph()[nodeIndex]; 226 ASSERT(info.registerFormat() == DataFormatDouble); 227 228 if (node.isConstant()) 229 m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr()); 230 else { 231 m_jit.loadPtr(JITCompiler::addressFor(spillMe), canTrample); 232 unboxDouble(canTrample, info.fpr()); 233 } 234 } 235 236 void silentSpillAllRegisters(GPRReg exclude, GPRReg preserve = InvalidGPRReg) 237 { 238 GPRReg canTrample = GPRInfo::regT0; 239 if (preserve == GPRInfo::regT0) 240 canTrample = GPRInfo::regT1; 241 242 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) { 243 if (iter.name() != InvalidVirtualRegister) 244 silentSpillGPR(iter.name(), exclude); 245 } 246 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) { 247 if (iter.name() != InvalidVirtualRegister) 248 silentSpillFPR(iter.name(), canTrample); 249 } 250 } 251 void silentSpillAllRegisters(FPRReg exclude, GPRReg preserve = InvalidGPRReg) 252 { 253 GPRReg canTrample = GPRInfo::regT0; 254 if (preserve == GPRInfo::regT0) 255 canTrample = GPRInfo::regT1; 256 257 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) { 258 if (iter.name() != InvalidVirtualRegister) 259 silentSpillGPR(iter.name()); 260 } 261 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) { 262 if (iter.name() != InvalidVirtualRegister) 263 silentSpillFPR(iter.name(), canTrample, exclude); 264 } 265 } 266 void silentFillAllRegisters(GPRReg exclude) 267 { 268 GPRReg canTrample = GPRInfo::regT0; 269 if (exclude == GPRInfo::regT0) 270 canTrample = GPRInfo::regT1; 271 272 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) { 273 if (iter.name() != InvalidVirtualRegister) 274 silentFillFPR(iter.name(), canTrample); 275 } 276 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) { 277 if (iter.name() != InvalidVirtualRegister) 278 silentFillGPR(iter.name(), exclude); 279 } 280 } 281 void silentFillAllRegisters(FPRReg exclude) 282 { 283 GPRReg canTrample = GPRInfo::regT0; 284 285 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) { 286 if (iter.name() != InvalidVirtualRegister) { 287 ASSERT_UNUSED(exclude, iter.regID() != exclude); 288 silentFillFPR(iter.name(), canTrample, exclude); 289 } 290 } 291 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) { 292 if (iter.name() != InvalidVirtualRegister) 293 silentFillGPR(iter.name()); 294 } 295 } 296 156 297 // These methods convert between doubles, and doubles boxed and JSValues. 157 298 GPRReg boxDouble(FPRReg fpr, GPRReg gpr) -
trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h
r85271 r87364 86 86 bool isKnownNumeric(NodeIndex); 87 87 88 // These methods are used when generating 'unexpected'89 // calls out from JIT code to C++ helper routines -90 // they spill all live values to the appropriate91 // slots in the RegisterFile without changing any state92 // in the GenerationInfo.93 void silentSpillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)94 {95 GenerationInfo& info = m_generationInfo[spillMe];96 ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);97 98 if (!info.needsSpill() || (info.gpr() == exclude))99 return;100 101 DataFormat registerFormat = info.registerFormat();102 103 if (registerFormat == DataFormatInteger) {104 m_jit.orPtr(GPRInfo::tagTypeNumberRegister, info.gpr());105 m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));106 } else {107 ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);108 m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));109 }110 }111 void silentSpillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)112 {113 GenerationInfo& info = m_generationInfo[spillMe];114 ASSERT(info.registerFormat() == DataFormatDouble);115 116 if (!info.needsSpill() || (info.fpr() == exclude))117 return;118 119 boxDouble(info.fpr(), canTrample);120 m_jit.storePtr(canTrample, JITCompiler::addressFor(spillMe));121 }122 123 void silentFillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)124 {125 GenerationInfo& info = m_generationInfo[spillMe];126 if (info.gpr() == exclude)127 return;128 129 NodeIndex nodeIndex = info.nodeIndex();130 Node& node = m_jit.graph()[nodeIndex];131 ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);132 DataFormat registerFormat = info.registerFormat();133 134 if (registerFormat == DataFormatInteger) {135 if (node.isConstant()) {136 ASSERT(isInt32Constant(nodeIndex));137 m_jit.move(Imm32(valueOfInt32Constant(nodeIndex)), info.gpr());138 } else139 m_jit.load32(JITCompiler::addressFor(spillMe), info.gpr());140 return;141 }142 143 if (node.isConstant())144 m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());145 else {146 ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);147 m_jit.loadPtr(JITCompiler::addressFor(spillMe), info.gpr());148 }149 }150 void silentFillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)151 {152 GenerationInfo& info = m_generationInfo[spillMe];153 if (info.fpr() == exclude)154 return;155 156 NodeIndex nodeIndex = info.nodeIndex();157 Node& node = m_jit.graph()[nodeIndex];158 ASSERT(info.registerFormat() == DataFormatDouble);159 160 if (node.isConstant())161 m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());162 else {163 m_jit.loadPtr(JITCompiler::addressFor(spillMe), canTrample);164 unboxDouble(canTrample, info.fpr());165 }166 }167 168 void silentSpillAllRegisters(GPRReg exclude, GPRReg preserve = InvalidGPRReg)169 {170 GPRReg canTrample = GPRInfo::regT0;171 if (preserve == GPRInfo::regT0)172 canTrample = GPRInfo::regT1;173 174 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {175 if (iter.name() != InvalidVirtualRegister)176 silentSpillGPR(iter.name(), exclude);177 }178 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {179 if (iter.name() != InvalidVirtualRegister)180 silentSpillFPR(iter.name(), canTrample);181 }182 }183 void silentSpillAllRegisters(FPRReg exclude, GPRReg preserve = InvalidGPRReg)184 {185 GPRReg canTrample = GPRInfo::regT0;186 if (preserve == GPRInfo::regT0)187 canTrample = GPRInfo::regT1;188 189 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {190 if (iter.name() != InvalidVirtualRegister)191 silentSpillGPR(iter.name());192 }193 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {194 if (iter.name() != InvalidVirtualRegister)195 silentSpillFPR(iter.name(), canTrample, exclude);196 }197 }198 void silentFillAllRegisters(GPRReg exclude)199 {200 GPRReg canTrample = GPRInfo::regT0;201 if (exclude == GPRInfo::regT0)202 canTrample = GPRInfo::regT1;203 204 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {205 if (iter.name() != InvalidVirtualRegister)206 silentFillFPR(iter.name(), canTrample);207 }208 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {209 if (iter.name() != InvalidVirtualRegister)210 silentFillGPR(iter.name(), exclude);211 }212 }213 void silentFillAllRegisters(FPRReg exclude)214 {215 GPRReg canTrample = GPRInfo::regT0;216 217 for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {218 if (iter.name() != InvalidVirtualRegister) {219 ASSERT_UNUSED(exclude, iter.regID() != exclude);220 silentFillFPR(iter.name(), canTrample, exclude);221 }222 }223 for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {224 if (iter.name() != InvalidVirtualRegister)225 silentFillGPR(iter.name());226 }227 }228 229 88 // These methods are used to plant calls out to C++ 230 89 // helper routines to convert between types.
Note: See TracChangeset
for help on using the changeset viewer.