| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |