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

Side by Side Diff: src/x64/code-stubs-x64.cc

Issue 1409873002: [x64] Implement vmovd and vmovq AVX instructions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « src/x64/assembler-x64.cc ('k') | src/x64/codegen-x64.cc » ('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 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 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/ic/handler-compiler.h" 10 #include "src/ic/handler-compiler.h"
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 __ j(overflow, &call_runtime); 330 __ j(overflow, &call_runtime);
331 331
332 if (exponent_type() == ON_STACK) { 332 if (exponent_type() == ON_STACK) {
333 // Detect square root case. Crankshaft detects constant +/-0.5 at 333 // Detect square root case. Crankshaft detects constant +/-0.5 at
334 // compile time and uses DoMathPowHalf instead. We then skip this check 334 // compile time and uses DoMathPowHalf instead. We then skip this check
335 // for non-constant cases of +/-0.5 as these hardly occur. 335 // for non-constant cases of +/-0.5 as these hardly occur.
336 Label continue_sqrt, continue_rsqrt, not_plus_half; 336 Label continue_sqrt, continue_rsqrt, not_plus_half;
337 // Test for 0.5. 337 // Test for 0.5.
338 // Load double_scratch with 0.5. 338 // Load double_scratch with 0.5.
339 __ movq(scratch, V8_UINT64_C(0x3FE0000000000000)); 339 __ movq(scratch, V8_UINT64_C(0x3FE0000000000000));
340 __ movq(double_scratch, scratch); 340 __ Movq(double_scratch, scratch);
341 // Already ruled out NaNs for exponent. 341 // Already ruled out NaNs for exponent.
342 __ ucomisd(double_scratch, double_exponent); 342 __ ucomisd(double_scratch, double_exponent);
343 __ j(not_equal, &not_plus_half, Label::kNear); 343 __ j(not_equal, &not_plus_half, Label::kNear);
344 344
345 // Calculates square root of base. Check for the special case of 345 // Calculates square root of base. Check for the special case of
346 // Math.pow(-Infinity, 0.5) == Infinity (ECMA spec, 15.8.2.13). 346 // Math.pow(-Infinity, 0.5) == Infinity (ECMA spec, 15.8.2.13).
347 // According to IEEE-754, double-precision -Infinity has the highest 347 // According to IEEE-754, double-precision -Infinity has the highest
348 // 12 bits set and the lowest 52 bits cleared. 348 // 12 bits set and the lowest 52 bits cleared.
349 __ movq(scratch, V8_UINT64_C(0xFFF0000000000000)); 349 __ movq(scratch, V8_UINT64_C(0xFFF0000000000000));
350 __ movq(double_scratch, scratch); 350 __ Movq(double_scratch, scratch);
351 __ ucomisd(double_scratch, double_base); 351 __ ucomisd(double_scratch, double_base);
352 // Comparing -Infinity with NaN results in "unordered", which sets the 352 // Comparing -Infinity with NaN results in "unordered", which sets the
353 // zero flag as if both were equal. However, it also sets the carry flag. 353 // zero flag as if both were equal. However, it also sets the carry flag.
354 __ j(not_equal, &continue_sqrt, Label::kNear); 354 __ j(not_equal, &continue_sqrt, Label::kNear);
355 __ j(carry, &continue_sqrt, Label::kNear); 355 __ j(carry, &continue_sqrt, Label::kNear);
356 356
357 // Set result to Infinity in the special case. 357 // Set result to Infinity in the special case.
358 __ xorps(double_result, double_result); 358 __ xorps(double_result, double_result);
359 __ subsd(double_result, double_scratch); 359 __ subsd(double_result, double_scratch);
360 __ jmp(&done); 360 __ jmp(&done);
(...skipping 11 matching lines...) Expand all
372 __ subsd(double_scratch, double_result); 372 __ subsd(double_scratch, double_result);
373 // Already ruled out NaNs for exponent. 373 // Already ruled out NaNs for exponent.
374 __ ucomisd(double_scratch, double_exponent); 374 __ ucomisd(double_scratch, double_exponent);
375 __ j(not_equal, &fast_power, Label::kNear); 375 __ j(not_equal, &fast_power, Label::kNear);
376 376
377 // Calculates reciprocal of square root of base. Check for the special 377 // Calculates reciprocal of square root of base. Check for the special
378 // case of Math.pow(-Infinity, -0.5) == 0 (ECMA spec, 15.8.2.13). 378 // case of Math.pow(-Infinity, -0.5) == 0 (ECMA spec, 15.8.2.13).
379 // According to IEEE-754, double-precision -Infinity has the highest 379 // According to IEEE-754, double-precision -Infinity has the highest
380 // 12 bits set and the lowest 52 bits cleared. 380 // 12 bits set and the lowest 52 bits cleared.
381 __ movq(scratch, V8_UINT64_C(0xFFF0000000000000)); 381 __ movq(scratch, V8_UINT64_C(0xFFF0000000000000));
382 __ movq(double_scratch, scratch); 382 __ Movq(double_scratch, scratch);
383 __ ucomisd(double_scratch, double_base); 383 __ ucomisd(double_scratch, double_base);
384 // Comparing -Infinity with NaN results in "unordered", which sets the 384 // Comparing -Infinity with NaN results in "unordered", which sets the
385 // zero flag as if both were equal. However, it also sets the carry flag. 385 // zero flag as if both were equal. However, it also sets the carry flag.
386 __ j(not_equal, &continue_rsqrt, Label::kNear); 386 __ j(not_equal, &continue_rsqrt, Label::kNear);
387 __ j(carry, &continue_rsqrt, Label::kNear); 387 __ j(carry, &continue_rsqrt, Label::kNear);
388 388
389 // Set result to 0 in the special case. 389 // Set result to 0 in the special case.
390 __ xorps(double_result, double_result); 390 __ xorps(double_result, double_result);
391 __ jmp(&done); 391 __ jmp(&done);
392 392
(...skipping 5183 matching lines...) Expand 10 before | Expand all | Expand 10 after
5576 kStackSpace, nullptr, return_value_operand, NULL); 5576 kStackSpace, nullptr, return_value_operand, NULL);
5577 } 5577 }
5578 5578
5579 5579
5580 #undef __ 5580 #undef __
5581 5581
5582 } // namespace internal 5582 } // namespace internal
5583 } // namespace v8 5583 } // namespace v8
5584 5584
5585 #endif // V8_TARGET_ARCH_X64 5585 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.cc ('k') | src/x64/codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698