| Index: src/x64/lithium-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/lithium-codegen-x64.cc (revision 6305)
|
| +++ src/x64/lithium-codegen-x64.cc (working copy)
|
| @@ -73,13 +73,26 @@
|
|
|
|
|
| void LCodeGen::Comment(const char* format, ...) {
|
| - Abort("Unimplemented: %s", "Comment");
|
| + if (!FLAG_code_comments) return;
|
| + char buffer[4 * KB];
|
| + StringBuilder builder(buffer, ARRAY_SIZE(buffer));
|
| + va_list arguments;
|
| + va_start(arguments, format);
|
| + builder.AddFormattedList(format, arguments);
|
| + va_end(arguments);
|
| +
|
| + // Copy the string before recording it in the assembler to avoid
|
| + // issues when the stack allocated buffer goes out of scope.
|
| + size_t length = builder.position();
|
| + Vector<char> copy = Vector<char>::New(length + 1);
|
| + memcpy(copy.start(), builder.Finalize(), copy.length());
|
| + masm()->RecordComment(copy.start());
|
| }
|
|
|
|
|
| bool LCodeGen::GeneratePrologue() {
|
| Abort("Unimplemented: %s", "GeneratePrologue");
|
| - return !is_aborted();
|
| + return false;
|
| }
|
|
|
|
|
| @@ -131,7 +144,7 @@
|
|
|
| bool LCodeGen::GenerateSafepointTable() {
|
| Abort("Unimplemented: %s", "GeneratePrologue");
|
| - return !is_aborted();
|
| + return false;
|
| }
|
|
|
|
|
| @@ -487,7 +500,8 @@
|
|
|
|
|
| void LCodeGen::DoConstantT(LConstantT* instr) {
|
| - Abort("Unimplemented: %s", "DoConstantT");
|
| + ASSERT(instr->result()->IsRegister());
|
| + __ Move(ToRegister(instr->result()), instr->value());
|
| }
|
|
|
|
|
| @@ -561,7 +575,20 @@
|
|
|
|
|
| void LCodeGen::DoGoto(LGoto* instr) {
|
| - Abort("Unimplemented: %s", "DoGoto");
|
| + class DeferredStackCheck: public LDeferredCode {
|
| + public:
|
| + DeferredStackCheck(LCodeGen* codegen, LGoto* instr)
|
| + : LDeferredCode(codegen), instr_(instr) { }
|
| + virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
|
| + private:
|
| + LGoto* instr_;
|
| + };
|
| +
|
| + DeferredStackCheck* deferred = NULL;
|
| + if (instr->include_stack_check()) {
|
| + deferred = new DeferredStackCheck(this, instr);
|
| + }
|
| + EmitGoto(instr->block_id(), deferred);
|
| }
|
|
|
|
|
| @@ -759,7 +786,16 @@
|
|
|
|
|
| void LCodeGen::DoReturn(LReturn* instr) {
|
| - Abort("Unimplemented: %s", "DoReturn");
|
| + if (FLAG_trace) {
|
| + // Preserve the return value on the stack and rely on the runtime
|
| + // call to return the value in the same register.
|
| + __ push(rax);
|
| + __ CallRuntime(Runtime::kTraceExit, 1);
|
| + }
|
| + __ movq(rsp, rbp);
|
| + __ pop(rbp);
|
| + __ ret((ParameterCount() + 1) * kPointerSize);
|
| +
|
| }
|
|
|
|
|
|
|