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

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

Issue 1584573002: refactor BlockVisitor in asm to wasm and fix tests (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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 | « no previous file | test/mjsunit/wasm/asm-wasm.js » ('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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 ExpressionStatement* expr = 85 ExpressionStatement* expr =
86 stmt->statements()->at(0)->AsExpressionStatement(); 86 stmt->statements()->at(0)->AsExpressionStatement();
87 if (expr != nullptr) { 87 if (expr != nullptr) {
88 if (expr->expression()->IsAssignment()) { 88 if (expr->expression()->IsAssignment()) {
89 RECURSE(VisitExpressionStatement(expr)); 89 RECURSE(VisitExpressionStatement(expr));
90 return; 90 return;
91 } 91 }
92 } 92 }
93 } 93 }
94 DCHECK(in_function_); 94 DCHECK(in_function_);
95 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false); 95 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false,
96 block_size_ = static_cast<byte>(stmt->statements()->length()); 96 static_cast<byte>(stmt->statements()->length()));
97 RECURSE(VisitStatements(stmt->statements())); 97 RECURSE(VisitStatements(stmt->statements()));
98 DCHECK(block_size_ >= 0); 98 DCHECK(block_size_ >= 0);
99 } 99 }
100 100
101 class BlockVisitor { 101 class BlockVisitor {
102 private: 102 private:
103 int prev_block_size_; 103 int prev_block_size_;
104 uint32_t index_; 104 uint32_t index_;
105 AsmWasmBuilderImpl* builder_; 105 AsmWasmBuilderImpl* builder_;
106 106
107 public: 107 public:
108 BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt, 108 BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt,
109 WasmOpcode opcode, bool is_loop) 109 WasmOpcode opcode, bool is_loop, int initial_block_size)
110 : builder_(builder) { 110 : builder_(builder) {
111 builder_->breakable_blocks_.push_back(std::make_pair(stmt, is_loop)); 111 builder_->breakable_blocks_.push_back(std::make_pair(stmt, is_loop));
112 builder_->current_function_builder_->Emit(opcode); 112 builder_->current_function_builder_->Emit(opcode);
113 index_ = builder_->current_function_builder_->EmitEditableImmediate(0); 113 index_ = builder_->current_function_builder_->EmitEditableImmediate(0);
114 prev_block_size_ = builder_->block_size_; 114 prev_block_size_ = builder_->block_size_;
115 builder_->block_size_ = initial_block_size;
115 } 116 }
116 ~BlockVisitor() { 117 ~BlockVisitor() {
117 builder_->current_function_builder_->EditImmediate(index_, 118 builder_->current_function_builder_->EditImmediate(index_,
118 builder_->block_size_); 119 builder_->block_size_);
119 builder_->block_size_ = prev_block_size_; 120 builder_->block_size_ = prev_block_size_;
120 builder_->breakable_blocks_.pop_back(); 121 builder_->breakable_blocks_.pop_back();
121 } 122 }
122 }; 123 };
123 124
124 void VisitExpressionStatement(ExpressionStatement* stmt) { 125 void VisitExpressionStatement(ExpressionStatement* stmt) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 Literal* label = clause->label()->AsLiteral(); 219 Literal* label = clause->label()->AsLiteral();
219 DCHECK(label != nullptr); 220 DCHECK(label != nullptr);
220 block_size_++; 221 block_size_++;
221 current_function_builder_->Emit(kExprIf); 222 current_function_builder_->Emit(kExprIf);
222 current_function_builder_->Emit(kExprI32Ior); 223 current_function_builder_->Emit(kExprI32Ior);
223 current_function_builder_->Emit(kExprI32Eq); 224 current_function_builder_->Emit(kExprI32Eq);
224 VisitVariableProxy(tag); 225 VisitVariableProxy(tag);
225 VisitLiteral(label); 226 VisitLiteral(label);
226 current_function_builder_->Emit(kExprGetLocal); 227 current_function_builder_->Emit(kExprGetLocal);
227 AddLeb128(fall_through, true); 228 AddLeb128(fall_through, true);
228 BlockVisitor visitor(this, nullptr, kExprBlock, false); 229 BlockVisitor visitor(this, nullptr, kExprBlock, false, 0);
229 block_size_ = 0;
230 SetLocalTo(fall_through, 1); 230 SetLocalTo(fall_through, 1);
231 ZoneList<Statement*>* stmts = clause->statements(); 231 ZoneList<Statement*>* stmts = clause->statements();
232 block_size_ += stmts->length(); 232 block_size_ += stmts->length();
233 RECURSE(VisitStatements(stmts)); 233 RECURSE(VisitStatements(stmts));
234 } 234 }
235 235
236 void VisitSwitchStatement(SwitchStatement* stmt) { 236 void VisitSwitchStatement(SwitchStatement* stmt) {
237 VariableProxy* tag = stmt->tag()->AsVariableProxy(); 237 VariableProxy* tag = stmt->tag()->AsVariableProxy();
238 DCHECK(tag != NULL); 238 DCHECK(tag != NULL);
239 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false); 239 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false,
240 block_size_ = 0; 240 0);
241 uint16_t fall_through = current_function_builder_->AddLocal(kAstI32); 241 uint16_t fall_through = current_function_builder_->AddLocal(kAstI32);
242 SetLocalTo(fall_through, 0); 242 SetLocalTo(fall_through, 0);
243 243
244 ZoneList<CaseClause*>* clauses = stmt->cases(); 244 ZoneList<CaseClause*>* clauses = stmt->cases();
245 for (int i = 0; i < clauses->length(); ++i) { 245 for (int i = 0; i < clauses->length(); ++i) {
246 CaseClause* clause = clauses->at(i); 246 CaseClause* clause = clauses->at(i);
247 if (!clause->is_default()) { 247 if (!clause->is_default()) {
248 CompileCase(clause, fall_through, tag); 248 CompileCase(clause, fall_through, tag);
249 } else { 249 } else {
250 ZoneList<Statement*>* stmts = clause->statements(); 250 ZoneList<Statement*>* stmts = clause->statements();
251 block_size_ += stmts->length(); 251 block_size_ += stmts->length();
252 RECURSE(VisitStatements(stmts)); 252 RECURSE(VisitStatements(stmts));
253 } 253 }
254 } 254 }
255 } 255 }
256 256
257 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } 257 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); }
258 258
259 void VisitDoWhileStatement(DoWhileStatement* stmt) { 259 void VisitDoWhileStatement(DoWhileStatement* stmt) {
260 DCHECK(in_function_); 260 DCHECK(in_function_);
261 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); 261 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
262 block_size_ = 2; 262 2);
263 RECURSE(Visit(stmt->body())); 263 RECURSE(Visit(stmt->body()));
264 current_function_builder_->Emit(kExprIf); 264 current_function_builder_->Emit(kExprIf);
265 RECURSE(Visit(stmt->cond())); 265 RECURSE(Visit(stmt->cond()));
266 current_function_builder_->EmitWithU8(kExprBr, 0); 266 current_function_builder_->EmitWithU8(kExprBr, 0);
267 current_function_builder_->Emit(kExprNop); 267 current_function_builder_->Emit(kExprNop);
268 } 268 }
269 269
270 void VisitWhileStatement(WhileStatement* stmt) { 270 void VisitWhileStatement(WhileStatement* stmt) {
271 DCHECK(in_function_); 271 DCHECK(in_function_);
272 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); 272 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
273 block_size_ = 1; 273 1);
274 current_function_builder_->Emit(kExprIf); 274 current_function_builder_->Emit(kExprIf);
275 RECURSE(Visit(stmt->cond())); 275 RECURSE(Visit(stmt->cond()));
276 current_function_builder_->EmitWithU8(kExprBr, 0); 276 current_function_builder_->EmitWithU8(kExprBr, 0);
277 RECURSE(Visit(stmt->body())); 277 RECURSE(Visit(stmt->body()));
278 } 278 }
279 279
280 void VisitForStatement(ForStatement* stmt) { 280 void VisitForStatement(ForStatement* stmt) {
281 DCHECK(in_function_); 281 DCHECK(in_function_);
282 if (stmt->init() != nullptr) { 282 if (stmt->init() != nullptr) {
283 block_size_++; 283 block_size_++;
284 RECURSE(Visit(stmt->init())); 284 RECURSE(Visit(stmt->init()));
285 } 285 }
286 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); 286 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
287 block_size_ = 0; 287 0);
288 if (stmt->cond() != nullptr) { 288 if (stmt->cond() != nullptr) {
289 block_size_++; 289 block_size_++;
290 current_function_builder_->Emit(kExprIf); 290 current_function_builder_->Emit(kExprIf);
291 current_function_builder_->Emit(kExprBoolNot); 291 current_function_builder_->Emit(kExprBoolNot);
292 RECURSE(Visit(stmt->cond())); 292 RECURSE(Visit(stmt->cond()));
293 current_function_builder_->EmitWithU8(kExprBr, 1); 293 current_function_builder_->EmitWithU8(kExprBr, 1);
294 current_function_builder_->Emit(kExprNop); 294 current_function_builder_->Emit(kExprNop);
295 } 295 }
296 if (stmt->body() != nullptr) { 296 if (stmt->body() != nullptr) {
297 block_size_++; 297 block_size_++;
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 // that zone in constructor may be thrown away once wasm module is written. 1030 // that zone in constructor may be thrown away once wasm module is written.
1031 WasmModuleIndex* AsmWasmBuilder::Run() { 1031 WasmModuleIndex* AsmWasmBuilder::Run() {
1032 AsmWasmBuilderImpl impl(isolate_, zone_, literal_); 1032 AsmWasmBuilderImpl impl(isolate_, zone_, literal_);
1033 impl.Compile(); 1033 impl.Compile();
1034 WasmModuleWriter* writer = impl.builder_->Build(zone_); 1034 WasmModuleWriter* writer = impl.builder_->Build(zone_);
1035 return writer->WriteTo(zone_); 1035 return writer->WriteTo(zone_);
1036 } 1036 }
1037 } // namespace wasm 1037 } // namespace wasm
1038 } // namespace internal 1038 } // namespace internal
1039 } // namespace v8 1039 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/wasm/asm-wasm.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698