OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
6 #include "src/compiler/code-generator.h" | 6 #include "src/compiler/code-generator.h" |
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/osr.h" | 10 #include "src/compiler/osr.h" |
(...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 } | 1384 } |
1385 case kMips64Float64RoundTiesEven: { | 1385 case kMips64Float64RoundTiesEven: { |
1386 ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(round); | 1386 ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(round); |
1387 break; | 1387 break; |
1388 } | 1388 } |
1389 case kMips64Float32RoundTiesEven: { | 1389 case kMips64Float32RoundTiesEven: { |
1390 ASSEMBLE_ROUND_FLOAT_TO_FLOAT(round); | 1390 ASSEMBLE_ROUND_FLOAT_TO_FLOAT(round); |
1391 break; | 1391 break; |
1392 } | 1392 } |
1393 case kMips64Float64Max: { | 1393 case kMips64Float64Max: { |
1394 // (b < a) ? a : b | 1394 Label compare_nan, done_compare; |
1395 if (kArchVariant == kMips64r6) { | 1395 __ MaxNaNCheck_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
1396 __ cmp_d(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(1), | 1396 i.InputDoubleRegister(1), &compare_nan); |
1397 i.InputDoubleRegister(0)); | 1397 __ Branch(&done_compare); |
1398 __ sel_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1), | 1398 __ bind(&compare_nan); |
1399 i.InputDoubleRegister(0)); | 1399 __ Move(i.OutputDoubleRegister(), |
1400 } else { | 1400 std::numeric_limits<double>::quiet_NaN()); |
1401 __ c_d(OLT, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); | 1401 __ bind(&done_compare); |
1402 // Left operand is result, passthrough if false. | |
1403 __ movt_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | |
1404 } | |
1405 break; | 1402 break; |
1406 } | 1403 } |
1407 case kMips64Float64Min: { | 1404 case kMips64Float64Min: { |
1408 // (a < b) ? a : b | 1405 Label compare_nan, done_compare; |
1409 if (kArchVariant == kMips64r6) { | 1406 __ MinNaNCheck_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
1410 __ cmp_d(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 1407 i.InputDoubleRegister(1), &compare_nan); |
1411 i.InputDoubleRegister(1)); | 1408 __ Branch(&done_compare); |
1412 __ sel_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1), | 1409 __ bind(&compare_nan); |
1413 i.InputDoubleRegister(0)); | 1410 __ Move(i.OutputDoubleRegister(), |
1414 } else { | 1411 std::numeric_limits<double>::quiet_NaN()); |
1415 __ c_d(OLT, i.InputDoubleRegister(1), i.InputDoubleRegister(0)); | 1412 __ bind(&done_compare); |
1416 // Right operand is result, passthrough if false. | |
1417 __ movt_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | |
1418 } | |
1419 break; | 1413 break; |
1420 } | 1414 } |
1421 case kMips64Float64SilenceNaN: | 1415 case kMips64Float64SilenceNaN: |
1422 __ FPUCanonicalizeNaN(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1416 __ FPUCanonicalizeNaN(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1423 break; | 1417 break; |
1424 case kMips64Float32Max: { | |
1425 // (b < a) ? a : b | |
1426 if (kArchVariant == kMips64r6) { | |
1427 __ cmp_s(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(1), | |
1428 i.InputDoubleRegister(0)); | |
1429 __ sel_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1), | |
1430 i.InputDoubleRegister(0)); | |
1431 } else { | |
1432 __ c_s(OLT, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); | |
1433 // Left operand is result, passthrough if false. | |
1434 __ movt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | |
1435 } | |
1436 break; | |
1437 } | |
1438 case kMips64Float32Min: { | |
1439 // (a < b) ? a : b | |
1440 if (kArchVariant == kMips64r6) { | |
1441 __ cmp_s(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(0), | |
1442 i.InputDoubleRegister(1)); | |
1443 __ sel_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1), | |
1444 i.InputDoubleRegister(0)); | |
1445 } else { | |
1446 __ c_s(OLT, i.InputDoubleRegister(1), i.InputDoubleRegister(0)); | |
1447 // Right operand is result, passthrough if false. | |
1448 __ movt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | |
1449 } | |
1450 break; | |
1451 } | |
1452 case kMips64CvtSD: | 1418 case kMips64CvtSD: |
1453 __ cvt_s_d(i.OutputSingleRegister(), i.InputDoubleRegister(0)); | 1419 __ cvt_s_d(i.OutputSingleRegister(), i.InputDoubleRegister(0)); |
1454 break; | 1420 break; |
1455 case kMips64CvtDS: | 1421 case kMips64CvtDS: |
1456 __ cvt_d_s(i.OutputDoubleRegister(), i.InputSingleRegister(0)); | 1422 __ cvt_d_s(i.OutputDoubleRegister(), i.InputSingleRegister(0)); |
1457 break; | 1423 break; |
1458 case kMips64CvtDW: { | 1424 case kMips64CvtDW: { |
1459 FPURegister scratch = kScratchDoubleReg; | 1425 FPURegister scratch = kScratchDoubleReg; |
1460 __ mtc1(i.InputRegister(0), scratch); | 1426 __ mtc1(i.InputRegister(0), scratch); |
1461 __ cvt_d_w(i.OutputDoubleRegister(), scratch); | 1427 __ cvt_d_w(i.OutputDoubleRegister(), scratch); |
(...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2451 padding_size -= v8::internal::Assembler::kInstrSize; | 2417 padding_size -= v8::internal::Assembler::kInstrSize; |
2452 } | 2418 } |
2453 } | 2419 } |
2454 } | 2420 } |
2455 | 2421 |
2456 #undef __ | 2422 #undef __ |
2457 | 2423 |
2458 } // namespace compiler | 2424 } // namespace compiler |
2459 } // namespace internal | 2425 } // namespace internal |
2460 } // namespace v8 | 2426 } // namespace v8 |
OLD | NEW |