Path: blob/master/thirdparty/embree/kernels/common/isa.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../../common/sys/platform.h"6#include "../../common/sys/sysinfo.h"78namespace embree9{10#define DEFINE_SYMBOL2(type,name) \11typedef type (*name##Func)(); \12name##Func name;1314#define DECLARE_SYMBOL2(type,name) \15namespace sse2 { extern type name(); } \16namespace sse42 { extern type name(); } \17namespace avx { extern type name(); } \18namespace avx2 { extern type name(); } \19namespace avx512 { extern type name(); } \20void name##_error2() { throw_RTCError(RTC_ERROR_UNKNOWN,"internal error in ISA selection for " TOSTRING(name)); } \21type name##_error() { return type(name##_error2); } \22type name##_zero() { return type(nullptr); }2324#define DECLARE_ISA_FUNCTION(type,symbol,args) \25namespace sse2 { extern type symbol(args); } \26namespace sse42 { extern type symbol(args); } \27namespace avx { extern type symbol(args); } \28namespace avx2 { extern type symbol(args); } \29namespace avx512 { extern type symbol(args); } \30inline type symbol##_error(args) { throw_RTCError(RTC_ERROR_UNSUPPORTED_CPU,"function " TOSTRING(symbol) " not supported by your CPU"); } \31typedef type (*symbol##Ty)(args); \3233#define DEFINE_ISA_FUNCTION(type,symbol,args) \34typedef type (*symbol##Func)(args); \35symbol##Func symbol;3637#define ZERO_SYMBOL(features,intersector) \38intersector = intersector##_zero;3940#define INIT_SYMBOL(features,intersector) \41intersector = decltype(intersector)(intersector##_error);4243#define SELECT_SYMBOL_DEFAULT(features,intersector) \44intersector = isa::intersector;4546#if defined(__SSE__) || defined(__ARM_NEON)47#if !defined(EMBREE_TARGET_SIMD4)48#define EMBREE_TARGET_SIMD449#endif50#endif5152#if defined(EMBREE_TARGET_SSE42)53#define SELECT_SYMBOL_SSE42(features,intersector) \54if ((features & SSE42) == SSE42) intersector = sse42::intersector;55#else56#define SELECT_SYMBOL_SSE42(features,intersector)57#endif5859#if defined(EMBREE_TARGET_AVX) || defined(__AVX__)60#if !defined(EMBREE_TARGET_SIMD8)61#define EMBREE_TARGET_SIMD862#endif63#if defined(__AVX__) // if default ISA is >= AVX we treat AVX target as default target64#define SELECT_SYMBOL_AVX(features,intersector) \65if ((features & ISA) == ISA) intersector = isa::intersector;66#else67#define SELECT_SYMBOL_AVX(features,intersector) \68if ((features & AVX) == AVX) intersector = avx::intersector;69#endif70#else71#define SELECT_SYMBOL_AVX(features,intersector)72#endif7374#if defined(EMBREE_TARGET_AVX2)75#if !defined(EMBREE_TARGET_SIMD8)76#define EMBREE_TARGET_SIMD877#endif78#define SELECT_SYMBOL_AVX2(features,intersector) \79if ((features & AVX2) == AVX2) intersector = avx2::intersector;80#else81#define SELECT_SYMBOL_AVX2(features,intersector)82#endif8384#if defined(EMBREE_TARGET_AVX512)85#if !defined(EMBREE_TARGET_SIMD16)86#define EMBREE_TARGET_SIMD1687#endif88#define SELECT_SYMBOL_AVX512(features,intersector) \89if ((features & AVX512) == AVX512) intersector = avx512::intersector;90#else91#define SELECT_SYMBOL_AVX512(features,intersector)92#endif9394#define SELECT_SYMBOL_DEFAULT_SSE42(features,intersector) \95SELECT_SYMBOL_DEFAULT(features,intersector); \96SELECT_SYMBOL_SSE42(features,intersector);9798#define SELECT_SYMBOL_DEFAULT_SSE42_AVX(features,intersector) \99SELECT_SYMBOL_DEFAULT(features,intersector); \100SELECT_SYMBOL_SSE42(features,intersector); \101SELECT_SYMBOL_AVX(features,intersector);102103#define SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2(features,intersector) \104SELECT_SYMBOL_DEFAULT(features,intersector); \105SELECT_SYMBOL_SSE42(features,intersector); \106SELECT_SYMBOL_AVX(features,intersector); \107SELECT_SYMBOL_AVX2(features,intersector);108109#define SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,intersector) \110SELECT_SYMBOL_DEFAULT(features,intersector); \111SELECT_SYMBOL_SSE42(features,intersector); \112SELECT_SYMBOL_AVX(features,intersector); \113SELECT_SYMBOL_AVX512(features,intersector);114115#define SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,intersector) \116SELECT_SYMBOL_DEFAULT(features,intersector); \117SELECT_SYMBOL_AVX(features,intersector); \118SELECT_SYMBOL_AVX2(features,intersector); \119SELECT_SYMBOL_AVX512(features,intersector);120121#define SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,intersector) \122SELECT_SYMBOL_DEFAULT(features,intersector); \123SELECT_SYMBOL_AVX(features,intersector); \124SELECT_SYMBOL_AVX2(features,intersector); \125SELECT_SYMBOL_AVX512(features,intersector);126127#define SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,intersector) \128SELECT_SYMBOL_DEFAULT(features,intersector); \129SELECT_SYMBOL_SSE42(features,intersector); \130SELECT_SYMBOL_AVX(features,intersector); \131SELECT_SYMBOL_AVX2(features,intersector); \132SELECT_SYMBOL_AVX512(features,intersector);133134#define SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,intersector) \135SELECT_SYMBOL_DEFAULT(features,intersector); \136SELECT_SYMBOL_SSE42(features,intersector); \137SELECT_SYMBOL_AVX(features,intersector); \138SELECT_SYMBOL_AVX2(features,intersector); \139SELECT_SYMBOL_AVX512(features,intersector);140141#define SELECT_SYMBOL_DEFAULT_AVX(features,intersector) \142SELECT_SYMBOL_DEFAULT(features,intersector); \143SELECT_SYMBOL_AVX(features,intersector);144145#define SELECT_SYMBOL_DEFAULT_AVX_AVX2(features,intersector) \146SELECT_SYMBOL_DEFAULT(features,intersector); \147SELECT_SYMBOL_AVX(features,intersector); \148SELECT_SYMBOL_AVX2(features,intersector);149150#define SELECT_SYMBOL_DEFAULT_AVX(features,intersector) \151SELECT_SYMBOL_DEFAULT(features,intersector); \152SELECT_SYMBOL_AVX(features,intersector);153154#define SELECT_SYMBOL_DEFAULT_AVX_AVX512(features,intersector) \155SELECT_SYMBOL_DEFAULT(features,intersector); \156SELECT_SYMBOL_AVX(features,intersector); \157SELECT_SYMBOL_AVX512(features,intersector);158159#define SELECT_SYMBOL_DEFAULT_AVX_AVX512(features,intersector) \160SELECT_SYMBOL_DEFAULT(features,intersector); \161SELECT_SYMBOL_AVX(features,intersector); \162SELECT_SYMBOL_AVX512(features,intersector);163164#define SELECT_SYMBOL_INIT_AVX(features,intersector) \165INIT_SYMBOL(features,intersector); \166SELECT_SYMBOL_AVX(features,intersector);167168#define SELECT_SYMBOL_INIT_AVX_AVX2(features,intersector) \169INIT_SYMBOL(features,intersector); \170SELECT_SYMBOL_AVX(features,intersector); \171SELECT_SYMBOL_AVX2(features,intersector);172173#define SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,intersector) \174INIT_SYMBOL(features,intersector); \175SELECT_SYMBOL_AVX(features,intersector); \176SELECT_SYMBOL_AVX2(features,intersector); \177SELECT_SYMBOL_AVX512(features,intersector);178179#define SELECT_SYMBOL_INIT_SSE42_AVX_AVX2(features,intersector) \180INIT_SYMBOL(features,intersector); \181SELECT_SYMBOL_SSE42(features,intersector); \182SELECT_SYMBOL_AVX(features,intersector); \183SELECT_SYMBOL_AVX2(features,intersector);184185#define SELECT_SYMBOL_INIT_AVX(features,intersector) \186INIT_SYMBOL(features,intersector); \187SELECT_SYMBOL_AVX(features,intersector);188189#define SELECT_SYMBOL_INIT_AVX_AVX512(features,intersector) \190INIT_SYMBOL(features,intersector); \191SELECT_SYMBOL_AVX(features,intersector); \192SELECT_SYMBOL_AVX512(features,intersector);193194#define SELECT_SYMBOL_INIT_AVX_AVX2(features,intersector) \195INIT_SYMBOL(features,intersector); \196SELECT_SYMBOL_AVX(features,intersector); \197SELECT_SYMBOL_AVX2(features,intersector);198199#define SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,intersector) \200INIT_SYMBOL(features,intersector); \201SELECT_SYMBOL_AVX(features,intersector); \202SELECT_SYMBOL_AVX2(features,intersector); \203SELECT_SYMBOL_AVX512(features,intersector);204205#define SELECT_SYMBOL_INIT_SSE42_AVX_AVX2_AVX512(features,intersector) \206INIT_SYMBOL(features,intersector); \207SELECT_SYMBOL_SSE42(features,intersector); \208SELECT_SYMBOL_AVX(features,intersector); \209SELECT_SYMBOL_AVX2(features,intersector); \210SELECT_SYMBOL_AVX512(features,intersector);211212#define SELECT_SYMBOL_ZERO_SSE42_AVX_AVX2_AVX512(features,intersector) \213ZERO_SYMBOL(features,intersector); \214SELECT_SYMBOL_SSE42(features,intersector); \215SELECT_SYMBOL_AVX(features,intersector); \216SELECT_SYMBOL_AVX2(features,intersector); \217SELECT_SYMBOL_AVX512(features,intersector);218219#define SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,intersector) \220SELECT_SYMBOL_DEFAULT(features,intersector); \221SELECT_SYMBOL_AVX(features,intersector); \222SELECT_SYMBOL_AVX2(features,intersector); \223SELECT_SYMBOL_AVX512(features,intersector);224225#define SELECT_SYMBOL_INIT_AVX512(features,intersector) \226INIT_SYMBOL(features,intersector); \227SELECT_SYMBOL_AVX512(features,intersector);228229#define SELECT_SYMBOL_SSE42_AVX_AVX2(features,intersector) \230SELECT_SYMBOL_SSE42(features,intersector); \231SELECT_SYMBOL_AVX(features,intersector); \232SELECT_SYMBOL_AVX2(features,intersector);233234struct VerifyMultiTargetLinking {235static __noinline int getISA(int depth = 5) {236if (depth == 0) return ISA;237else return getISA(depth-1);238}239};240namespace sse2 { int getISA(); };241namespace sse42 { int getISA(); };242namespace avx { int getISA(); };243namespace avx2 { int getISA(); };244namespace avx512 { int getISA(); };245}246247248