mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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); }
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
|
||||
9
tools/configure-win-vs2015-x64.bat
Normal file
9
tools/configure-win-vs2015-x64.bat
Normal 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%
|
||||
9
tools/configure-win-vs2015-x86.bat
Normal file
9
tools/configure-win-vs2015-x86.bat
Normal 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%
|
||||
Reference in New Issue
Block a user