From b9b1ad6fae2286d5ad36a82fd1d90fd9b3886e9b Mon Sep 17 00:00:00 2001 From: kobalicek Date: Sat, 2 Jan 2016 16:24:54 +0100 Subject: [PATCH] Added ASMJIT_NOT_REACHED() to better deal with unreachable code. Added Visual Studio 2015 scripts and fixed asmjit_test_x86 which now compiles under VS2015 Added StringLogger::getLength() Added methods to X86Compiler to create a variable operand by its ID --- README.md | 4 +- src/asmjit/base/compiler.h | 2 +- src/asmjit/base/compilercontext.cpp | 8 +- src/asmjit/base/globals.h | 8 +- src/asmjit/base/logger.h | 5 + src/asmjit/build.h | 48 +++++++--- src/asmjit/x86/x86assembler.cpp | 7 +- src/asmjit/x86/x86compiler.cpp | 2 +- src/asmjit/x86/x86compiler.h | 128 ++++++++++++++++---------- src/asmjit/x86/x86compilercontext.cpp | 76 +++++++-------- src/test/asmjit_test_x86.cpp | 2 +- tools/configure-win-vs2015-x64.bat | 9 ++ tools/configure-win-vs2015-x86.bat | 9 ++ 13 files changed, 195 insertions(+), 113 deletions(-) create mode 100644 tools/configure-win-vs2015-x64.bat create mode 100644 tools/configure-win-vs2015-x86.bat diff --git a/README.md b/README.md index 790e7c8..b05e819 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ Supported Environments * CLang (tested by Travis-CI) * GCC (tested by Travis-CI) * MinGW (tested manually) - * MSVC (tested manually) - * Other compilers require some testing and support in `asmjit/build.h` header + * MSVC (tested manually, at least Visual Studio 2003 required) + * Other compilers require some testing and support in `asmjit/build.h` ### Backends diff --git a/src/asmjit/base/compiler.h b/src/asmjit/base/compiler.h index 3980c91..13d2962 100644 --- a/src/asmjit/base/compiler.h +++ b/src/asmjit/base/compiler.h @@ -358,7 +358,7 @@ struct ASMJIT_VIRTAPI Compiler : public CodeGen { ASMJIT_API VarData* _newVd(uint32_t type, uint32_t size, uint32_t c, const char* name); //! Create a new `Var`. - virtual Error _newVar(Var* var, uint32_t type, const char* name, va_list ap) = 0; + virtual Error _newVar(Var* var, uint32_t vType, const char* name, va_list ap) = 0; //! Alloc variable `var`. ASMJIT_API Error alloc(Var& var); diff --git a/src/asmjit/base/compilercontext.cpp b/src/asmjit/base/compilercontext.cpp index b588eb7..19802ac 100644 --- a/src/asmjit/base/compilercontext.cpp +++ b/src/asmjit/base/compilercontext.cpp @@ -129,7 +129,9 @@ VarCell* Context::_newVarCell(VarData* vd) { case 16: _mem16ByteVarsUsed++; break; case 32: _mem32ByteVarsUsed++; break; case 64: _mem64ByteVarsUsed++; break; - default: ASMJIT_ASSERT(!"Reached"); + + default: + ASMJIT_NOT_REACHED(); } } @@ -229,7 +231,9 @@ Error Context::resolveCellOffsets() { case 16: offset = pos16; pos16 += 16; break; case 32: offset = pos32; pos32 += 32; break; case 64: offset = pos64; pos64 += 64; break; - default: ASMJIT_ASSERT(!"Reached"); + + default: + ASMJIT_NOT_REACHED(); } varCell->setOffset(static_cast(offset)); diff --git a/src/asmjit/base/globals.h b/src/asmjit/base/globals.h index 84ef188..4762e47 100644 --- a/src/asmjit/base/globals.h +++ b/src/asmjit/base/globals.h @@ -237,7 +237,7 @@ ASMJIT_API void debugOutput(const char* str); //! If you have problems with assertions put a breakpoint at assertionFailed() //! function (asmjit/base/globals.cpp) and check the call stack to locate the //! failing code. -ASMJIT_API void assertionFailed(const char* file, int line, const char* msg); +ASMJIT_API void ASMJIT_NORETURN assertionFailed(const char* file, int line, const char* msg); //! \} @@ -258,8 +258,14 @@ ASMJIT_API void assertionFailed(const char* file, int line, const char* msg); #exp); \ } \ } while (0) +# define ASMJIT_NOT_REACHED() \ + ::asmjit::DebugUtils::assertionFailed( \ + __FILE__ + ::asmjit::DebugUtils::kSourceRelativePathOffset, \ + __LINE__, \ + "MUST NOT BE REACHED") #else # define ASMJIT_ASSERT(exp) ASMJIT_NOP +# define ASMJIT_NOT_REACHED() ASMJIT_ASSUME(0) #endif // DEBUG // ============================================================================ diff --git a/src/asmjit/base/logger.h b/src/asmjit/base/logger.h index b6aa7c3..a0d3e5b 100644 --- a/src/asmjit/base/logger.h +++ b/src/asmjit/base/logger.h @@ -235,6 +235,11 @@ struct ASMJIT_VIRTAPI StringLogger : public Logger { return _stringBuilder.getData(); } + //! Get the length of the string returned by `getString()`. + ASMJIT_INLINE size_t getLength() const { + return _stringBuilder.getLength(); + } + //! Clear the resulting string. ASMJIT_INLINE void clearString() { _stringBuilder.clear(); diff --git a/src/asmjit/build.h b/src/asmjit/build.h index 72f83b5..555353d 100644 --- a/src/asmjit/build.h +++ b/src/asmjit/build.h @@ -605,6 +605,18 @@ #endif // [@CC_NOINLINE}@] +// [@CC_NORETURN{@] +// \def ASMJIT_NORETURN +// The decorated function never returns (exit, assertion failure, etc...). +#if ASMJIT_CC_HAS_ATTRIBUTE_NORETURN +# define ASMJIT_NORETURN __attribute__((__noreturn__)) +#elif ASMJIT_CC_HAS_DECLSPEC_NORETURN +# define ASMJIT_NORETURN __declspec(noreturn) +#else +# define ASMJIT_NORETURN +#endif +// [@CC_NORETURN}@] + // [@CC_CDECL{@] // \def ASMJIT_CDECL // Standard C function calling convention decorator (__cdecl). @@ -665,6 +677,20 @@ #endif // [@CC_NOP}@] +// [@CC_ASSUME{@] +// \def ASMJIT_ASSUME(exp) +// Assume that the expression exp is always true. +#if ASMJIT_CC_HAS_ASSUME +# define ASMJIT_ASSUME(exp) __assume(exp) +#elif ASMJIT_CC_HAS_BUILTIN_ASSUME +# define ASMJIT_ASSUME(exp) __builtin_assume(exp) +#elif ASMJIT_CC_HAS_BUILTIN_UNREACHABLE +# define ASMJIT_ASSUME(exp) do { if (!(exp)) __builtin_unreachable(); } while (0) +#else +# define ASMJIT_ASSUME(exp) ((void)0) +#endif +// [@CC_ASSUME}@] + // [@CC_EXPECT{@] // \def ASMJIT_LIKELY(exp) // Expression exp is likely to be true. @@ -775,31 +801,31 @@ typedef unsigned __int64 uint64_t; #endif // ASMJIT_BUILD_HOST #if defined(_MSC_VER) && _MSC_VER >= 1400 -# define ASMJIT_ENUM(_Name_) enum _Name_ : uint32_t +# define ASMJIT_ENUM(name) enum name : uint32_t #else -# define ASMJIT_ENUM(_Name_) enum _Name_ +# define ASMJIT_ENUM(name) enum name #endif #if ASMJIT_ARCH_LE -# define _ASMJIT_ARCH_INDEX(_Total_, _Index_) (_Index_) +# define _ASMJIT_ARCH_INDEX(total, index) (index) #else -# define _ASMJIT_ARCH_INDEX(_Total_, _Index_) ((_Total_) - 1 - (_Index_)) +# define _ASMJIT_ARCH_INDEX(total, index) ((total) - 1 - (index)) #endif #if !defined(ASMJIT_ALLOC) && !defined(ASMJIT_REALLOC) && !defined(ASMJIT_FREE) -# define ASMJIT_ALLOC(_Size_) ::malloc(_Size_) -# define ASMJIT_REALLOC(_Ptr_, _Size_) ::realloc(_Ptr_, _Size_) -# define ASMJIT_FREE(_Ptr_) ::free(_Ptr_) +# define ASMJIT_ALLOC(size) ::malloc(size) +# define ASMJIT_REALLOC(ptr, size) ::realloc(ptr, size) +# define ASMJIT_FREE(ptr) ::free(ptr) #else # if !defined(ASMJIT_ALLOC) || !defined(ASMJIT_REALLOC) || !defined(ASMJIT_FREE) -# error "[asmjit] You must redefine ASMJIT_ALLOC, ASMJIT_REALLOC and ASMJIT_FREE." +# error "[asmjit] You must provide ASMJIT_ALLOC, ASMJIT_REALLOC and ASMJIT_FREE." # endif #endif // !ASMJIT_ALLOC && !ASMJIT_REALLOC && !ASMJIT_FREE -#define ASMJIT_NO_COPY(_Type_) \ +#define ASMJIT_NO_COPY(Self) \ private: \ - ASMJIT_INLINE _Type_(const _Type_& other); \ - ASMJIT_INLINE _Type_& operator=(const _Type_& other); \ + ASMJIT_INLINE Self(const Self& other); \ + ASMJIT_INLINE Self& operator=(const Self& other); \ public: // ============================================================================ diff --git a/src/asmjit/x86/x86assembler.cpp b/src/asmjit/x86/x86assembler.cpp index d459001..1279fc8 100644 --- a/src/asmjit/x86/x86assembler.cpp +++ b/src/asmjit/x86/x86assembler.cpp @@ -352,7 +352,6 @@ Error X86Assembler::_setArch(uint32_t arch) { } #endif // ASMJIT_BUILD_X64 - ASMJIT_ASSERT(!"Reached"); return kErrorInvalidArgument; } @@ -548,7 +547,7 @@ size_t X86Assembler::_relocCode(void* _dst, Ptr baseAddress) const { break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } switch (rd.size) { @@ -561,7 +560,7 @@ size_t X86Assembler::_relocCode(void* _dst, Ptr baseAddress) const { break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } // Handle the trampoline case. @@ -3814,7 +3813,7 @@ _EmitImm: case 8: EMIT_QWORD(imVal ); break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } goto _EmitDone; diff --git a/src/asmjit/x86/x86compiler.cpp b/src/asmjit/x86/x86compiler.cpp index 9a154a3..7a52bdb 100644 --- a/src/asmjit/x86/x86compiler.cpp +++ b/src/asmjit/x86/x86compiler.cpp @@ -790,7 +790,7 @@ Error X86Compiler::_newVar(Var* var, uint32_t vType, const char* name, va_list a return getLastError(); } - var->_init_packed_op_sz_w0_id(kOperandTypeVar, vd->getSize(), vInfo.getReg() << 8, vd->getId()); + var->_init_packed_op_sz_w0_id(kOperandTypeVar, vInfo.getSize(), vInfo.getReg() << 8, vd->getId()); var->_vreg.vType = vType; return kErrorOk; } diff --git a/src/asmjit/x86/x86compiler.h b/src/asmjit/x86/x86compiler.h index eebdc60..c1ad410 100644 --- a/src/asmjit/x86/x86compiler.h +++ b/src/asmjit/x86/x86compiler.h @@ -987,19 +987,11 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler { // [Vars] // -------------------------------------------------------------------------- - ASMJIT_API virtual Error _newVar(Var* var, uint32_t type, const char* name, va_list ap); + ASMJIT_API virtual Error _newVar(Var* var, uint32_t vType, const char* name, va_list ap); #if !defined(ASMJIT_DISABLE_LOGGER) -#define ASMJIT_NEW_VAR_TYPE(func, type, typeFirst, typeLast) \ - ASMJIT_INLINE type func(uint32_t vType) { \ - ASMJIT_ASSERT(vType < kX86VarTypeCount); \ - ASMJIT_ASSERT(Utils::inInterval(vType, typeFirst, typeLast)); \ - \ - type var(NoInit); \ - _newVar(&var, vType, NULL, NULL); \ - return var; \ - } \ - ASMJIT_NOINLINE type func(uint32_t vType, const char* name, ...) { \ +#define ASMJIT_NEW_VAR_TYPE_EX(func, type, typeFirst, typeLast) \ + ASMJIT_NOINLINE type new##func(uint32_t vType, const char* name, ...) { \ ASMJIT_ASSERT(vType < kX86VarTypeCount); \ ASMJIT_ASSERT(Utils::inInterval(vType, typeFirst, typeLast)); \ \ @@ -1012,14 +1004,8 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler { va_end(ap); \ return var; \ } -#define ASMJIT_NEW_VAR_AUTO(func, type, typeId) \ - ASMJIT_INLINE type func() { \ - type var(NoInit); \ - _newVar(&var, typeId, NULL, NULL); \ - return var; \ - } \ - \ - ASMJIT_NOINLINE type func(const char* name, ...) { \ +#define ASMJIT_NEW_VAR_AUTO_EX(func, type, typeId) \ + ASMJIT_NOINLINE type new##func(const char* name, ...) { \ type var(NoInit); \ va_list ap; \ va_start(ap, name); \ @@ -1030,43 +1016,91 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler { return var; \ } #else - ASMJIT_INLINE type func() { \ +#define ASMJIT_NEW_VAR_TYPE_EX(func, type, typeFirst, typeLast) \ + ASMJIT_NOINLINE type new##func(uint32_t vType, const char* name, ...) { \ + ASMJIT_ASSERT(vType < kX86VarTypeCount); \ + ASMJIT_ASSERT(Utils::inInterval(vType, typeFirst, typeLast)); \ + \ type var(NoInit); \ - _newVar(&var, typeId, NULL, NULL); \ + _newVar(&var, vType, NULL, NULL); \ return var; \ - } \ - \ - ASMJIT_NOINLINE type func(const char* name, ...) { \ + } +#define ASMJIT_NEW_VAR_AUTO_EX(func, type, typeId) \ + ASMJIT_NOINLINE type new##func(const char* name, ...) { \ type var(NoInit); \ _newVar(&var, typeId, NULL, NULL); \ return var; \ } #endif - ASMJIT_NEW_VAR_TYPE(newGpVar , X86GpVar , _kVarTypeIntStart , _kVarTypeIntEnd ) - ASMJIT_NEW_VAR_TYPE(newMmVar , X86MmVar , _kX86VarTypeMmStart , _kX86VarTypeMmEnd ) - ASMJIT_NEW_VAR_TYPE(newXmmVar , X86XmmVar, _kX86VarTypeXmmStart, _kX86VarTypeXmmEnd) - ASMJIT_NEW_VAR_TYPE(newYmmVar , X86YmmVar, _kX86VarTypeYmmStart, _kX86VarTypeYmmEnd) +#define ASMJIT_REGISTER_VAR_TYPE(func, type, typeFirst, typeLast) \ + ASMJIT_INLINE type get##func##ById(uint32_t vType, uint32_t id) { \ + ASMJIT_ASSERT(vType < kX86VarTypeCount); \ + ASMJIT_ASSERT(Utils::inInterval(vType, typeFirst, typeLast)); \ + \ + type var(NoInit); \ + \ + const X86VarInfo& vInfo = _x86VarInfo[vType]; \ + var._init_packed_op_sz_w0_id(kOperandTypeVar, vInfo.getSize(), vInfo.getReg() << 8, id); \ + var._vreg.vType = vType; \ + \ + return var; \ + } \ + \ + ASMJIT_INLINE type new##func(uint32_t vType) { \ + ASMJIT_ASSERT(vType < kX86VarTypeCount); \ + ASMJIT_ASSERT(Utils::inInterval(vType, typeFirst, typeLast)); \ + \ + type var(NoInit); \ + _newVar(&var, vType, NULL, NULL); \ + return var; \ + } \ + \ + ASMJIT_NEW_VAR_TYPE_EX(func, type, typeFirst, typeLast) - ASMJIT_NEW_VAR_AUTO(newInt8 , X86GpVar , kVarTypeInt8 ) - ASMJIT_NEW_VAR_AUTO(newInt16 , X86GpVar , kVarTypeInt16 ) - ASMJIT_NEW_VAR_AUTO(newInt32 , X86GpVar , kVarTypeInt32 ) - ASMJIT_NEW_VAR_AUTO(newInt64 , X86GpVar , kVarTypeInt64 ) - ASMJIT_NEW_VAR_AUTO(newIntPtr , X86GpVar , kVarTypeIntPtr ) - ASMJIT_NEW_VAR_AUTO(newUInt8 , X86GpVar , kVarTypeUInt8 ) - ASMJIT_NEW_VAR_AUTO(newUInt16 , X86GpVar , kVarTypeUInt16 ) - ASMJIT_NEW_VAR_AUTO(newUInt32 , X86GpVar , kVarTypeUInt32 ) - ASMJIT_NEW_VAR_AUTO(newUInt64 , X86GpVar , kVarTypeUInt64 ) - ASMJIT_NEW_VAR_AUTO(newUIntPtr, X86GpVar , kVarTypeUIntPtr ) - ASMJIT_NEW_VAR_AUTO(newMm , X86MmVar , kX86VarTypeMm ) - ASMJIT_NEW_VAR_AUTO(newXmm , X86XmmVar, kX86VarTypeXmm ) - ASMJIT_NEW_VAR_AUTO(newXmmSs , X86XmmVar, kX86VarTypeXmmSs) - ASMJIT_NEW_VAR_AUTO(newXmmSd , X86XmmVar, kX86VarTypeXmmSd) - ASMJIT_NEW_VAR_AUTO(newXmmPs , X86XmmVar, kX86VarTypeXmmPs) - ASMJIT_NEW_VAR_AUTO(newXmmPd , X86XmmVar, kX86VarTypeXmmPd) - ASMJIT_NEW_VAR_AUTO(newYmm , X86YmmVar, kX86VarTypeYmm ) - ASMJIT_NEW_VAR_AUTO(newYmmPs , X86YmmVar, kX86VarTypeYmmPs) - ASMJIT_NEW_VAR_AUTO(newYmmPd , X86YmmVar, kX86VarTypeYmmPd) +#define ASMJIT_REGISTER_VAR_AUTO(func, type, typeId) \ + ASMJIT_INLINE type get##func##ById(uint32_t id) { \ + type var(NoInit); \ + \ + const X86VarInfo& vInfo = _x86VarInfo[typeId]; \ + var._init_packed_op_sz_w0_id(kOperandTypeVar, vInfo.getSize(), vInfo.getReg() << 8, id); \ + var._vreg.vType = typeId; \ + \ + return var; \ + } \ + \ + ASMJIT_INLINE type new##func() { \ + type var(NoInit); \ + _newVar(&var, typeId, NULL, NULL); \ + return var; \ + } \ + \ + ASMJIT_NEW_VAR_AUTO_EX(func, type, typeId) + + ASMJIT_REGISTER_VAR_TYPE(GpVar , X86GpVar , _kVarTypeIntStart , _kVarTypeIntEnd ) + ASMJIT_REGISTER_VAR_TYPE(MmVar , X86MmVar , _kX86VarTypeMmStart , _kX86VarTypeMmEnd ) + ASMJIT_REGISTER_VAR_TYPE(XmmVar , X86XmmVar, _kX86VarTypeXmmStart, _kX86VarTypeXmmEnd) + ASMJIT_REGISTER_VAR_TYPE(YmmVar , X86YmmVar, _kX86VarTypeYmmStart, _kX86VarTypeYmmEnd) + + ASMJIT_REGISTER_VAR_AUTO(Int8 , X86GpVar , kVarTypeInt8 ) + ASMJIT_REGISTER_VAR_AUTO(Int16 , X86GpVar , kVarTypeInt16 ) + ASMJIT_REGISTER_VAR_AUTO(Int32 , X86GpVar , kVarTypeInt32 ) + ASMJIT_REGISTER_VAR_AUTO(Int64 , X86GpVar , kVarTypeInt64 ) + ASMJIT_REGISTER_VAR_AUTO(IntPtr , X86GpVar , kVarTypeIntPtr ) + ASMJIT_REGISTER_VAR_AUTO(UInt8 , X86GpVar , kVarTypeUInt8 ) + ASMJIT_REGISTER_VAR_AUTO(UInt16 , X86GpVar , kVarTypeUInt16 ) + ASMJIT_REGISTER_VAR_AUTO(UInt32 , X86GpVar , kVarTypeUInt32 ) + ASMJIT_REGISTER_VAR_AUTO(UInt64 , X86GpVar , kVarTypeUInt64 ) + ASMJIT_REGISTER_VAR_AUTO(UIntPtr, X86GpVar , kVarTypeUIntPtr ) + ASMJIT_REGISTER_VAR_AUTO(Mm , X86MmVar , kX86VarTypeMm ) + ASMJIT_REGISTER_VAR_AUTO(Xmm , X86XmmVar, kX86VarTypeXmm ) + ASMJIT_REGISTER_VAR_AUTO(XmmSs , X86XmmVar, kX86VarTypeXmmSs) + ASMJIT_REGISTER_VAR_AUTO(XmmSd , X86XmmVar, kX86VarTypeXmmSd) + ASMJIT_REGISTER_VAR_AUTO(XmmPs , X86XmmVar, kX86VarTypeXmmPs) + ASMJIT_REGISTER_VAR_AUTO(XmmPd , X86XmmVar, kX86VarTypeXmmPd) + ASMJIT_REGISTER_VAR_AUTO(Ymm , X86YmmVar, kX86VarTypeYmm ) + ASMJIT_REGISTER_VAR_AUTO(YmmPs , X86YmmVar, kX86VarTypeYmmPs) + ASMJIT_REGISTER_VAR_AUTO(YmmPd , X86YmmVar, kX86VarTypeYmmPd) #undef ASMJIT_NEW_VAR_AUTO #undef ASMJIT_NEW_VAR_TYPE diff --git a/src/asmjit/x86/x86compilercontext.cpp b/src/asmjit/x86/x86compilercontext.cpp index 4faa506..cae0d70 100644 --- a/src/asmjit/x86/x86compilercontext.cpp +++ b/src/asmjit/x86/x86compilercontext.cpp @@ -672,12 +672,6 @@ void X86Context::emitLoad(VarData* vd, uint32_t regIndex, const char* reason) { break; #endif // ASMJIT_BUILD_X64 - case kVarTypeFp32: - case kVarTypeFp64: - // Compiler doesn't manage FPU stack. - ASMJIT_ASSERT(!"Reached"); - break; - case kX86VarTypeMm: node = compiler->emit(kX86InstIdMovq, x86::mm(regIndex), m); break; @@ -701,6 +695,12 @@ void X86Context::emitLoad(VarData* vd, uint32_t regIndex, const char* reason) { case kX86VarTypeXmmPd: node = compiler->emit(kX86InstIdMovapd, x86::xmm(regIndex), m); break; + + // Compiler doesn't manage FPU stack. + case kVarTypeFp32: + case kVarTypeFp64: + default: + ASMJIT_NOT_REACHED(); } if (!_emitComments) @@ -743,12 +743,6 @@ void X86Context::emitSave(VarData* vd, uint32_t regIndex, const char* reason) { break; #endif // ASMJIT_BUILD_X64 - case kVarTypeFp32: - case kVarTypeFp64: - // Compiler doesn't manage FPU stack. - ASMJIT_ASSERT(!"Reached"); - break; - case kX86VarTypeMm: node = compiler->emit(kX86InstIdMovq, m, x86::mm(regIndex)); break; @@ -772,6 +766,12 @@ void X86Context::emitSave(VarData* vd, uint32_t regIndex, const char* reason) { case kX86VarTypeXmmPd: node = compiler->emit(kX86InstIdMovapd, m, x86::xmm(regIndex)); break; + + // Compiler doesn't manage FPU stack. + case kVarTypeFp32: + case kVarTypeFp64: + default: + ASMJIT_NOT_REACHED(); } if (!_emitComments) @@ -807,12 +807,6 @@ void X86Context::emitMove(VarData* vd, uint32_t toRegIndex, uint32_t fromRegInde break; #endif // ASMJIT_BUILD_X64 - case kVarTypeFp32: - case kVarTypeFp64: - // Compiler doesn't manage FPU stack. - ASMJIT_ASSERT(!"Reached"); - break; - case kX86VarTypeMm: node = compiler->emit(kX86InstIdMovq, x86::mm(toRegIndex), x86::mm(fromRegIndex)); break; @@ -833,6 +827,12 @@ void X86Context::emitMove(VarData* vd, uint32_t toRegIndex, uint32_t fromRegInde case kX86VarTypeXmmPd: node = compiler->emit(kX86InstIdMovaps, x86::xmm(toRegIndex), x86::xmm(fromRegIndex)); break; + + case kVarTypeFp32: + case kVarTypeFp64: + default: + // Compiler doesn't manage FPU stack. + ASMJIT_NOT_REACHED(); } if (!_emitComments) @@ -937,7 +937,7 @@ void X86Context::emitConvertVarToVar(uint32_t dstType, uint32_t dstIndex, uint32 if (Utils::inInterval(srcType, _kVarTypeIntStart, _kVarTypeIntEnd)) { // TODO: [COMPILER] Variable conversion not supported. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } break; @@ -956,7 +956,7 @@ void X86Context::emitConvertVarToVar(uint32_t dstType, uint32_t dstIndex, uint32 if (Utils::inInterval(srcType, _kVarTypeIntStart, _kVarTypeIntEnd)) { // TODO: [COMPILER] Variable conversion not supported. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } break; } @@ -1139,7 +1139,7 @@ void X86Context::emitMoveVarOnStack( if (srcType == kX86VarTypeXmmSs || srcType == kX86VarTypeXmmPs || srcType == kX86VarTypeXmm) goto _MovXmmD; - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; case kVarTypeFp64: @@ -1148,22 +1148,22 @@ void X86Context::emitMoveVarOnStack( if (srcType == kX86VarTypeXmmSd || srcType == kX86VarTypeXmmPd || srcType == kX86VarTypeXmm) goto _MovXmmQ; - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; case kX86VarTypeXmm: // TODO: [COMPILER]. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; case kX86VarTypeXmmPs: // TODO: [COMPILER]. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; case kX86VarTypeXmmPd: // TODO: [COMPILER]. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; } return; @@ -1343,7 +1343,7 @@ _Move64: break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; } } @@ -1395,7 +1395,7 @@ _Move32: case kVarTypeFp32: case kVarTypeFp64: // Compiler doesn't manage FPU stack. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; case kX86VarTypeMm: @@ -1411,7 +1411,7 @@ _Move32: break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); break; } } @@ -1969,19 +1969,9 @@ static ASMJIT_INLINE uint32_t X86Context_typeOfConvertedSArg(X86Context* self, u if (Utils::inInterval(aType, _kVarTypeIntStart, _kVarTypeIntEnd)) return aType; - if (aType == kVarTypeFp32) - return kX86VarTypeXmmSs; + if (aType == kVarTypeFp32) return kX86VarTypeXmmSs; + if (aType == kVarTypeFp64) return kX86VarTypeXmmSd; - if (aType == kVarTypeFp64) - return kX86VarTypeXmmSd; - - if (Utils::inInterval(aType, _kX86VarTypeXmmStart, _kX86VarTypeXmmEnd)) - return aType; - - if (Utils::inInterval(aType, _kX86VarTypeYmmStart, _kX86VarTypeYmmEnd)) - return aType; - - ASMJIT_ASSERT(!"Reached"); return aType; } @@ -2775,7 +2765,7 @@ _NextGroup: } else { // TODO: Fix possible other return type conversions. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } } } @@ -5623,7 +5613,7 @@ _NextGroup: } else if (va->hasFlag(kVarAttrWConv)) { // TODO: [COMPILER] Function Argument Conversion. - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } else { vd->_isMemArg = true; @@ -6018,7 +6008,7 @@ static ASMJIT_INLINE Error X86Context_serialize(X86Context* self, X86Assembler* break; default: - ASMJIT_ASSERT(!"Reached"); + ASMJIT_NOT_REACHED(); } } else { diff --git a/src/test/asmjit_test_x86.cpp b/src/test/asmjit_test_x86.cpp index 55ccb38..759ff75 100644 --- a/src/test/asmjit_test_x86.cpp +++ b/src/test/asmjit_test_x86.cpp @@ -2823,7 +2823,7 @@ struct X86Test_MiscUnfollow : public X86Test { return resultRet == expectRet; } - static ASMJIT_FASTCALL void handler() { longjmp(globalJmpBuf, 1); } + static void ASMJIT_FASTCALL handler() { longjmp(globalJmpBuf, 1); } }; // ============================================================================ diff --git a/tools/configure-win-vs2015-x64.bat b/tools/configure-win-vs2015-x64.bat new file mode 100644 index 0000000..a3f0726 --- /dev/null +++ b/tools/configure-win-vs2015-x64.bat @@ -0,0 +1,9 @@ +@echo off + +set ASMJIT_CURRENT_DIR=%CD% +set ASMJIT_BUILD_DIR="build_vs2015_x64" + +mkdir ..\%ASMJIT_BUILD_DIR% +cd ..\%ASMJIT_BUILD_DIR% +cmake .. -G"Visual Studio 14 Win64" -DASMJIT_BUILD_TEST=1 +cd %ASMJIT_CURRENT_DIR% diff --git a/tools/configure-win-vs2015-x86.bat b/tools/configure-win-vs2015-x86.bat new file mode 100644 index 0000000..6f6544d --- /dev/null +++ b/tools/configure-win-vs2015-x86.bat @@ -0,0 +1,9 @@ +@echo off + +set ASMJIT_CURRENT_DIR=%CD% +set ASMJIT_BUILD_DIR="build_vs2015_x86" + +mkdir ..\%ASMJIT_BUILD_DIR% +cd ..\%ASMJIT_BUILD_DIR% +cmake .. -G"Visual Studio 14" -DASMJIT_BUILD_TEST=1 +cd %ASMJIT_CURRENT_DIR%