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

Side by Side Diff: src/arm64/instructions-arm64.h

Issue 268353005: ARM64: Fix and improve MacroAssembler::Printf. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Reorganise Simulator::DoPrintf as suggested. Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « src/arm64/assembler-arm64-inl.h ('k') | src/arm64/macro-assembler-arm64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 #ifndef V8_ARM64_INSTRUCTIONS_ARM64_H_ 5 #ifndef V8_ARM64_INSTRUCTIONS_ARM64_H_
6 #define V8_ARM64_INSTRUCTIONS_ARM64_H_ 6 #define V8_ARM64_INSTRUCTIONS_ARM64_H_
7 7
8 #include "globals.h" 8 #include "globals.h"
9 #include "utils.h" 9 #include "utils.h"
10 #include "arm64/constants-arm64.h" 10 #include "arm64/constants-arm64.h"
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 // Indicate to the Debugger that the instruction is a redirected call. 409 // Indicate to the Debugger that the instruction is a redirected call.
410 const Instr kImmExceptionIsRedirectedCall = 0xca11; 410 const Instr kImmExceptionIsRedirectedCall = 0xca11;
411 411
412 // Represent unreachable code. This is used as a guard in parts of the code that 412 // Represent unreachable code. This is used as a guard in parts of the code that
413 // should not be reachable, such as in data encoded inline in the instructions. 413 // should not be reachable, such as in data encoded inline in the instructions.
414 const Instr kImmExceptionIsUnreachable = 0xdebf; 414 const Instr kImmExceptionIsUnreachable = 0xdebf;
415 415
416 // A pseudo 'printf' instruction. The arguments will be passed to the platform 416 // A pseudo 'printf' instruction. The arguments will be passed to the platform
417 // printf method. 417 // printf method.
418 const Instr kImmExceptionIsPrintf = 0xdeb1; 418 const Instr kImmExceptionIsPrintf = 0xdeb1;
419 // Parameters are stored in ARM64 registers as if the printf pseudo-instruction 419 // Most parameters are stored in ARM64 registers as if the printf
420 // was a call to the real printf method: 420 // pseudo-instruction was a call to the real printf method:
421 // 421 // x0: The format string.
422 // x0: The format string, then either of:
423 // x1-x7: Optional arguments. 422 // x1-x7: Optional arguments.
424 // d0-d7: Optional arguments. 423 // d0-d7: Optional arguments.
425 // 424 //
426 // Floating-point and integer arguments are passed in separate sets of 425 // Also, the argument layout is described inline in the instructions:
427 // registers in AAPCS64 (even for varargs functions), so it is not possible to 426 // - arg_count: The number of arguments.
428 // determine the type of location of each arguments without some information 427 // - arg_pattern: A set of PrintfArgPattern values, packed into two-bit fields.
429 // about the values that were passed in. This information could be retrieved 428 //
430 // from the printf format string, but the format string is not trivial to 429 // Floating-point and integer arguments are passed in separate sets of registers
431 // parse so we encode the relevant information with the HLT instruction. 430 // in AAPCS64 (even for varargs functions), so it is not possible to determine
432 // - Type 431 // the type of each argument without some information about the values that were
433 // Either kRegister or kFPRegister, but stored as a uint32_t because there's 432 // passed in. This information could be retrieved from the printf format string,
434 // no way to guarantee the size of the CPURegister::RegisterType enum. 433 // but the format string is not trivial to parse so we encode the relevant
435 const unsigned kPrintfTypeOffset = 1 * kInstructionSize; 434 // information with the HLT instruction.
436 const unsigned kPrintfLength = 2 * kInstructionSize; 435 const unsigned kPrintfArgCountOffset = 1 * kInstructionSize;
436 const unsigned kPrintfArgPatternListOffset = 2 * kInstructionSize;
437 const unsigned kPrintfLength = 3 * kInstructionSize;
438
439 const unsigned kPrintfMaxArgCount = 4;
440
441 // The argument pattern is a set of two-bit-fields, each with one of the
442 // following values:
443 enum PrintfArgPattern {
444 kPrintfArgW = 1,
445 kPrintfArgX = 2,
446 // There is no kPrintfArgS because floats are always converted to doubles in C
447 // varargs calls.
448 kPrintfArgD = 3
449 };
450 static const unsigned kPrintfArgPatternBits = 2;
437 451
438 // A pseudo 'debug' instruction. 452 // A pseudo 'debug' instruction.
439 const Instr kImmExceptionIsDebug = 0xdeb0; 453 const Instr kImmExceptionIsDebug = 0xdeb0;
440 // Parameters are inlined in the code after a debug pseudo-instruction: 454 // Parameters are inlined in the code after a debug pseudo-instruction:
441 // - Debug code. 455 // - Debug code.
442 // - Debug parameters. 456 // - Debug parameters.
443 // - Debug message string. This is a NULL-terminated ASCII string, padded to 457 // - Debug message string. This is a NULL-terminated ASCII string, padded to
444 // kInstructionSize so that subsequent instructions are correctly aligned. 458 // kInstructionSize so that subsequent instructions are correctly aligned.
445 // - A kImmExceptionIsUnreachable marker, to catch accidental execution of the 459 // - A kImmExceptionIsUnreachable marker, to catch accidental execution of the
446 // string data. 460 // string data.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 TRACE_ENABLE = 1 << 6, 500 TRACE_ENABLE = 1 << 6,
487 TRACE_DISABLE = 2 << 6, 501 TRACE_DISABLE = 2 << 6,
488 TRACE_OVERRIDE = 3 << 6 502 TRACE_OVERRIDE = 3 << 6
489 }; 503 };
490 504
491 505
492 } } // namespace v8::internal 506 } } // namespace v8::internal
493 507
494 508
495 #endif // V8_ARM64_INSTRUCTIONS_ARM64_H_ 509 #endif // V8_ARM64_INSTRUCTIONS_ARM64_H_
OLDNEW
« no previous file with comments | « src/arm64/assembler-arm64-inl.h ('k') | src/arm64/macro-assembler-arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698