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
This commit is contained in:
kobalicek
2016-01-02 16:24:54 +01:00
parent 9e100d11a1
commit b9b1ad6fae
13 changed files with 195 additions and 113 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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<int32_t>(offset));

View File

@@ -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
// ============================================================================

View File

@@ -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();

View File

@@ -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:
// ============================================================================

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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

View File

@@ -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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(aType, _kX86VarTypeXmmStart, _kX86VarTypeXmmEnd))
return aType;
if (Utils::inInterval<uint32_t>(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 {

View File

@@ -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); }
};
// ============================================================================

View File

@@ -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%

View File

@@ -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%