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

Side by Side Diff: src/compiler/interpreter-assembler.cc

Issue 1555713002: [Interpreter] Bytecodes for exchanging registers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase. 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 | « src/compiler/interpreter-assembler.h ('k') | src/interpreter/bytecode-array-builder.h » ('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/compiler/interpreter-assembler.h" 5 #include "src/compiler/interpreter-assembler.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/compiler/graph.h" 10 #include "src/compiler/graph.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 #elif V8_TARGET_BIG_ENDIAN 202 #elif V8_TARGET_BIG_ENDIAN
203 return raw_assembler_->WordOr(WordShl(first_byte, kBitsPerByte), 203 return raw_assembler_->WordOr(WordShl(first_byte, kBitsPerByte),
204 second_byte); 204 second_byte);
205 #else 205 #else
206 #error "Unknown Architecture" 206 #error "Unknown Architecture"
207 #endif 207 #endif
208 } 208 }
209 } 209 }
210 210
211 211
212 Node* InterpreterAssembler::BytecodeOperandShortSignExtended(
213 int operand_index) {
214 DCHECK_LT(operand_index, interpreter::Bytecodes::NumberOfOperands(bytecode_));
215 DCHECK_EQ(interpreter::OperandSize::kShort,
216 interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index));
217 int operand_offset =
218 interpreter::Bytecodes::GetOperandOffset(bytecode_, operand_index);
219 Node* load;
220 if (TargetSupportsUnalignedAccess()) {
221 load = raw_assembler_->Load(
222 MachineType::Int16(), BytecodeArrayTaggedPointer(),
223 IntPtrAdd(BytecodeOffset(), Int32Constant(operand_offset)));
224 } else {
225 #if V8_TARGET_LITTLE_ENDIAN
226 Node* hi_byte_offset = Int32Constant(operand_offset + 1);
227 Node* lo_byte_offset = Int32Constant(operand_offset);
228 #elif V8_TARGET_BIG_ENDIAN
229 Node* hi_byte_offset = Int32Constant(operand_offset);
230 Node* lo_byte_offset = Int32Constant(operand_offset + 1);
231 #else
232 #error "Unknown Architecture"
233 #endif
234 Node* hi_byte =
235 raw_assembler_->Load(MachineType::Int8(), BytecodeArrayTaggedPointer(),
236 IntPtrAdd(BytecodeOffset(), hi_byte_offset));
237 Node* lo_byte =
238 raw_assembler_->Load(MachineType::Uint8(), BytecodeArrayTaggedPointer(),
239 IntPtrAdd(BytecodeOffset(), lo_byte_offset));
240 hi_byte = raw_assembler_->Word32Shl(hi_byte, Int32Constant(kBitsPerByte));
241 load = raw_assembler_->Word32Or(hi_byte, lo_byte);
242 }
243
244 // Ensure that we sign extend to full pointer size
245 if (kPointerSize == 8) {
246 load = raw_assembler_->ChangeInt32ToInt64(load);
247 }
248 return load;
249 }
250
251
212 Node* InterpreterAssembler::BytecodeOperandCount(int operand_index) { 252 Node* InterpreterAssembler::BytecodeOperandCount(int operand_index) {
213 switch (interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index)) { 253 switch (interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index)) {
214 case interpreter::OperandSize::kByte: 254 case interpreter::OperandSize::kByte:
215 DCHECK_EQ( 255 DCHECK_EQ(
216 interpreter::OperandType::kCount8, 256 interpreter::OperandType::kCount8,
217 interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); 257 interpreter::Bytecodes::GetOperandType(bytecode_, operand_index));
218 return BytecodeOperand(operand_index); 258 return BytecodeOperand(operand_index);
219 case interpreter::OperandSize::kShort: 259 case interpreter::OperandSize::kShort:
220 DCHECK_EQ( 260 DCHECK_EQ(
221 interpreter::OperandType::kCount16, 261 interpreter::OperandType::kCount16,
(...skipping 26 matching lines...) Expand all
248 interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); 288 interpreter::Bytecodes::GetOperandType(bytecode_, operand_index));
249 return BytecodeOperandShort(operand_index); 289 return BytecodeOperandShort(operand_index);
250 default: 290 default:
251 UNREACHABLE(); 291 UNREACHABLE();
252 return nullptr; 292 return nullptr;
253 } 293 }
254 } 294 }
255 295
256 296
257 Node* InterpreterAssembler::BytecodeOperandReg(int operand_index) { 297 Node* InterpreterAssembler::BytecodeOperandReg(int operand_index) {
258 #ifdef DEBUG 298 switch (interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)) {
259 interpreter::OperandType operand_type = 299 case interpreter::OperandType::kReg8:
260 interpreter::Bytecodes::GetOperandType(bytecode_, operand_index); 300 case interpreter::OperandType::kMaybeReg8:
261 DCHECK(operand_type == interpreter::OperandType::kReg8 || 301 DCHECK_EQ(
262 operand_type == interpreter::OperandType::kMaybeReg8); 302 interpreter::OperandSize::kByte,
263 #endif 303 interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index));
264 return BytecodeOperandSignExtended(operand_index); 304 return BytecodeOperandSignExtended(operand_index);
305 case interpreter::OperandType::kReg16:
306 DCHECK_EQ(
307 interpreter::OperandSize::kShort,
308 interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index));
309 return BytecodeOperandShortSignExtended(operand_index);
310 default:
311 UNREACHABLE();
312 return nullptr;
313 }
265 } 314 }
266 315
267 316
268 Node* InterpreterAssembler::Int32Constant(int value) { 317 Node* InterpreterAssembler::Int32Constant(int value) {
269 return raw_assembler_->Int32Constant(value); 318 return raw_assembler_->Int32Constant(value);
270 } 319 }
271 320
272 321
273 Node* InterpreterAssembler::IntPtrConstant(intptr_t value) { 322 Node* InterpreterAssembler::IntPtrConstant(intptr_t value) {
274 return raw_assembler_->IntPtrConstant(value); 323 return raw_assembler_->IntPtrConstant(value);
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 return raw_assembler_->call_descriptor(); 735 return raw_assembler_->call_descriptor();
687 } 736 }
688 737
689 738
690 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); } 739 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); }
691 740
692 741
693 } // namespace compiler 742 } // namespace compiler
694 } // namespace internal 743 } // namespace internal
695 } // namespace v8 744 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/interpreter-assembler.h ('k') | src/interpreter/bytecode-array-builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698