 Chromium Code Reviews
 Chromium Code Reviews Issue 1573413002:
  Add switch to asm to wasm  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1573413002:
  Add switch to asm to wasm  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| OLD | NEW | 
|---|---|
| 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 } else { | 142 } else { | 
| 143 current_function_builder_->Emit(kExprNop); | 143 current_function_builder_->Emit(kExprNop); | 
| 144 } | 144 } | 
| 145 if (stmt->HasElseStatement()) { | 145 if (stmt->HasElseStatement()) { | 
| 146 RECURSE(Visit(stmt->else_statement())); | 146 RECURSE(Visit(stmt->else_statement())); | 
| 147 } | 147 } | 
| 148 } | 148 } | 
| 149 | 149 | 
| 150 void VisitContinueStatement(ContinueStatement* stmt) { | 150 void VisitContinueStatement(ContinueStatement* stmt) { | 
| 151 DCHECK(in_function_); | 151 DCHECK(in_function_); | 
| 152 DCHECK(stmt->target() != NULL); | |
| 
bradnelson
2016/01/12 01:06:43
Is this actually guaranteed?
 
aseemgarg
2016/01/12 01:38:37
yes
 | |
| 152 int i = static_cast<int>(breakable_blocks_.size()) - 1; | 153 int i = static_cast<int>(breakable_blocks_.size()) - 1; | 
| 153 int block_distance = 0; | 154 int block_distance = 0; | 
| 154 for (; i >= 0; i--) { | 155 for (; i >= 0; i--) { | 
| 155 auto elem = breakable_blocks_.at(i); | 156 auto elem = breakable_blocks_.at(i); | 
| 156 if (elem.first == stmt->target()) { | 157 if (elem.first == stmt->target()) { | 
| 157 DCHECK(elem.second); | 158 DCHECK(elem.second); | 
| 158 break; | 159 break; | 
| 159 } else if (elem.second) { | 160 } else if (elem.second) { | 
| 160 block_distance += 2; | 161 block_distance += 2; | 
| 161 } else { | 162 } else { | 
| 162 block_distance += 1; | 163 block_distance += 1; | 
| 163 } | 164 } | 
| 164 } | 165 } | 
| 165 DCHECK(i >= 0); | 166 DCHECK(i >= 0); | 
| 166 current_function_builder_->EmitWithU8(kExprBr, block_distance); | 167 current_function_builder_->EmitWithU8(kExprBr, block_distance); | 
| 167 current_function_builder_->Emit(kExprNop); | 168 current_function_builder_->Emit(kExprNop); | 
| 168 } | 169 } | 
| 169 | 170 | 
| 170 void VisitBreakStatement(BreakStatement* stmt) { | 171 void VisitBreakStatement(BreakStatement* stmt) { | 
| 171 DCHECK(in_function_); | 172 DCHECK(in_function_); | 
| 173 DCHECK(stmt->target() != NULL); | |
| 172 int i = static_cast<int>(breakable_blocks_.size()) - 1; | 174 int i = static_cast<int>(breakable_blocks_.size()) - 1; | 
| 173 int block_distance = 0; | 175 int block_distance = 0; | 
| 174 for (; i >= 0; i--) { | 176 for (; i >= 0; i--) { | 
| 175 auto elem = breakable_blocks_.at(i); | 177 auto elem = breakable_blocks_.at(i); | 
| 176 if (elem.first == stmt->target()) { | 178 if (elem.first == stmt->target()) { | 
| 177 if (elem.second) { | 179 if (elem.second) { | 
| 178 block_distance++; | 180 block_distance++; | 
| 179 } | 181 } | 
| 180 break; | 182 break; | 
| 181 } else if (elem.second) { | 183 } else if (elem.second) { | 
| (...skipping 14 matching lines...) Expand all Loading... | |
| 196 marking_exported = true; | 198 marking_exported = true; | 
| 197 } | 199 } | 
| 198 RECURSE(Visit(stmt->expression())); | 200 RECURSE(Visit(stmt->expression())); | 
| 199 if (!in_function_) { | 201 if (!in_function_) { | 
| 200 marking_exported = false; | 202 marking_exported = false; | 
| 201 } | 203 } | 
| 202 } | 204 } | 
| 203 | 205 | 
| 204 void VisitWithStatement(WithStatement* stmt) { UNREACHABLE(); } | 206 void VisitWithStatement(WithStatement* stmt) { UNREACHABLE(); } | 
| 205 | 207 | 
| 208 void SetLocalTo(uint16_t index, int value) { | |
| 209 current_function_builder_->Emit(kExprSetLocal); | |
| 210 AddLeb128(index, true); | |
| 211 byte code[] = {WASM_I32(value)}; | |
| 212 current_function_builder_->EmitCode(code, sizeof(code)); | |
| 213 block_size_++; | |
| 214 } | |
| 215 | |
| 216 void CompileCase(CaseClause* clause, uint16_t fall_through, | |
| 217 VariableProxy* tag) { | |
| 218 Literal* label = clause->label()->AsLiteral(); | |
| 219 DCHECK(label != nullptr); | |
| 220 block_size_++; | |
| 221 current_function_builder_->Emit(kExprIf); | |
| 222 current_function_builder_->Emit(kExprI32Ior); | |
| 223 current_function_builder_->Emit(kExprI32Eq); | |
| 224 VisitVariableProxy(tag); | |
| 225 VisitLiteral(label); | |
| 226 current_function_builder_->Emit(kExprGetLocal); | |
| 227 AddLeb128(fall_through, true); | |
| 228 BlockVisitor visitor(this, nullptr, kExprBlock, false); | |
| 229 block_size_ = 0; | |
| 230 SetLocalTo(fall_through, 1); | |
| 231 ZoneList<Statement*>* stmts = clause->statements(); | |
| 232 block_size_ += stmts->length(); | |
| 233 RECURSE(VisitStatements(stmts)); | |
| 234 } | |
| 235 | |
| 206 void VisitSwitchStatement(SwitchStatement* stmt) { | 236 void VisitSwitchStatement(SwitchStatement* stmt) { | 
| 207 RECURSE(Visit(stmt->tag())); | 237 VariableProxy* tag = stmt->tag()->AsVariableProxy(); | 
| 238 DCHECK(tag != NULL); | |
| 239 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false); | |
| 
bradnelson
2016/01/12 01:06:43
I wonder if folding the block_size_ = 0 into the v
 
aseemgarg
2016/01/12 01:38:37
Will take care in next commit
 | |
| 240 block_size_ = 0; | |
| 241 uint16_t fall_through = current_function_builder_->AddLocal(kAstI32); | |
| 242 SetLocalTo(fall_through, 0); | |
| 208 | 243 | 
| 209 ZoneList<CaseClause*>* clauses = stmt->cases(); | 244 ZoneList<CaseClause*>* clauses = stmt->cases(); | 
| 210 | |
| 211 for (int i = 0; i < clauses->length(); ++i) { | 245 for (int i = 0; i < clauses->length(); ++i) { | 
| 212 CaseClause* clause = clauses->at(i); | 246 CaseClause* clause = clauses->at(i); | 
| 213 if (!clause->is_default()) { | 247 if (!clause->is_default()) { | 
| 214 Expression* label = clause->label(); | 248 CompileCase(clause, fall_through, tag); | 
| 215 RECURSE(Visit(label)); | 249 } else { | 
| 250 ZoneList<Statement*>* stmts = clause->statements(); | |
| 251 block_size_ += stmts->length(); | |
| 252 RECURSE(VisitStatements(stmts)); | |
| 216 } | 253 } | 
| 217 ZoneList<Statement*>* stmts = clause->statements(); | |
| 218 RECURSE(VisitStatements(stmts)); | |
| 219 } | 254 } | 
| 220 } | 255 } | 
| 221 | 256 | 
| 222 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } | 257 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } | 
| 223 | 258 | 
| 224 void VisitDoWhileStatement(DoWhileStatement* stmt) { | 259 void VisitDoWhileStatement(DoWhileStatement* stmt) { | 
| 225 DCHECK(in_function_); | 260 DCHECK(in_function_); | 
| 226 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); | 261 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); | 
| 227 block_size_ = 2; | 262 block_size_ = 2; | 
| 228 RECURSE(Visit(stmt->body())); | 263 RECURSE(Visit(stmt->body())); | 
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 998 // that zone in constructor may be thrown away once wasm module is written. | 1033 // that zone in constructor may be thrown away once wasm module is written. | 
| 999 WasmModuleIndex* AsmWasmBuilder::Run() { | 1034 WasmModuleIndex* AsmWasmBuilder::Run() { | 
| 1000 AsmWasmBuilderImpl impl(isolate_, zone_, literal_); | 1035 AsmWasmBuilderImpl impl(isolate_, zone_, literal_); | 
| 1001 impl.Compile(); | 1036 impl.Compile(); | 
| 1002 WasmModuleWriter* writer = impl.builder_->Build(zone_); | 1037 WasmModuleWriter* writer = impl.builder_->Build(zone_); | 
| 1003 return writer->WriteTo(zone_); | 1038 return writer->WriteTo(zone_); | 
| 1004 } | 1039 } | 
| 1005 } // namespace wasm | 1040 } // namespace wasm | 
| 1006 } // namespace internal | 1041 } // namespace internal | 
| 1007 } // namespace v8 | 1042 } // namespace v8 | 
| OLD | NEW |