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

Side by Side Diff: src/IceAssemblerX86Base.h

Issue 1273153002: Subzero. Native 64-bit int arithmetic on x86-64. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Removes the x8664-specific xtest target. Created 5 years, 4 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
OLDNEW
1 //===- subzero/src/IceAssemblerX86Base.h - base x86 assembler -*- C++ -*---===// 1 //===- subzero/src/IceAssemblerX86Base.h - base x86 assembler -*- C++ -*---===//
2 // 2 //
3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
4 // for details. All rights reserved. Use of this source code is governed by a 4 // for details. All rights reserved. Use of this source code is governed by a
5 // BSD-style license that can be found in the LICENSE file. 5 // BSD-style license that can be found in the LICENSE file.
6 // 6 //
7 // Modified by the Subzero authors. 7 // Modified by the Subzero authors.
8 // 8 //
9 //===----------------------------------------------------------------------===// 9 //===----------------------------------------------------------------------===//
10 // 10 //
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 Type, typename Traits::XmmRegister, const Immediate &); 236 Type, typename Traits::XmmRegister, const Immediate &);
237 237
238 struct XmmEmitterShiftOp { 238 struct XmmEmitterShiftOp {
239 TypedEmitXmmXmm XmmXmm; 239 TypedEmitXmmXmm XmmXmm;
240 TypedEmitXmmAddr XmmAddr; 240 TypedEmitXmmAddr XmmAddr;
241 TypedEmitXmmImm XmmImm; 241 TypedEmitXmmImm XmmImm;
242 }; 242 };
243 243
244 // Cross Xmm/GPR cast instructions. 244 // Cross Xmm/GPR cast instructions.
245 template <typename DReg_t, typename SReg_t> struct CastEmitterRegOp { 245 template <typename DReg_t, typename SReg_t> struct CastEmitterRegOp {
246 typedef void (AssemblerX86Base::*TypedEmitRegs)(Type, DReg_t, SReg_t); 246 typedef void (AssemblerX86Base::*TypedEmitRegs)(Type, DReg_t, Type, SReg_t);
247 typedef void (AssemblerX86Base::*TypedEmitAddr)( 247 typedef void (AssemblerX86Base::*TypedEmitAddr)(
248 Type, DReg_t, const typename Traits::Address &); 248 Type, DReg_t, Type, const typename Traits::Address &);
249 249
250 TypedEmitRegs RegReg; 250 TypedEmitRegs RegReg;
251 TypedEmitAddr RegAddr; 251 TypedEmitAddr RegAddr;
252 }; 252 };
253 253
254 // Three operand (potentially) cross Xmm/GPR instructions. 254 // Three operand (potentially) cross Xmm/GPR instructions.
255 // The last operand must be an immediate. 255 // The last operand must be an immediate.
256 template <typename DReg_t, typename SReg_t> struct ThreeOpImmEmitter { 256 template <typename DReg_t, typename SReg_t> struct ThreeOpImmEmitter {
257 typedef void (AssemblerX86Base::*TypedEmitRegRegImm)(Type, DReg_t, SReg_t, 257 typedef void (AssemblerX86Base::*TypedEmitRegRegImm)(Type, DReg_t, SReg_t,
258 const Immediate &); 258 const Immediate &);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 292
293 void mov(Type Ty, typename Traits::GPRRegister dst, const Immediate &src); 293 void mov(Type Ty, typename Traits::GPRRegister dst, const Immediate &src);
294 void mov(Type Ty, typename Traits::GPRRegister dst, 294 void mov(Type Ty, typename Traits::GPRRegister dst,
295 typename Traits::GPRRegister src); 295 typename Traits::GPRRegister src);
296 void mov(Type Ty, typename Traits::GPRRegister dst, 296 void mov(Type Ty, typename Traits::GPRRegister dst,
297 const typename Traits::Address &src); 297 const typename Traits::Address &src);
298 void mov(Type Ty, const typename Traits::Address &dst, 298 void mov(Type Ty, const typename Traits::Address &dst,
299 typename Traits::GPRRegister src); 299 typename Traits::GPRRegister src);
300 void mov(Type Ty, const typename Traits::Address &dst, const Immediate &imm); 300 void mov(Type Ty, const typename Traits::Address &dst, const Immediate &imm);
301 301
302 void movFromAh(const typename Traits::GPRRegister dst); 302 template <typename T = Traits>
303 typename std::enable_if<T::Is64Bit, void>::type
304 movabs(const typename Traits::GPRRegister Dst, uint64_t Imm64);
305 template <typename T = Traits>
306 typename std::enable_if<!T::Is64Bit, void>::type
307 movabs(const typename Traits::GPRRegister, uint64_t) {
308 llvm::report_fatal_error("movabs is only supported in 64-bit x86 targets.");
309 }
303 310
304 void movzx(Type Ty, typename Traits::GPRRegister dst, 311 void movzx(Type Ty, typename Traits::GPRRegister dst,
305 typename Traits::GPRRegister src); 312 typename Traits::GPRRegister src);
306 void movzx(Type Ty, typename Traits::GPRRegister dst, 313 void movzx(Type Ty, typename Traits::GPRRegister dst,
307 const typename Traits::Address &src); 314 const typename Traits::Address &src);
308 void movsx(Type Ty, typename Traits::GPRRegister dst, 315 void movsx(Type Ty, typename Traits::GPRRegister dst,
309 typename Traits::GPRRegister src); 316 typename Traits::GPRRegister src);
310 void movsx(Type Ty, typename Traits::GPRRegister dst, 317 void movsx(Type Ty, typename Traits::GPRRegister dst,
311 const typename Traits::Address &src); 318 const typename Traits::Address &src);
312 319
313 void lea(Type Ty, typename Traits::GPRRegister dst, 320 void lea(Type Ty, typename Traits::GPRRegister dst,
314 const typename Traits::Address &src); 321 const typename Traits::Address &src);
315 322
316 void cmov(Type Ty, typename Traits::Cond::BrCond cond, 323 void cmov(Type Ty, typename Traits::Cond::BrCond cond,
317 typename Traits::GPRRegister dst, typename Traits::GPRRegister src); 324 typename Traits::GPRRegister dst, typename Traits::GPRRegister src);
318 void cmov(Type Ty, typename Traits::Cond::BrCond cond, 325 void cmov(Type Ty, typename Traits::Cond::BrCond cond,
319 typename Traits::GPRRegister dst, 326 typename Traits::GPRRegister dst,
320 const typename Traits::Address &src); 327 const typename Traits::Address &src);
321 328
322 void rep_movsb(); 329 void rep_movsb();
323 330
324 void movss(Type Ty, typename Traits::XmmRegister dst, 331 void movss(Type Ty, typename Traits::XmmRegister dst,
325 const typename Traits::Address &src); 332 const typename Traits::Address &src);
326 void movss(Type Ty, const typename Traits::Address &dst, 333 void movss(Type Ty, const typename Traits::Address &dst,
327 typename Traits::XmmRegister src); 334 typename Traits::XmmRegister src);
328 void movss(Type Ty, typename Traits::XmmRegister dst, 335 void movss(Type Ty, typename Traits::XmmRegister dst,
329 typename Traits::XmmRegister src); 336 typename Traits::XmmRegister src);
330 337
331 void movd(typename Traits::XmmRegister dst, typename Traits::GPRRegister src); 338 void movd(Type SrcTy, typename Traits::XmmRegister dst,
332 void movd(typename Traits::XmmRegister dst, 339 typename Traits::GPRRegister src);
340 void movd(Type SrcTy, typename Traits::XmmRegister dst,
333 const typename Traits::Address &src); 341 const typename Traits::Address &src);
334 void movd(typename Traits::GPRRegister dst, typename Traits::XmmRegister src); 342 void movd(Type DestTy, typename Traits::GPRRegister dst,
335 void movd(const typename Traits::Address &dst, 343 typename Traits::XmmRegister src);
344 void movd(Type DestTy, const typename Traits::Address &dst,
336 typename Traits::XmmRegister src); 345 typename Traits::XmmRegister src);
337 346
338 void movq(typename Traits::XmmRegister dst, typename Traits::XmmRegister src); 347 void movq(typename Traits::XmmRegister dst, typename Traits::XmmRegister src);
339 void movq(const typename Traits::Address &dst, 348 void movq(const typename Traits::Address &dst,
340 typename Traits::XmmRegister src); 349 typename Traits::XmmRegister src);
341 void movq(typename Traits::XmmRegister dst, 350 void movq(typename Traits::XmmRegister dst,
342 const typename Traits::Address &src); 351 const typename Traits::Address &src);
343 352
344 void addss(Type Ty, typename Traits::XmmRegister dst, 353 void addss(Type Ty, typename Traits::XmmRegister dst,
345 typename Traits::XmmRegister src); 354 typename Traits::XmmRegister src);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 void cvtdq2ps(Type, typename Traits::XmmRegister dst, 506 void cvtdq2ps(Type, typename Traits::XmmRegister dst,
498 typename Traits::XmmRegister src); 507 typename Traits::XmmRegister src);
499 void cvtdq2ps(Type, typename Traits::XmmRegister dst, 508 void cvtdq2ps(Type, typename Traits::XmmRegister dst,
500 const typename Traits::Address &src); 509 const typename Traits::Address &src);
501 510
502 void cvttps2dq(Type, typename Traits::XmmRegister dst, 511 void cvttps2dq(Type, typename Traits::XmmRegister dst,
503 typename Traits::XmmRegister src); 512 typename Traits::XmmRegister src);
504 void cvttps2dq(Type, typename Traits::XmmRegister dst, 513 void cvttps2dq(Type, typename Traits::XmmRegister dst,
505 const typename Traits::Address &src); 514 const typename Traits::Address &src);
506 515
507 void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, 516 void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, Type SrcTy,
508 typename Traits::GPRRegister src); 517 typename Traits::GPRRegister src);
509 void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, 518 void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, Type SrcTy,
510 const typename Traits::Address &src); 519 const typename Traits::Address &src);
511 520
512 void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst, 521 void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst,
513 typename Traits::XmmRegister src); 522 typename Traits::XmmRegister src);
514 void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst, 523 void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst,
515 const typename Traits::Address &src); 524 const typename Traits::Address &src);
516 525
517 void cvttss2si(Type SrcTy, typename Traits::GPRRegister dst, 526 void cvttss2si(Type DestTy, typename Traits::GPRRegister dst, Type SrcTy,
518 typename Traits::XmmRegister src); 527 typename Traits::XmmRegister src);
519 void cvttss2si(Type SrcTy, typename Traits::GPRRegister dst, 528 void cvttss2si(Type DestTy, typename Traits::GPRRegister dst, Type SrcTy,
520 const typename Traits::Address &src); 529 const typename Traits::Address &src);
521 530
522 void ucomiss(Type Ty, typename Traits::XmmRegister a, 531 void ucomiss(Type Ty, typename Traits::XmmRegister a,
523 typename Traits::XmmRegister b); 532 typename Traits::XmmRegister b);
524 void ucomiss(Type Ty, typename Traits::XmmRegister a, 533 void ucomiss(Type Ty, typename Traits::XmmRegister a,
525 const typename Traits::Address &b); 534 const typename Traits::Address &b);
526 535
527 void movmskpd(typename Traits::GPRRegister dst, 536 void movmskpd(typename Traits::GPRRegister dst,
528 typename Traits::XmmRegister src); 537 typename Traits::XmmRegister src);
529 void movmskps(typename Traits::GPRRegister dst, 538 void movmskps(typename Traits::GPRRegister dst,
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 const typename Traits::Address &address); 721 const typename Traits::Address &address);
713 void sbb(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 722 void sbb(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
714 void sbb(Type Ty, const typename Traits::Address &address, 723 void sbb(Type Ty, const typename Traits::Address &address,
715 typename Traits::GPRRegister reg); 724 typename Traits::GPRRegister reg);
716 void sbb(Type Ty, const typename Traits::Address &address, 725 void sbb(Type Ty, const typename Traits::Address &address,
717 const Immediate &imm); 726 const Immediate &imm);
718 727
719 void cbw(); 728 void cbw();
720 void cwd(); 729 void cwd();
721 void cdq(); 730 void cdq();
731 template <typename T = Traits>
732 typename std::enable_if<T::Is64Bit, void>::type cqo();
733 template <typename T = Traits>
734 typename std::enable_if<!T::Is64Bit, void>::type cqo() {
735 llvm::report_fatal_error("CQO is only available in 64-bit x86 backends.");
736 }
722 737
723 void div(Type Ty, typename Traits::GPRRegister reg); 738 void div(Type Ty, typename Traits::GPRRegister reg);
724 void div(Type Ty, const typename Traits::Address &address); 739 void div(Type Ty, const typename Traits::Address &address);
725 740
726 void idiv(Type Ty, typename Traits::GPRRegister reg); 741 void idiv(Type Ty, typename Traits::GPRRegister reg);
727 void idiv(Type Ty, const typename Traits::Address &address); 742 void idiv(Type Ty, const typename Traits::Address &address);
728 743
729 void imul(Type Ty, typename Traits::GPRRegister dst, 744 void imul(Type Ty, typename Traits::GPRRegister dst,
730 typename Traits::GPRRegister src); 745 typename Traits::GPRRegister src);
731 void imul(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 746 void imul(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 938
924 template <typename RegType> 939 template <typename RegType>
925 bool is8BitRegisterRequiringRex(const Type Ty, const RegType Reg) { 940 bool is8BitRegisterRequiringRex(const Type Ty, const RegType Reg) {
926 static constexpr bool IsGPR = 941 static constexpr bool IsGPR =
927 std::is_same<typename std::decay<RegType>::type, 942 std::is_same<typename std::decay<RegType>::type,
928 typename Traits::ByteRegister>::value || 943 typename Traits::ByteRegister>::value ||
929 std::is_same<typename std::decay<RegType>::type, 944 std::is_same<typename std::decay<RegType>::type,
930 typename Traits::GPRRegister>::value; 945 typename Traits::GPRRegister>::value;
931 946
932 return IsGPR && (Reg & 0x04) != 0 && (Reg & 0x08) == 0 && 947 return IsGPR && (Reg & 0x04) != 0 && (Reg & 0x08) == 0 &&
933 isByteSizedArithType(Ty); 948 isByteSizedType(Ty);
934 }; 949 };
935 950
936 // assembleAndEmitRex is used for determining which (if any) rex prefix should 951 // assembleAndEmitRex is used for determining which (if any) rex prefix should
937 // be emitted for the current instruction. It allows different types for Reg 952 // be emitted for the current instruction. It allows different types for Reg
938 // and Rm because they could be of different types (e.g., in mov[sz]x 953 // and Rm because they could be of different types (e.g., in mov[sz]x
939 // instrutions.) If Addr is not nullptr, then Rm is ignored, and Rex.B is 954 // instrutions.) If Addr is not nullptr, then Rm is ignored, and Rex.B is
940 // determined by Addr instead. TyRm is still used to determine Addr's size. 955 // determined by Addr instead. TyRm is still used to determine Addr's size.
941 template <typename RegType, typename RmType, typename T = Traits> 956 template <typename RegType, typename RmType, typename T = Traits>
942 typename std::enable_if<T::Is64Bit, void>::type 957 typename std::enable_if<T::Is64Bit, void>::type
943 assembleAndEmitRex(const Type TyReg, const RegType Reg, const Type TyRm, 958 assembleAndEmitRex(const Type TyReg, const RegType Reg, const Type TyRm,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 emitUint8(0x66); 1054 emitUint8(0x66);
1040 } 1055 }
1041 1056
1042 } // end of namespace X86Internal 1057 } // end of namespace X86Internal
1043 1058
1044 } // end of namespace Ice 1059 } // end of namespace Ice
1045 1060
1046 #include "IceAssemblerX86BaseImpl.h" 1061 #include "IceAssemblerX86BaseImpl.h"
1047 1062
1048 #endif // SUBZERO_SRC_ICEASSEMBLERX86BASE_H 1063 #endif // SUBZERO_SRC_ICEASSEMBLERX86BASE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698