| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/heap.h" | 9 #include "vm/heap.h" |
| 10 #include "vm/memory_region.h" | 10 #include "vm/memory_region.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 | 36 |
| 37 void Assembler::call(Label* label) { | 37 void Assembler::call(Label* label) { |
| 38 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 38 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 39 static const int kSize = 5; | 39 static const int kSize = 5; |
| 40 EmitUint8(0xE8); | 40 EmitUint8(0xE8); |
| 41 EmitLabel(label, kSize); | 41 EmitLabel(label, kSize); |
| 42 } | 42 } |
| 43 | 43 |
| 44 | 44 |
| 45 void Assembler::call(const ExternalLabel* label) { | 45 void Assembler::call(const ExternalLabel* label) { |
| 46 movq(R11, Immediate(label->address())); | 46 movq(TMP, Immediate(label->address())); |
| 47 call(R11); | 47 call(TMP); |
| 48 } | 48 } |
| 49 | 49 |
| 50 | 50 |
| 51 void Assembler::pushq(Register reg) { | 51 void Assembler::pushq(Register reg) { |
| 52 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 52 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 53 EmitRegisterREX(reg, REX_NONE); | 53 EmitRegisterREX(reg, REX_NONE); |
| 54 EmitUint8(0x50 | (reg & 7)); | 54 EmitUint8(0x50 | (reg & 7)); |
| 55 } | 55 } |
| 56 | 56 |
| 57 | 57 |
| (...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 EmitUint8(0xEB); | 1068 EmitUint8(0xEB); |
| 1069 EmitNearLabelLink(label); | 1069 EmitNearLabelLink(label); |
| 1070 } else { | 1070 } else { |
| 1071 EmitUint8(0xE9); | 1071 EmitUint8(0xE9); |
| 1072 EmitLabelLink(label); | 1072 EmitLabelLink(label); |
| 1073 } | 1073 } |
| 1074 } | 1074 } |
| 1075 | 1075 |
| 1076 | 1076 |
| 1077 void Assembler::jmp(const ExternalLabel* label) { | 1077 void Assembler::jmp(const ExternalLabel* label) { |
| 1078 movq(R11, Immediate(label->address())); | 1078 movq(TMP, Immediate(label->address())); |
| 1079 jmp(R11); | 1079 jmp(TMP); |
| 1080 } | 1080 } |
| 1081 | 1081 |
| 1082 | 1082 |
| 1083 void Assembler::lock() { | 1083 void Assembler::lock() { |
| 1084 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1084 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1085 EmitUint8(0xF0); | 1085 EmitUint8(0xF0); |
| 1086 } | 1086 } |
| 1087 | 1087 |
| 1088 | 1088 |
| 1089 void Assembler::cmpxchgl(const Address& address, Register reg) { | 1089 void Assembler::cmpxchgl(const Address& address, Register reg) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1117 if (value == 1) { | 1117 if (value == 1) { |
| 1118 decq(reg); | 1118 decq(reg); |
| 1119 } else if (value != 0) { | 1119 } else if (value != 0) { |
| 1120 subq(reg, Immediate(value)); | 1120 subq(reg, Immediate(value)); |
| 1121 } | 1121 } |
| 1122 } | 1122 } |
| 1123 } | 1123 } |
| 1124 | 1124 |
| 1125 | 1125 |
| 1126 void Assembler::LoadObject(Register dst, const Object& object) { | 1126 void Assembler::LoadObject(Register dst, const Object& object) { |
| 1127 UNIMPLEMENTED(); | |
| 1128 ASSERT(object.IsZoneHandle()); | 1127 ASSERT(object.IsZoneHandle()); |
| 1129 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1128 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1130 EmitUint8(0xB8 + dst); | 1129 EmitRegisterREX(dst, REX_W); |
| 1130 EmitUint8(0xB8 | (dst & 7)); |
| 1131 buffer_.EmitObject(object); | 1131 buffer_.EmitObject(object); |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 | 1134 |
| 1135 void Assembler::PushObject(const Object& object) { | 1135 void Assembler::PushObject(const Object& object) { |
| 1136 UNIMPLEMENTED(); | 1136 LoadObject(TMP, object); |
| 1137 ASSERT(object.IsZoneHandle()); | 1137 pushq(TMP); |
| 1138 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1139 EmitUint8(0x68); | |
| 1140 buffer_.EmitObject(object); | |
| 1141 } | 1138 } |
| 1142 | 1139 |
| 1143 | 1140 |
| 1144 void Assembler::CompareObject(Register reg, const Object& object) { | 1141 void Assembler::CompareObject(Register reg, const Object& object) { |
| 1145 UNIMPLEMENTED(); | 1142 ASSERT(reg != TMP); |
| 1146 ASSERT(object.IsZoneHandle()); | 1143 LoadObject(TMP, object); |
| 1147 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1144 cmpq(reg, TMP); |
| 1148 if (reg == RAX) { | |
| 1149 EmitUint8(0x05 + (7 << 3)); | |
| 1150 buffer_.EmitObject(object); | |
| 1151 } else { | |
| 1152 EmitUint8(0x81); | |
| 1153 EmitOperand(7, Operand(reg)); | |
| 1154 buffer_.EmitObject(object); | |
| 1155 } | |
| 1156 } | 1145 } |
| 1157 | 1146 |
| 1158 | 1147 |
| 1159 void Assembler::Stop(const char* message) { | 1148 void Assembler::Stop(const char* message) { |
| 1160 // Emit the lower half and the higher half of the message address as immediate | 1149 // Emit the lower half and the higher half of the message address as immediate |
| 1161 // operands in the test rax instructions, followed by the int3 instruction. | 1150 // operands in the test rax instructions, followed by the int3 instruction. |
| 1162 // Execution can be resumed with the 'cont' command in gdb. | 1151 // Execution can be resumed with the 'cont' command in gdb. |
| 1163 int64_t message_address = reinterpret_cast<int64_t>(message); | 1152 int64_t message_address = reinterpret_cast<int64_t>(message); |
| 1164 testl(RAX, Immediate(Utils::Low32Bits(message_address))); | 1153 testl(RAX, Immediate(Utils::Low32Bits(message_address))); |
| 1165 testl(RAX, Immediate(Utils::High32Bits(message_address))); | 1154 testl(RAX, Immediate(Utils::High32Bits(message_address))); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 } else { | 1292 } else { |
| 1304 EmitRegisterREX(operand, REX_NONE); | 1293 EmitRegisterREX(operand, REX_NONE); |
| 1305 } | 1294 } |
| 1306 EmitUint8(0xD3); | 1295 EmitUint8(0xD3); |
| 1307 EmitOperand(rm, Operand(operand)); | 1296 EmitOperand(rm, Operand(operand)); |
| 1308 } | 1297 } |
| 1309 | 1298 |
| 1310 } // namespace dart | 1299 } // namespace dart |
| 1311 | 1300 |
| 1312 #endif // defined TARGET_ARCH_X64 | 1301 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |