Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f0b3173ff79b80306a6337d1156e71d671279685 |
--- /dev/null |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -0,0 +1,66 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+#include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
+#if defined(TARGET_ARCH_X64) |
+ |
+#include "vm/flow_graph_compiler.h" |
+#include "vm/locations.h" |
+ |
+#define __ compiler->assembler()-> |
+ |
+namespace dart { |
+ |
+ |
+static LocationSummary* MakeSimpleLocationSummary( |
+ intptr_t input_count, Location out) { |
+ LocationSummary* summary = new LocationSummary(input_count); |
+ for (intptr_t i = 0; i < input_count; i++) { |
+ summary->set_in(i, UnallocatedLocation::Register()); |
+ } |
+ summary->set_out(out); |
+ return summary; |
+} |
+ |
+ |
+LocationSummary* StrictCompareComp::MakeLocationSummary() { |
+ return MakeSimpleLocationSummary(2, UnallocatedLocation::SameAsFirstInput()); |
+} |
+ |
+ |
+void StrictCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ const Bool& bool_true = Bool::ZoneHandle(Bool::True()); |
+ const Bool& bool_false = Bool::ZoneHandle(Bool::False()); |
+ |
+ Register left = locs()->in(0).AsRegister(); |
+ Register right = locs()->in(1).AsRegister(); |
+ Register result = locs()->out().AsRegister(); |
+ |
+ __ cmpq(left, right); |
+ Label load_true, done; |
+ if (kind() == Token::kEQ_STRICT) { |
+ __ j(EQUAL, &load_true, Assembler::kNearJump); |
+ } else { |
+ __ j(NOT_EQUAL, &load_true, Assembler::kNearJump); |
+ } |
+ __ LoadObject(result, bool_false); |
+ __ jmp(&done, Assembler::kNearJump); |
+ __ Bind(&load_true); |
+ __ LoadObject(result, bool_true); |
+ __ Bind(&done); |
+} |
+ |
+ |
+void BindInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ computation()->EmitNativeCode(compiler); |
+ __ pushq(locs()->out().AsRegister()); |
+} |
+ |
+ |
+#undef __ |
+ |
+ |
+} // namespace dart |
+ |
+#endif // defined TARGET_ARCH_X64 |