| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
| 8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 public: | 184 public: |
| 185 OutOfLineLoadFloat(CodeGenerator* gen, XMMRegister result) | 185 OutOfLineLoadFloat(CodeGenerator* gen, XMMRegister result) |
| 186 : OutOfLineCode(gen), result_(result) {} | 186 : OutOfLineCode(gen), result_(result) {} |
| 187 | 187 |
| 188 void Generate() FINAL { __ pcmpeqd(result_, result_); } | 188 void Generate() FINAL { __ pcmpeqd(result_, result_); } |
| 189 | 189 |
| 190 private: | 190 private: |
| 191 XMMRegister const result_; | 191 XMMRegister const result_; |
| 192 }; | 192 }; |
| 193 | 193 |
| 194 |
| 195 class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode { |
| 196 public: |
| 197 OutOfLineTruncateDoubleToI(CodeGenerator* gen, Register result, |
| 198 XMMRegister input) |
| 199 : OutOfLineCode(gen), result_(result), input_(input) {} |
| 200 |
| 201 void Generate() FINAL { |
| 202 __ sub(esp, Immediate(kDoubleSize)); |
| 203 __ movsd(MemOperand(esp, 0), input_); |
| 204 __ SlowTruncateToI(result_, esp, 0); |
| 205 __ add(esp, Immediate(kDoubleSize)); |
| 206 } |
| 207 |
| 208 private: |
| 209 Register const result_; |
| 210 XMMRegister const input_; |
| 211 }; |
| 212 |
| 194 } // namespace | 213 } // namespace |
| 195 | 214 |
| 196 | 215 |
| 197 #define ASSEMBLE_CHECKED_LOAD_FLOAT(asm_instr) \ | 216 #define ASSEMBLE_CHECKED_LOAD_FLOAT(asm_instr) \ |
| 198 do { \ | 217 do { \ |
| 199 auto result = i.OutputDoubleRegister(); \ | 218 auto result = i.OutputDoubleRegister(); \ |
| 200 auto offset = i.InputRegister(0); \ | 219 auto offset = i.InputRegister(0); \ |
| 201 if (instr->InputAt(1)->IsRegister()) { \ | 220 if (instr->InputAt(1)->IsRegister()) { \ |
| 202 __ cmp(offset, i.InputRegister(1)); \ | 221 __ cmp(offset, i.InputRegister(1)); \ |
| 203 } else { \ | 222 } else { \ |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 break; | 313 break; |
| 295 case kArchNop: | 314 case kArchNop: |
| 296 // don't emit code for nops. | 315 // don't emit code for nops. |
| 297 break; | 316 break; |
| 298 case kArchRet: | 317 case kArchRet: |
| 299 AssembleReturn(); | 318 AssembleReturn(); |
| 300 break; | 319 break; |
| 301 case kArchStackPointer: | 320 case kArchStackPointer: |
| 302 __ mov(i.OutputRegister(), esp); | 321 __ mov(i.OutputRegister(), esp); |
| 303 break; | 322 break; |
| 304 case kArchTruncateDoubleToI: | 323 case kArchTruncateDoubleToI: { |
| 305 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); | 324 auto result = i.OutputRegister(); |
| 325 auto input = i.InputDoubleRegister(0); |
| 326 auto ool = new (zone()) OutOfLineTruncateDoubleToI(this, result, input); |
| 327 __ cvttsd2si(result, Operand(input)); |
| 328 __ cmp(result, 1); |
| 329 __ j(overflow, ool->entry()); |
| 330 __ bind(ool->exit()); |
| 306 break; | 331 break; |
| 332 } |
| 307 case kIA32Add: | 333 case kIA32Add: |
| 308 if (HasImmediateInput(instr, 1)) { | 334 if (HasImmediateInput(instr, 1)) { |
| 309 __ add(i.InputOperand(0), i.InputImmediate(1)); | 335 __ add(i.InputOperand(0), i.InputImmediate(1)); |
| 310 } else { | 336 } else { |
| 311 __ add(i.InputRegister(0), i.InputOperand(1)); | 337 __ add(i.InputRegister(0), i.InputOperand(1)); |
| 312 } | 338 } |
| 313 break; | 339 break; |
| 314 case kIA32And: | 340 case kIA32And: |
| 315 if (HasImmediateInput(instr, 1)) { | 341 if (HasImmediateInput(instr, 1)) { |
| 316 __ and_(i.InputOperand(0), i.InputImmediate(1)); | 342 __ and_(i.InputOperand(0), i.InputImmediate(1)); |
| (...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 } | 1213 } |
| 1188 } | 1214 } |
| 1189 MarkLazyDeoptSite(); | 1215 MarkLazyDeoptSite(); |
| 1190 } | 1216 } |
| 1191 | 1217 |
| 1192 #undef __ | 1218 #undef __ |
| 1193 | 1219 |
| 1194 } // namespace compiler | 1220 } // namespace compiler |
| 1195 } // namespace internal | 1221 } // namespace internal |
| 1196 } // namespace v8 | 1222 } // namespace v8 |
| OLD | NEW |