| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1038 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1039 EmitREX_RB(dst, src); | 1039 EmitREX_RB(dst, src); |
| 1040 EmitUint8(0x0F); | 1040 EmitUint8(0x0F); |
| 1041 EmitUint8(0xC6); | 1041 EmitUint8(0xC6); |
| 1042 EmitXmmRegisterOperand(dst & 7, src); | 1042 EmitXmmRegisterOperand(dst & 7, src); |
| 1043 ASSERT(imm.is_uint8()); | 1043 ASSERT(imm.is_uint8()); |
| 1044 EmitUint8(imm.value()); | 1044 EmitUint8(imm.value()); |
| 1045 } | 1045 } |
| 1046 | 1046 |
| 1047 | 1047 |
| 1048 void Assembler::addpd(XmmRegister dst, XmmRegister src) { |
| 1049 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1050 ASSERT(src <= XMM15); |
| 1051 ASSERT(dst <= XMM15); |
| 1052 EmitUint8(0x66); |
| 1053 EmitREX_RB(dst, src); |
| 1054 EmitUint8(0x0F); |
| 1055 EmitUint8(0x58); |
| 1056 EmitXmmRegisterOperand(dst & 7, src); |
| 1057 } |
| 1058 |
| 1059 |
| 1060 void Assembler::negatepd(XmmRegister dst) { |
| 1061 static const struct ALIGN16 { |
| 1062 uint64_t a; |
| 1063 uint64_t b; |
| 1064 } double_negate_constant = |
| 1065 { 0x8000000000000000LL, 0x8000000000000000LL }; |
| 1066 LoadImmediate( |
| 1067 TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)), PP); |
| 1068 xorpd(dst, Address(TMP, 0)); |
| 1069 } |
| 1070 |
| 1071 |
| 1072 void Assembler::subpd(XmmRegister dst, XmmRegister src) { |
| 1073 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1074 ASSERT(src <= XMM15); |
| 1075 ASSERT(dst <= XMM15); |
| 1076 EmitUint8(0x66); |
| 1077 EmitREX_RB(dst, src); |
| 1078 EmitUint8(0x0F); |
| 1079 EmitUint8(0x5C); |
| 1080 EmitXmmRegisterOperand(dst & 7, src); |
| 1081 } |
| 1082 |
| 1083 |
| 1084 void Assembler::mulpd(XmmRegister dst, XmmRegister src) { |
| 1085 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1086 ASSERT(src <= XMM15); |
| 1087 ASSERT(dst <= XMM15); |
| 1088 EmitUint8(0x66); |
| 1089 EmitREX_RB(dst, src); |
| 1090 EmitUint8(0x0F); |
| 1091 EmitUint8(0x59); |
| 1092 EmitXmmRegisterOperand(dst & 7, src); |
| 1093 } |
| 1094 |
| 1095 |
| 1096 void Assembler::divpd(XmmRegister dst, XmmRegister src) { |
| 1097 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1098 ASSERT(src <= XMM15); |
| 1099 ASSERT(dst <= XMM15); |
| 1100 EmitUint8(0x66); |
| 1101 EmitREX_RB(dst, src); |
| 1102 EmitUint8(0x0F); |
| 1103 EmitUint8(0x5E); |
| 1104 EmitXmmRegisterOperand(dst & 6, src); |
| 1105 } |
| 1106 |
| 1107 |
| 1108 void Assembler::abspd(XmmRegister dst) { |
| 1109 static const struct ALIGN16 { |
| 1110 uint64_t a; |
| 1111 uint64_t b; |
| 1112 } double_absolute_const = |
| 1113 { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL }; |
| 1114 LoadImmediate( |
| 1115 TMP, Immediate(reinterpret_cast<intptr_t>(&double_absolute_const)), PP); |
| 1116 andpd(dst, Address(TMP, 0)); |
| 1117 } |
| 1118 |
| 1119 |
| 1120 void Assembler::minpd(XmmRegister dst, XmmRegister src) { |
| 1121 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1122 ASSERT(src <= XMM15); |
| 1123 ASSERT(dst <= XMM15); |
| 1124 EmitUint8(0x66); |
| 1125 EmitREX_RB(dst, src); |
| 1126 EmitUint8(0x0F); |
| 1127 EmitUint8(0x5D); |
| 1128 EmitXmmRegisterOperand(dst & 7, src); |
| 1129 } |
| 1130 |
| 1131 |
| 1132 void Assembler::maxpd(XmmRegister dst, XmmRegister src) { |
| 1133 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1134 ASSERT(src <= XMM15); |
| 1135 ASSERT(dst <= XMM15); |
| 1136 EmitUint8(0x66); |
| 1137 EmitREX_RB(dst, src); |
| 1138 EmitUint8(0x0F); |
| 1139 EmitUint8(0x5F); |
| 1140 EmitXmmRegisterOperand(dst & 7, src); |
| 1141 } |
| 1142 |
| 1143 |
| 1144 void Assembler::sqrtpd(XmmRegister dst) { |
| 1145 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1146 ASSERT(dst <= XMM15); |
| 1147 EmitUint8(0x66); |
| 1148 EmitREX_RB(dst, dst); |
| 1149 EmitUint8(0x0F); |
| 1150 EmitUint8(0x51); |
| 1151 EmitXmmRegisterOperand(dst & 7, dst); |
| 1152 } |
| 1153 |
| 1154 |
| 1155 void Assembler::cvtps2pd(XmmRegister dst, XmmRegister src) { |
| 1156 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1157 ASSERT(src <= XMM15); |
| 1158 ASSERT(dst <= XMM15); |
| 1159 EmitREX_RB(dst, src); |
| 1160 EmitUint8(0x0F); |
| 1161 EmitUint8(0x5A); |
| 1162 EmitXmmRegisterOperand(dst & 7, src); |
| 1163 } |
| 1164 |
| 1165 |
| 1166 void Assembler::cvtpd2ps(XmmRegister dst, XmmRegister src) { |
| 1167 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1168 ASSERT(src <= XMM15); |
| 1169 ASSERT(dst <= XMM15); |
| 1170 EmitUint8(0x66); |
| 1171 EmitREX_RB(dst, src); |
| 1172 EmitUint8(0x0F); |
| 1173 EmitUint8(0x5A); |
| 1174 EmitXmmRegisterOperand(dst & 7, src); |
| 1175 } |
| 1176 |
| 1177 |
| 1048 void Assembler::comisd(XmmRegister a, XmmRegister b) { | 1178 void Assembler::comisd(XmmRegister a, XmmRegister b) { |
| 1049 ASSERT(a <= XMM15); | 1179 ASSERT(a <= XMM15); |
| 1050 ASSERT(b <= XMM15); | 1180 ASSERT(b <= XMM15); |
| 1051 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1181 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1052 EmitUint8(0x66); | 1182 EmitUint8(0x66); |
| 1053 EmitREX_RB(a, b); | 1183 EmitREX_RB(a, b); |
| 1054 EmitUint8(0x0F); | 1184 EmitUint8(0x0F); |
| 1055 EmitUint8(0x2F); | 1185 EmitUint8(0x2F); |
| 1056 EmitXmmRegisterOperand(a & 7, b); | 1186 EmitXmmRegisterOperand(a & 7, b); |
| 1057 } | 1187 } |
| (...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3168 | 3298 |
| 3169 | 3299 |
| 3170 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3300 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3171 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 3301 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 3172 return xmm_reg_names[reg]; | 3302 return xmm_reg_names[reg]; |
| 3173 } | 3303 } |
| 3174 | 3304 |
| 3175 } // namespace dart | 3305 } // namespace dart |
| 3176 | 3306 |
| 3177 #endif // defined TARGET_ARCH_X64 | 3307 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |