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

Side by Side Diff: src/x64/assembler-x64.cc

Issue 764863002: [x64] introduce vex prefix version of float64 arithmetic binop (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments Created 6 years 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
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/assembler-x64-inl.h » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X64 7 #if V8_TARGET_ARCH_X64
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/macro-assembler.h" 10 #include "src/macro-assembler.h"
(...skipping 3164 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) { 3175 void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
3176 EnsureSpace ensure_space(this); 3176 EnsureSpace ensure_space(this);
3177 emit(0x66); 3177 emit(0x66);
3178 emit_optional_rex_32(dst, src); 3178 emit_optional_rex_32(dst, src);
3179 emit(0x0F); 3179 emit(0x0F);
3180 emit(0x76); 3180 emit(0x76);
3181 emit_sse_operand(dst, src); 3181 emit_sse_operand(dst, src);
3182 } 3182 }
3183 3183
3184 3184
3185 // byte 1 of 3-byte VEX 3185 // AVX instructions
3186 void Assembler::emit_vex3_byte1(XMMRegister reg, XMMRegister rm, byte m) {
3187 DCHECK(1 <= m && m <= 3);
3188 byte rxb = ~((reg.high_bit() << 2) | rm.high_bit()) << 5;
3189 emit(rxb | m);
3190 }
3191
3192
3193 // byte 1 of 3-byte VEX
3194 void Assembler::emit_vex3_byte1(XMMRegister reg, const Operand& rm, byte m) {
3195 DCHECK(1 <= m && m <= 3);
3196 byte rxb = ~((reg.high_bit() << 2) | rm.rex_) << 5;
3197 emit(rxb | m);
3198 }
3199
3200
3201 // byte 1 of 2-byte VEX
3202 void Assembler::emit_vex2_byte1(XMMRegister reg, XMMRegister v, byte lpp) {
3203 DCHECK(lpp <= 3);
3204 byte rv = ~((reg.high_bit() << 4) | v.code()) << 3;
3205 emit(rv | lpp);
3206 }
3207
3208
3209 // byte 2 of 3-byte VEX
3210 void Assembler::emit_vex3_byte2(byte w, XMMRegister v, byte lpp) {
3211 DCHECK(w <= 1);
3212 DCHECK(lpp <= 3);
3213 emit((w << 7) | ((~v.code() & 0xf) << 3) | lpp);
3214 }
3215
3216
3217 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1, 3186 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
3218 XMMRegister src2) { 3187 XMMRegister src2) {
3219 DCHECK(IsEnabled(FMA3)); 3188 DCHECK(IsEnabled(FMA3));
3220 EnsureSpace ensure_space(this); 3189 EnsureSpace ensure_space(this);
3221 emit_vex3_byte0(); 3190 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW1);
3222 emit_vex3_byte1(dst, src2, 0x02);
3223 emit_vex3_byte2(0x1, src1, 0x01);
3224 emit(op); 3191 emit(op);
3225 emit_sse_operand(dst, src2); 3192 emit_sse_operand(dst, src2);
3226 } 3193 }
3227 3194
3228 3195
3229 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1, 3196 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
3230 const Operand& src2) { 3197 const Operand& src2) {
3231 DCHECK(IsEnabled(FMA3)); 3198 DCHECK(IsEnabled(FMA3));
3232 EnsureSpace ensure_space(this); 3199 EnsureSpace ensure_space(this);
3233 emit_vex3_byte0(); 3200 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW1);
3234 emit_vex3_byte1(dst, src2, 0x02);
3235 emit_vex3_byte2(0x1, src1, 0x01);
3236 emit(op); 3201 emit(op);
3237 emit_sse_operand(dst, src2); 3202 emit_sse_operand(dst, src2);
3238 } 3203 }
3239 3204
3240 3205
3241 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1, 3206 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
3242 XMMRegister src2) { 3207 XMMRegister src2) {
3243 DCHECK(IsEnabled(FMA3)); 3208 DCHECK(IsEnabled(FMA3));
3244 EnsureSpace ensure_space(this); 3209 EnsureSpace ensure_space(this);
3245 emit_vex3_byte0(); 3210 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW0);
3246 emit_vex3_byte1(dst, src2, 0x02);
3247 emit_vex3_byte2(0x0, src1, 0x01);
3248 emit(op); 3211 emit(op);
3249 emit_sse_operand(dst, src2); 3212 emit_sse_operand(dst, src2);
3250 } 3213 }
3251 3214
3252 3215
3253 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1, 3216 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
3254 const Operand& src2) { 3217 const Operand& src2) {
3255 DCHECK(IsEnabled(FMA3)); 3218 DCHECK(IsEnabled(FMA3));
3256 EnsureSpace ensure_space(this); 3219 EnsureSpace ensure_space(this);
3257 emit_vex3_byte0(); 3220 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW0);
3258 emit_vex3_byte1(dst, src2, 0x02);
3259 emit_vex3_byte2(0x0, src1, 0x01);
3260 emit(op); 3221 emit(op);
3261 emit_sse_operand(dst, src2); 3222 emit_sse_operand(dst, src2);
3262 } 3223 }
3224
3225
3226 void Assembler::vsd(byte op, XMMRegister dst, XMMRegister src1,
3227 XMMRegister src2) {
3228 DCHECK(IsEnabled(AVX));
3229 EnsureSpace ensure_space(this);
3230 emit_vex_prefix(dst, src1, src2, kLIG, kF2, k0F, kWIG);
3231 emit(op);
3232 emit_sse_operand(dst, src2);
3233 }
3234
3235
3236 void Assembler::vsd(byte op, XMMRegister dst, XMMRegister src1,
3237 const Operand& src2) {
3238 DCHECK(IsEnabled(AVX));
3239 EnsureSpace ensure_space(this);
3240 emit_vex_prefix(dst, src1, src2, kLIG, kF2, k0F, kWIG);
3241 emit(op);
3242 emit_sse_operand(dst, src2);
3243 }
3263 3244
3264 3245
3265 void Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 3246 void Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
3266 Register ireg = { reg.code() }; 3247 Register ireg = { reg.code() };
3267 emit_operand(ireg, adr); 3248 emit_operand(ireg, adr);
3268 } 3249 }
3269 3250
3270 3251
3271 void Assembler::emit_sse_operand(Register reg, const Operand& adr) { 3252 void Assembler::emit_sse_operand(Register reg, const Operand& adr) {
3272 Register ireg = {reg.code()}; 3253 Register ireg = {reg.code()};
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3369 3350
3370 3351
3371 bool RelocInfo::IsInConstantPool() { 3352 bool RelocInfo::IsInConstantPool() {
3372 return false; 3353 return false;
3373 } 3354 }
3374 3355
3375 3356
3376 } } // namespace v8::internal 3357 } } // namespace v8::internal
3377 3358
3378 #endif // V8_TARGET_ARCH_X64 3359 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/assembler-x64-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698