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

Side by Side Diff: runtime/vm/assembler_x64.cc

Issue 130803013: IA32 and X64 assembler Float64x2 additions (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 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 | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('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 (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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698