Path: blob/master/thirdparty/embree/common/simd/simd.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../math/emath.h"67/* include SSE wrapper classes */8#if defined(__SSE__) || defined(__ARM_NEON)9# include "sse.h"10#endif1112/* include AVX wrapper classes */13#if defined(__AVX__)14# include "avx.h"15#endif1617/* include AVX512 wrapper classes */18#if defined (__AVX512F__)19# include "avx512.h"20#endif2122namespace embree23{24template <int N>25__forceinline vbool<N> isfinite(const vfloat<N>& v)26{27return (v >= vfloat<N>(-std::numeric_limits<float>::max()))28& (v <= vfloat<N>( std::numeric_limits<float>::max()));29}3031/* foreach unique */32template<typename vbool, typename vint, typename Closure>33__forceinline void foreach_unique(const vbool& valid0, const vint& vi, const Closure& closure)34{35vbool valid1 = valid0;36while (any(valid1)) {37const int j = int(bsf(movemask(valid1)));38const int i = vi[j];39const vbool valid2 = valid1 & (i == vi);40valid1 = andn(valid1, valid2);41closure(valid2, i);42}43}4445/* returns the next unique value i in vi and the corresponding valid_i mask */46template<typename vbool, typename vint>47__forceinline int next_unique(vbool& valid, const vint& vi, /*out*/ vbool& valid_i)48{49assert(any(valid));50const int j = int(bsf(movemask(valid)));51const int i = vi[j];52valid_i = valid & (i == vi);53valid = andn(valid, valid_i);54return i;55}5657/* foreach unique index */58template<typename vbool, typename vint, typename Closure>59__forceinline void foreach_unique_index(const vbool& valid0, const vint& vi, const Closure& closure)60{61vbool valid1 = valid0;62while (any(valid1)) {63const int j = int(bsf(movemask(valid1)));64const int i = vi[j];65const vbool valid2 = valid1 & (i == vi);66valid1 = andn(valid1, valid2);67closure(valid2, i, j);68}69}7071/* returns the index of the next unique value i in vi and the corresponding valid_i mask */72template<typename vbool, typename vint>73__forceinline int next_unique_index(vbool& valid, const vint& vi, /*out*/ vbool& valid_i)74{75assert(any(valid));76const int j = int(bsf(movemask(valid)));77const int i = vi[j];78valid_i = valid & (i == vi);79valid = andn(valid, valid_i);80return j;81}8283template<typename Closure>84__forceinline void foreach2(int x0, int x1, int y0, int y1, const Closure& closure)85{86__aligned(64) int U[2*VSIZEX];87__aligned(64) int V[2*VSIZEX];88int index = 0;89for (int y=y0; y<y1; y++) {90const bool lasty = y+1>=y1;91const vintx vy = y;92for (int x=x0; x<x1; ) { //x+=VSIZEX) {93const bool lastx = x+VSIZEX >= x1;94vintx vx = x+vintx(step);95vintx::storeu(&U[index], vx);96vintx::storeu(&V[index], vy);97const int dx = min(x1-x,VSIZEX);98index += dx;99x += dx;100if (index >= VSIZEX || (lastx && lasty)) {101const vboolx valid = vintx(step) < vintx(index);102closure(valid, vintx::load(U), vintx::load(V));103x-= max(0, index-VSIZEX);104index = 0;105}106}107}108}109}110111112