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

Side by Side Diff: src/wasm/asm-wasm-builder.cc

Issue 1692713006: Allow looser heap accesses historically emitted by Emscripten. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 10 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/typing-asm.cc ('k') | test/cctest/test-asm-validator.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 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/wasm/asm-wasm-builder.h" 7 #include "src/wasm/asm-wasm-builder.h"
8 #include "src/wasm/wasm-macro-gen.h" 8 #include "src/wasm/wasm-macro-gen.h"
9 #include "src/wasm/wasm-opcodes.h" 9 #include "src/wasm/wasm-opcodes.h"
10 10
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 } else if (type->Is(cache_.kFloat64Array)) { 718 } else if (type->Is(cache_.kFloat64Array)) {
719 mtype = MachineType::Float64(); 719 mtype = MachineType::Float64();
720 size = 8; 720 size = 8;
721 } else { 721 } else {
722 UNREACHABLE(); 722 UNREACHABLE();
723 } 723 }
724 current_function_builder_->EmitWithU8( 724 current_function_builder_->EmitWithU8(
725 WasmOpcodes::LoadStoreOpcodeOf(mtype, is_set_op_), 725 WasmOpcodes::LoadStoreOpcodeOf(mtype, is_set_op_),
726 WasmOpcodes::LoadStoreAccessOf(false)); 726 WasmOpcodes::LoadStoreAccessOf(false));
727 is_set_op_ = false; 727 is_set_op_ = false;
728 Literal* value = expr->key()->AsLiteral(); 728 if (size == 1) {
729 if (value) { 729 // Allow more general expression in byte arrays than the spec
730 DCHECK(value->raw_value()->IsNumber()); 730 // strictly permits.
731 DCHECK(kAstI32 == TypeOf(value)); 731 // Early versions of Emscripten emit HEAP8[HEAP32[..]|0] in
732 int val = static_cast<int>(value->raw_value()->AsNumber()); 732 // places that strictly should be HEAP8[HEAP32[..]>>0].
733 byte code[] = {WASM_I32(val * size)}; 733 RECURSE(Visit(expr->key()));
734 current_function_builder_->EmitCode(code, sizeof(code));
735 return; 734 return;
736 } 735 } else {
737 BinaryOperation* binop = expr->key()->AsBinaryOperation(); 736 Literal* value = expr->key()->AsLiteral();
738 if (binop) { 737 if (value) {
739 DCHECK(Token::SAR == binop->op()); 738 DCHECK(value->raw_value()->IsNumber());
740 DCHECK(binop->right()->AsLiteral()->raw_value()->IsNumber()); 739 DCHECK(kAstI32 == TypeOf(value));
741 DCHECK(kAstI32 == TypeOf(binop->right()->AsLiteral())); 740 int val = static_cast<int>(value->raw_value()->AsNumber());
742 DCHECK(size == 741 byte code[] = {WASM_I32(val * size)};
743 1 << static_cast<int>( 742 current_function_builder_->EmitCode(code, sizeof(code));
744 binop->right()->AsLiteral()->raw_value()->AsNumber())); 743 return;
745 // Mask bottom bits to match asm.js behavior. 744 }
746 current_function_builder_->Emit(kExprI32And); 745 BinaryOperation* binop = expr->key()->AsBinaryOperation();
747 byte code[] = {WASM_I8(~(size - 1))}; 746 if (binop) {
748 current_function_builder_->EmitCode(code, sizeof(code)); 747 DCHECK(Token::SAR == binop->op());
749 RECURSE(Visit(binop->left())); 748 DCHECK(binop->right()->AsLiteral()->raw_value()->IsNumber());
750 return; 749 DCHECK(kAstI32 == TypeOf(binop->right()->AsLiteral()));
750 DCHECK(size ==
751 1 << static_cast<int>(
752 binop->right()->AsLiteral()->raw_value()->AsNumber()));
753 // Mask bottom bits to match asm.js behavior.
754 current_function_builder_->Emit(kExprI32And);
755 byte code[] = {WASM_I8(~(size - 1))};
756 current_function_builder_->EmitCode(code, sizeof(code));
757 RECURSE(Visit(binop->left()));
758 return;
759 }
751 } 760 }
752 UNREACHABLE(); 761 UNREACHABLE();
753 } 762 }
754 763
755 void VisitCall(Call* expr) { 764 void VisitCall(Call* expr) {
756 Call::CallType call_type = expr->GetCallType(isolate_); 765 Call::CallType call_type = expr->GetCallType(isolate_);
757 switch (call_type) { 766 switch (call_type) {
758 case Call::OTHER_CALL: { 767 case Call::OTHER_CALL: {
759 DCHECK(in_function_); 768 DCHECK(in_function_);
760 uint16_t index; 769 uint16_t index;
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 // that zone in constructor may be thrown away once wasm module is written. 1280 // that zone in constructor may be thrown away once wasm module is written.
1272 WasmModuleIndex* AsmWasmBuilder::Run() { 1281 WasmModuleIndex* AsmWasmBuilder::Run() {
1273 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_); 1282 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_);
1274 impl.Compile(); 1283 impl.Compile();
1275 WasmModuleWriter* writer = impl.builder_->Build(zone_); 1284 WasmModuleWriter* writer = impl.builder_->Build(zone_);
1276 return writer->WriteTo(zone_); 1285 return writer->WriteTo(zone_);
1277 } 1286 }
1278 } // namespace wasm 1287 } // namespace wasm
1279 } // namespace internal 1288 } // namespace internal
1280 } // namespace v8 1289 } // namespace v8
OLDNEW
« no previous file with comments | « src/typing-asm.cc ('k') | test/cctest/test-asm-validator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698