/*
* Copyright (c) 2007-2020, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file      cm_mem_os.h 
//! \brief     Contains CM memory function definitions 
//!
#pragma once

#include <iostream>
#include "cpuid.h"
#include <smmintrin.h>

typedef uintptr_t           UINT_PTR;
#define __fastcall
#define __noop

#ifdef __try
    #undef __try
#endif
#define __try           try

#ifdef __except
    #undef __except
#endif

#define  EXCEPTION_EXECUTE_HANDLER std::exception const& e

#define __except(e)     catch(e)

#ifndef __EXCEPTIONS
// If -fno-exceptions, transform error handling code to work without it
#define NO_EXCEPTION_HANDLING  1
#endif

#if NO_EXCEPTION_HANDLING || ANDROID
    #define try         if (true)

    #ifndef catch
    #define catch(x)    if (false)
    #endif

    #define throw(...)
#endif

#define CM_CPU_FASTCOPY_THRESHOLD 1024

/*****************************************************************************\
Inline Function:
    Prefetch

Description:
    executes __asm prefetchnta
\*****************************************************************************/
inline void Prefetch( const void* ptr )
{
    __asm__("prefetchnta 0(%0)"::"r"(ptr));
}

inline bool TestSSE4_1( void )
{
    bool success = true;

#ifndef NO_EXCEPTION_HANDLING
    __try
    {
#endif //NO_EXCEPTION_HANDLING

    if ( sizeof(void *) == 4)  //32-bit Linux
    {
        __asm__ __volatile__ (".byte 0x66");
        __asm__ __volatile__ (".byte 0x0f");
        __asm__ __volatile__ (".byte 0x38");
        __asm__ __volatile__ (".byte 0x17");
        __asm__ __volatile__ (".byte 0xc1");
    }
    else //64-bit Linux
    {
        success = true;
    }

#ifndef NO_EXCEPTION_HANDLING
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        success = false;
    }
#endif // NO_EXCEPTION_HANDLING
    return success;
}

/*****************************************************************************\
Inline Function:
    GetCPUID

Description:
    Retrieves cpu information and capabilities supported
Input:
    int infoType - type of information requested
Output:
    int cpuInfo[4] - requested info
\*****************************************************************************/
inline void GetCPUID(int cpuInfo[4], int infoType)
{
#ifndef NO_EXCEPTION_HANDLING
    __try
    {
#endif //NO_EXCEPTION_HANDLING

    __get_cpuid(infoType, (unsigned int*)cpuInfo, (unsigned int*)cpuInfo + 1, (unsigned int*)cpuInfo + 2, (unsigned int*)cpuInfo + 3);

#ifndef NO_EXCEPTION_HANDLING
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        // cpuid failed!
        return;
    }
#endif  //NO_EXCEPTION_HANDLING
}

void CmFastMemCopyFromWC( void* dst, const void* src, const size_t bytes, CPU_INSTRUCTION_LEVEL cpuInstructionLevel );
