Chromium Code Reviews

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 1845443003: [wasm] Mask shift counts on architectures that don't implicitly mask. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/wasm-compiler.h" 5 #include "src/compiler/wasm-compiler.h"
6 6
7 #include "src/isolate-inl.h" 7 #include "src/isolate-inl.h"
8 8
9 #include "src/base/platform/elapsed-timer.h" 9 #include "src/base/platform/elapsed-timer.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 423 matching lines...)
434 op = m->Word32And(); 434 op = m->Word32And();
435 break; 435 break;
436 case wasm::kExprI32Ior: 436 case wasm::kExprI32Ior:
437 op = m->Word32Or(); 437 op = m->Word32Or();
438 break; 438 break;
439 case wasm::kExprI32Xor: 439 case wasm::kExprI32Xor:
440 op = m->Word32Xor(); 440 op = m->Word32Xor();
441 break; 441 break;
442 case wasm::kExprI32Shl: 442 case wasm::kExprI32Shl:
443 op = m->Word32Shl(); 443 op = m->Word32Shl();
444 right = MaskShiftCount32(right);
444 break; 445 break;
445 case wasm::kExprI32ShrU: 446 case wasm::kExprI32ShrU:
446 op = m->Word32Shr(); 447 op = m->Word32Shr();
448 right = MaskShiftCount32(right);
447 break; 449 break;
448 case wasm::kExprI32ShrS: 450 case wasm::kExprI32ShrS:
449 op = m->Word32Sar(); 451 op = m->Word32Sar();
452 right = MaskShiftCount32(right);
450 break; 453 break;
451 case wasm::kExprI32Ror: 454 case wasm::kExprI32Ror:
452 op = m->Word32Ror(); 455 op = m->Word32Ror();
456 right = MaskShiftCount32(right);
453 break; 457 break;
454 case wasm::kExprI32Rol: 458 case wasm::kExprI32Rol:
459 right = MaskShiftCount32(right);
455 return BuildI32Rol(left, right); 460 return BuildI32Rol(left, right);
456 case wasm::kExprI32Eq: 461 case wasm::kExprI32Eq:
457 op = m->Word32Equal(); 462 op = m->Word32Equal();
458 break; 463 break;
459 case wasm::kExprI32Ne: 464 case wasm::kExprI32Ne:
460 return Invert(Binop(wasm::kExprI32Eq, left, right)); 465 return Invert(Binop(wasm::kExprI32Eq, left, right));
461 case wasm::kExprI32LtS: 466 case wasm::kExprI32LtS:
462 op = m->Int32LessThan(); 467 op = m->Int32LessThan();
463 break; 468 break;
464 case wasm::kExprI32LeS: 469 case wasm::kExprI32LeS:
(...skipping 53 matching lines...)
518 case wasm::kExprI64Ior: 523 case wasm::kExprI64Ior:
519 op = m->Word64Or(); 524 op = m->Word64Or();
520 break; 525 break;
521 // kExprI64Xor: 526 // kExprI64Xor:
522 case wasm::kExprI64Xor: 527 case wasm::kExprI64Xor:
523 op = m->Word64Xor(); 528 op = m->Word64Xor();
524 break; 529 break;
525 // kExprI64Shl: 530 // kExprI64Shl:
526 case wasm::kExprI64Shl: 531 case wasm::kExprI64Shl:
527 op = m->Word64Shl(); 532 op = m->Word64Shl();
533 right = MaskShiftCount64(right);
528 break; 534 break;
529 // kExprI64ShrU: 535 // kExprI64ShrU:
530 case wasm::kExprI64ShrU: 536 case wasm::kExprI64ShrU:
531 op = m->Word64Shr(); 537 op = m->Word64Shr();
538 right = MaskShiftCount64(right);
532 break; 539 break;
533 // kExprI64ShrS: 540 // kExprI64ShrS:
534 case wasm::kExprI64ShrS: 541 case wasm::kExprI64ShrS:
535 op = m->Word64Sar(); 542 op = m->Word64Sar();
543 right = MaskShiftCount64(right);
536 break; 544 break;
537 // kExprI64Eq: 545 // kExprI64Eq:
538 case wasm::kExprI64Eq: 546 case wasm::kExprI64Eq:
539 op = m->Word64Equal(); 547 op = m->Word64Equal();
540 break; 548 break;
541 // kExprI64Ne: 549 // kExprI64Ne:
542 case wasm::kExprI64Ne: 550 case wasm::kExprI64Ne:
543 return Invert(Binop(wasm::kExprI64Eq, left, right)); 551 return Invert(Binop(wasm::kExprI64Eq, left, right));
544 // kExprI64LtS: 552 // kExprI64LtS:
545 case wasm::kExprI64LtS: 553 case wasm::kExprI64LtS:
(...skipping 23 matching lines...)
569 case wasm::kExprI64GeU: 577 case wasm::kExprI64GeU:
570 op = m->Uint64LessThanOrEqual(); 578 op = m->Uint64LessThanOrEqual();
571 std::swap(left, right); 579 std::swap(left, right);
572 break; 580 break;
573 581
574 #if WASM_64 582 #if WASM_64
575 // Opcodes only supported on 64-bit platforms. 583 // Opcodes only supported on 64-bit platforms.
576 // TODO(titzer): query the machine operator builder here instead of #ifdef. 584 // TODO(titzer): query the machine operator builder here instead of #ifdef.
577 case wasm::kExprI64Ror: 585 case wasm::kExprI64Ror:
578 op = m->Word64Ror(); 586 op = m->Word64Ror();
587 right = MaskShiftCount64(right);
579 break; 588 break;
580 case wasm::kExprI64Rol: 589 case wasm::kExprI64Rol:
590 right = MaskShiftCount64(right);
581 return BuildI64Rol(left, right); 591 return BuildI64Rol(left, right);
582 #endif 592 #endif
583 593
584 case wasm::kExprF32CopySign: 594 case wasm::kExprF32CopySign:
585 return BuildF32CopySign(left, right); 595 return BuildF32CopySign(left, right);
586 case wasm::kExprF64CopySign: 596 case wasm::kExprF64CopySign:
587 return BuildF64CopySign(left, right); 597 return BuildF64CopySign(left, right);
588 case wasm::kExprF32Add: 598 case wasm::kExprF32Add:
589 op = m->Float32Add(); 599 op = m->Float32Add();
590 break; 600 break;
(...skipping 394 matching lines...)
985 995
986 996
987 Node* WasmGraphBuilder::ReturnVoid() { return Return(0, Buffer(0)); } 997 Node* WasmGraphBuilder::ReturnVoid() { return Return(0, Buffer(0)); }
988 998
989 999
990 Node* WasmGraphBuilder::Unreachable() { 1000 Node* WasmGraphBuilder::Unreachable() {
991 trap_->Unreachable(); 1001 trap_->Unreachable();
992 return nullptr; 1002 return nullptr;
993 } 1003 }
994 1004
1005 Node* WasmGraphBuilder::MaskShiftCount32(Node* node) {
1006 static const int32_t kMask32 = 0x1f;
1007 if (!jsgraph()->machine()->Word32ShiftIsSafe()) {
1008 // Shifts by constants are so common we pattern-match them here.
1009 Int32Matcher match(node);
1010 if (match.HasValue()) {
1011 int32_t masked = (match.Value() & kMask32);
1012 if (match.Value() != masked) node = jsgraph()->Int32Constant(masked);
1013 } else {
1014 node = graph()->NewNode(jsgraph()->machine()->Word32And(), node,
1015 jsgraph()->Int32Constant(kMask32));
1016 }
1017 }
1018 return node;
1019 }
1020
1021 Node* WasmGraphBuilder::MaskShiftCount64(Node* node) {
1022 static const int64_t kMask64 = 0x3f;
1023 if (!jsgraph()->machine()->Word32ShiftIsSafe()) {
1024 // Shifts by constants are so common we pattern-match them here.
1025 Int64Matcher match(node);
1026 if (match.HasValue()) {
1027 int64_t masked = (match.Value() & kMask64);
1028 if (match.Value() != masked) node = jsgraph()->Int64Constant(masked);
1029 } else {
1030 node = graph()->NewNode(jsgraph()->machine()->Word64And(), node,
1031 jsgraph()->Int64Constant(kMask64));
1032 }
1033 }
1034 return node;
1035 }
995 1036
996 Node* WasmGraphBuilder::BuildF32Neg(Node* input) { 1037 Node* WasmGraphBuilder::BuildF32Neg(Node* input) {
997 Node* result = 1038 Node* result =
998 Unop(wasm::kExprF32ReinterpretI32, 1039 Unop(wasm::kExprF32ReinterpretI32,
999 Binop(wasm::kExprI32Xor, Unop(wasm::kExprI32ReinterpretF32, input), 1040 Binop(wasm::kExprI32Xor, Unop(wasm::kExprI32ReinterpretF32, input),
1000 jsgraph()->Int32Constant(0x80000000))); 1041 jsgraph()->Int32Constant(0x80000000)));
1001 1042
1002 return result; 1043 return result;
1003 } 1044 }
1004 1045
(...skipping 1661 matching lines...)
2666 static_cast<int>(function.code_end_offset - function.code_start_offset), 2707 static_cast<int>(function.code_end_offset - function.code_start_offset),
2667 decode_ms, static_cast<int>(graph.NodeCount()), compile_ms); 2708 decode_ms, static_cast<int>(graph.NodeCount()), compile_ms);
2668 } 2709 }
2669 return code; 2710 return code;
2670 } 2711 }
2671 2712
2672 2713
2673 } // namespace compiler 2714 } // namespace compiler
2674 } // namespace internal 2715 } // namespace internal
2675 } // namespace v8 2716 } // namespace v8
OLDNEW

Powered by Google App Engine