#endif
#if defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
+#ifndef _TARGET_64BIT_
#define _TARGET_64BIT_
-#endif
+#endif // _TARGET_64BIT_
+#endif // defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
+
+#ifdef _TARGET_64BIT_
+#ifdef _TARGET_X86_
+#error Cannot define both _TARGET_X86_ and _TARGET_64BIT_
+#endif // _TARGET_X86_
+#ifdef _TARGET_ARM_
+#error Cannot define both _TARGET_ARM_ and _TARGET_64BIT_
+#endif // _TARGET_ARM_
+#endif // _TARGET_64BIT_
#if defined(_TARGET_X86_) || defined(_TARGET_AMD64_)
#define _TARGET_XARCH_
//=============================================================================
-#define OPT_MULT_ADDSUB 1 // optimize consecutive "lclVar += or -= icon"
-#define OPT_BOOL_OPS 1 // optimize boolean operations
+#define OPT_BOOL_OPS 1 // optimize boolean operations
//=============================================================================
extern JitOptions jitOpts;
-/*****************************************************************************
-*
-* Returns a word filled with the JITs allocator CHK fill value.
-*
-*/
+// Forward declarations for UninitializedWord and IsUninitialized are needed by alloc.h
template <typename T>
-inline T UninitializedWord()
-{
- __int64 word = 0x0101010101010101LL * (JitConfig.JitDefaultFill() & 0xFF);
- return (T)word;
-}
-
-/*****************************************************************************
-*
-* Determines whether this value is coming from uninitialized JIT memory
-*
-*/
+inline T UninitializedWord(Compiler* comp);
template <typename T>
-inline bool IsUninitialized(T data)
-{
- return data == UninitializedWord<T>();
-}
+inline bool IsUninitialized(T data);
+
#endif // DEBUG
/*****************************************************************************/
#if CALL_ARG_STATS || COUNT_BASIC_BLOCKS || COUNT_LOOPS || EMITTER_STATS || MEASURE_NODE_SIZE || MEASURE_MEM_ALLOC
+#define HISTOGRAM_MAX_SIZE_COUNT 64
+
class Histogram
{
public:
- Histogram(HostAllocator* allocator, const unsigned* const sizeTable);
- ~Histogram();
+ Histogram(const unsigned* const sizeTable);
void dump(FILE* output);
void record(unsigned size);
private:
void ensureAllocated();
- HostAllocator* m_allocator;
unsigned m_sizeCount;
const unsigned* const m_sizeTable;
- unsigned* m_counts;
+ unsigned m_counts[HISTOGRAM_MAX_SIZE_COUNT];
};
#endif // CALL_ARG_STATS || COUNT_BASIC_BLOCKS || COUNT_LOOPS || EMITTER_STATS || MEASURE_NODE_SIZE
#pragma warning(push)
#pragma warning(default : 4820) // 'bytes' bytes padding added after construct 'member_name'
#endif // CHECK_STRUCT_PADDING
-
#include "alloc.h"
#include "target.h"
};
#if defined(DEBUG)
-
+// Include the definition of Compiler for use by these template functions
+//
#include "compiler.h"
+//****************************************************************************
+//
+// Returns a word filled with the JITs allocator default fill value.
+//
+template <typename T>
+inline T UninitializedWord(Compiler* comp)
+{
+ unsigned char defaultFill = 0xdd;
+ if (comp == nullptr)
+ {
+ comp = JitTls::GetCompiler();
+ }
+ defaultFill = comp->compGetJitDefaultFill();
+ assert(defaultFill <= 0xff);
+ __int64 word = 0x0101010101010101LL * defaultFill;
+ return (T)word;
+}
+
+//****************************************************************************
+//
+// Tries to determine if this value is coming from uninitialized JIT memory
+// - Returns true if the value matches what we initialized the memory to.
+//
+// Notes:
+// - Asserts that use this are assuming that the UninitializedWord value
+// isn't a legal value for 'data'. Thus using a default fill value of
+// 0x00 will often trigger such asserts.
+//
+template <typename T>
+inline bool IsUninitialized(T data)
+{
+ return data == UninitializedWord<T>(JitTls::GetCompiler());
+}
+
+//****************************************************************************
+//
+// Debug template definitions for dspPtr, dspOffset
+// - Used to format pointer/offset values for diffable Disasm
+//
template <typename T>
T dspPtr(T p)
{
#else // !defined(DEBUG)
+//****************************************************************************
+//
+// Non-Debug template definitions for dspPtr, dspOffset
+// - This is a nop in non-Debug builds
+//
template <typename T>
T dspPtr(T p)
{