// Do not include this header directly.
// Control flow functionality in common between all the headers.
//
// Copyright 2020-2024 Binomial LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifdef _DEBUG
CPPSPMD_FORCE_INLINE void spmd_kernel::check_masks()
{
	assert(!any(andnot(m_kernel_exec, m_exec)));
}
#endif

CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_break()
{
#ifdef _DEBUG
	assert(m_in_loop);
#endif

	m_exec = exec_mask::all_off();
}

CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_continue()
{
#ifdef _DEBUG
	assert(m_in_loop);
#endif

	// Kill any active lanes, and remember which lanes were active so we can re-enable them at the end of the loop body.
	m_continue_mask = m_continue_mask | m_exec;
	m_exec = exec_mask::all_off();
}

CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_return()
{
	// Permenantly kill all active lanes
	m_kernel_exec = andnot(m_exec, m_kernel_exec);
	m_exec = exec_mask::all_off();
}

template<typename UnmaskedBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_unmasked(const UnmaskedBody& unmaskedBody)
{
	exec_mask orig_exec = m_exec, orig_kernel_exec = m_kernel_exec;

	m_kernel_exec = exec_mask::all_on();
	m_exec = exec_mask::all_on();

	unmaskedBody();

	m_kernel_exec = m_kernel_exec & orig_kernel_exec;
	m_exec = m_exec & orig_exec;

	check_masks();
}

struct scoped_unmasked_restorer
{
	spmd_kernel *m_pKernel;
	exec_mask m_orig_exec, m_orig_kernel_exec;

	CPPSPMD_FORCE_INLINE scoped_unmasked_restorer(spmd_kernel *pKernel) :
		m_pKernel(pKernel),
		m_orig_exec(pKernel->m_exec),
		m_orig_kernel_exec(pKernel->m_kernel_exec)
	{
		pKernel->m_kernel_exec = exec_mask::all_on();
		pKernel->m_exec = exec_mask::all_on();
	}

	CPPSPMD_FORCE_INLINE ~scoped_unmasked_restorer()
	{
		m_pKernel->m_kernel_exec = m_pKernel->m_kernel_exec & m_orig_kernel_exec;
		m_pKernel->m_exec = m_pKernel->m_exec & m_orig_exec;
		m_pKernel->check_masks();
	}
};

#define SPMD_UNMASKED_BEGIN { scoped_unmasked_restorer _unmasked_restorer(this);
#define SPMD_UNMASKED_END }

#if 0
template<typename SPMDKernel, typename... Args>
CPPSPMD_FORCE_INLINE decltype(auto) spmd_kernel::spmd_call(Args&&... args)
{
	SPMDKernel kernel;
	kernel.init(m_exec);
	return kernel._call(std::forward<Args>(args)...);
}
#else
template<typename SPMDKernel, typename... Args>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_call(Args&&... args)
{
	SPMDKernel kernel;
	kernel.init(m_exec);
	kernel._call(std::forward<Args>(args)...);
}
#endif

CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_if_break(const vbool& cond)
{
#ifdef _DEBUG
	assert(m_in_loop);
#endif

	exec_mask cond_exec(cond);

	m_exec = andnot(m_exec & cond_exec, m_exec);

	check_masks();
}

// No SPMD breaks, continues, etc. allowed
template<typename IfBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_sif(const vbool& cond, const IfBody& ifBody)
{
	exec_mask im = m_exec & exec_mask(cond);

	if (any(im))
	{
		const exec_mask orig_exec = m_exec;
		m_exec = im;
		ifBody();
		m_exec = orig_exec;
	}
}

// No SPMD breaks, continues, etc. allowed
template<typename IfBody, typename ElseBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_sifelse(const vbool& cond, const IfBody& ifBody, const ElseBody &elseBody)
{
	const exec_mask orig_exec = m_exec;

	exec_mask im = m_exec & exec_mask(cond);

	if (any(im))
	{
		m_exec = im;
		ifBody();
	}

	exec_mask em = orig_exec & exec_mask(!cond);

	if (any(em))
	{
		m_exec = em;
		elseBody();
	}

	m_exec = orig_exec;
}

template<typename IfBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_if(const vbool& cond, const IfBody& ifBody)
{
	exec_mask cond_exec(cond);

	exec_mask pre_if_exec = cond_exec & m_exec;

	if (any(pre_if_exec))
	{
		exec_mask unexecuted_lanes = andnot(cond_exec, m_exec);
		m_exec = pre_if_exec;

		ifBody();

		// Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body.
		m_exec = m_exec | unexecuted_lanes;

		check_masks();
	}
}

template<typename IfBody, typename ElseBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_ifelse(const vbool& cond, const IfBody& ifBody, const ElseBody& elseBody)
{
	bool all_flag = false;

	exec_mask cond_exec(cond);

	{
		exec_mask pre_if_exec = cond_exec & m_exec;

		int mask = pre_if_exec.get_movemask();
		if (mask != 0)
		{
			all_flag = ((uint32_t)mask == m_exec.get_movemask());

			exec_mask unexecuted_lanes = andnot(cond_exec, m_exec);
			m_exec = pre_if_exec;

			ifBody();

			// Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body.
			m_exec = m_exec | unexecuted_lanes;

			check_masks();
		}
	}

	if (!all_flag)
	{
		exec_mask pre_if_exec = andnot(cond_exec, m_exec);

		if (any(pre_if_exec))
		{
			exec_mask unexecuted_lanes = cond_exec & m_exec;
			m_exec = pre_if_exec;

			ifBody();

			// Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body.
			m_exec = m_exec | unexecuted_lanes;

			check_masks();
		}
	}
}

struct scoped_exec_restorer
{
	exec_mask *m_pMask;
	exec_mask m_prev_mask;
	CPPSPMD_FORCE_INLINE scoped_exec_restorer(exec_mask *pExec_mask) : m_pMask(pExec_mask), m_prev_mask(*pExec_mask) { }
	CPPSPMD_FORCE_INLINE ~scoped_exec_restorer() { *m_pMask = m_prev_mask; }
};

// Cannot use SPMD break, continue, or return inside "simple" if/else
#define SPMD_SIF(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \
	{ CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SELSE(cond) } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \
	{ CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SENDIF }

// Same as SPMD_SIF, except doesn't use a scoped object
#define SPMD_SIF2(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \
	{ exec_mask _orig_exec = m_exec; m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SELSE2(cond) m_exec = _orig_exec; } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \
	{ exec_mask _orig_exec = m_exec; m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SEND_IF2 m_exec = _orig_exec; }

// Same as SPMD_SIF(), except the if/else blocks are always executed
#define SPMD_SAIF(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); \
	m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SAELSE(cond) } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); \
	m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__);

#define SPMD_SAENDIF }

// Cannot use SPMD break, continue, or return inside sselect
#define SPMD_SSELECT(var)		do { vint_t _select_var = var; scoped_exec_restorer _orig_exec(&m_exec); exec_mask _select_executed(exec_mask::all_off());
#define SPMD_SCASE(value)		exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(_orig_exec.m_prev_mask & exec_mask(vbool(_select_var == (value)))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \
	{ m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); _select_executed = _select_executed | m_exec;

//#define SPMD_SCASE_END			if (_select_executed.get_movemask() == _orig_exec.m_prev_mask.get_movemask()) break; }
#define SPMD_SCASE_END			if (!any(_select_executed ^ _orig_exec.m_prev_mask)) break; }
#define SPMD_SDEFAULT			exec_mask _all_other_lanes(andnot(_select_executed, _orig_exec.m_prev_mask)); if (any(_all_other_lanes)) { m_exec = _all_other_lanes;
#define SPMD_SDEFAULT_END		}
#define SPMD_SSELECT_END		} while(0);

// Same as SPMD_SSELECT, except all cases are executed.
// Cannot use SPMD break, continue, or return inside sselect
#define SPMD_SASELECT(var)		do { vint_t _select_var = var; scoped_exec_restorer _orig_exec(&m_exec); exec_mask _select_executed(exec_mask::all_off());

#define SPMD_SACASE(value)		exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(_orig_exec.m_prev_mask & exec_mask(vbool(_select_var == (value)))); { m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); \
	_select_executed = _select_executed | m_exec;

#define SPMD_SACASE_END			}
#define SPMD_SADEFAULT			exec_mask _all_other_lanes(andnot(_select_executed, _orig_exec.m_prev_mask)); { m_exec = _all_other_lanes;
#define SPMD_SADEFAULT_END		}
#define SPMD_SASELECT_END		} while(0);

struct scoped_exec_restorer2
{
	spmd_kernel *m_pKernel;
	exec_mask m_unexecuted_lanes;

	CPPSPMD_FORCE_INLINE scoped_exec_restorer2(spmd_kernel *pKernel, const vbool &cond) :
		m_pKernel(pKernel)
	{
		exec_mask cond_exec(cond);
		m_unexecuted_lanes = andnot(cond_exec, pKernel->m_exec);
		pKernel->m_exec = cond_exec & pKernel->m_exec;
	}

	CPPSPMD_FORCE_INLINE ~scoped_exec_restorer2()
	{
		m_pKernel->m_exec = m_pKernel->m_exec | m_unexecuted_lanes;
		m_pKernel->check_masks();
	}
};

#define SPMD_IF(cond) { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, vbool(cond)); if (any(m_exec)) {
#define SPMD_ELSE(cond) } } { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, !vbool(cond)); if (any(m_exec)) {
#define SPMD_END_IF } }

// Same as SPMD_IF, except the conditional block is always executed.
#define SPMD_AIF(cond) { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, vbool(cond)); {
#define SPMD_AELSE(cond) } } { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, !vbool(cond)); {
#define SPMD_AEND_IF } }

class scoped_exec_saver
{
	exec_mask m_exec, m_kernel_exec, m_continue_mask;
	spmd_kernel *m_pKernel;
#ifdef _DEBUG
	bool m_in_loop;
#endif

public:
	inline scoped_exec_saver(spmd_kernel *pKernel) :
		m_exec(pKernel->m_exec), m_kernel_exec(pKernel->m_kernel_exec), m_continue_mask(pKernel->m_continue_mask),
		m_pKernel(pKernel)
	{
#ifdef _DEBUG
		m_in_loop = pKernel->m_in_loop;
#endif
	}

	inline ~scoped_exec_saver()
	{
		m_pKernel->m_exec = m_exec;
		m_pKernel->m_continue_mask = m_continue_mask;
		m_pKernel->m_kernel_exec = m_kernel_exec;
#ifdef _DEBUG
		m_pKernel->m_in_loop = m_in_loop;
		m_pKernel->check_masks();
#endif
	}
};

#define SPMD_BEGIN_CALL scoped_exec_saver CPPSPMD_GLUER2(_begin_call_scoped_exec_saver, __LINE__)(this); m_continue_mask = exec_mask::all_off();
#define SPMD_BEGIN_CALL_ALL_LANES scoped_exec_saver CPPSPMD_GLUER2(_begin_call_scoped_exec_saver, __LINE__)(this); m_exec = exec_mask::all_on(); m_continue_mask = exec_mask::all_off();

template<typename ForeachBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_foreach(int begin, int end, const ForeachBody& foreachBody)
{
	if (begin == end)
		return;

	if (!any(m_exec))
		return;

	// We don't support iterating backwards.
	if (begin > end)
		std::swap(begin, end);

	exec_mask prev_continue_mask = m_continue_mask, prev_exec = m_exec;

	int total_full = (end - begin) / PROGRAM_COUNT;
	int total_partial = (end - begin) % PROGRAM_COUNT;

	lint_t loop_index = begin + program_index;

	const int total_loops = total_full + (total_partial ? 1 : 0);

	m_continue_mask = exec_mask::all_off();

	for (int i = 0; i < total_loops; i++)
	{
		int n = PROGRAM_COUNT;
		if ((i == (total_loops - 1)) && (total_partial))
		{
			exec_mask partial_mask = exec_mask(vint_t(total_partial) > vint_t(program_index));
			m_exec = m_exec & partial_mask;
			n = total_partial;
		}

		foreachBody(loop_index, n);

		m_exec = m_exec | m_continue_mask;
		if (!any(m_exec))
			break;

		m_continue_mask = exec_mask::all_off();
		check_masks();

		store_all(loop_index, loop_index + PROGRAM_COUNT);
	}

	m_exec = prev_exec & m_kernel_exec;
	m_continue_mask = prev_continue_mask;
	check_masks();
}

template<typename WhileCondBody, typename WhileBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_while(const WhileCondBody& whileCondBody, const WhileBody& whileBody)
{
	exec_mask orig_exec = m_exec;

	exec_mask orig_continue_mask = m_continue_mask;
	m_continue_mask = exec_mask::all_off();

#ifdef _DEBUG
	const bool prev_in_loop = m_in_loop;
	m_in_loop = true;
#endif

	while(true)
	{
		exec_mask cond_exec = exec_mask(whileCondBody());
		m_exec = m_exec & cond_exec;

		if (!any(m_exec))
			break;

		whileBody();

		m_exec = m_exec | m_continue_mask;
		m_continue_mask = exec_mask::all_off();
		check_masks();
	}

#ifdef _DEBUG
	m_in_loop = prev_in_loop;
#endif

	m_exec = orig_exec & m_kernel_exec;
	m_continue_mask = orig_continue_mask;
	check_masks();
}

struct scoped_while_restorer
{
	spmd_kernel *m_pKernel;
	exec_mask m_orig_exec, m_orig_continue_mask;
#ifdef _DEBUG
	bool m_prev_in_loop;
#endif

	CPPSPMD_FORCE_INLINE scoped_while_restorer(spmd_kernel *pKernel) :
		m_pKernel(pKernel),
		m_orig_exec(pKernel->m_exec),
		m_orig_continue_mask(pKernel->m_continue_mask)
	{
		pKernel->m_continue_mask.all_off();

#ifdef _DEBUG
		m_prev_in_loop = pKernel->m_in_loop;
		pKernel->m_in_loop = true;
#endif
	}

	CPPSPMD_FORCE_INLINE ~scoped_while_restorer()
	{
		m_pKernel->m_exec = m_orig_exec & m_pKernel->m_kernel_exec;
		m_pKernel->m_continue_mask = m_orig_continue_mask;
#ifdef _DEBUG
		m_pKernel->m_in_loop = m_prev_in_loop;
		m_pKernel->check_masks();
#endif
	}
};

#undef SPMD_WHILE
#undef SPMD_WEND
#define SPMD_WHILE(cond) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) { exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); \
	m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break;

#define SPMD_WEND m_exec = m_exec | m_continue_mask; m_continue_mask = exec_mask::all_off(); check_masks(); } }

// Nesting is not supported (although it will compile, but the results won't make much sense).
#define SPMD_FOREACH(loop_var, bi, ei) if (((bi) != (ei)) && (any(m_exec))) { \
	scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \
	uint32_t b = (uint32_t)(bi), e = (uint32_t)(ei); if ((b) > (e)) { std::swap(b, e); } const uint32_t total_full = ((e) - (b)) >> PROGRAM_COUNT_SHIFT, total_partial = ((e) - (b)) & (PROGRAM_COUNT - 1); \
	lint_t loop_var = program_index + (int)b; const uint32_t total_loops = total_full + (total_partial ? 1U : 0U); \
	for (uint32_t CPPSPMD_GLUER2(_foreach_counter, __LINE__) = 0; CPPSPMD_GLUER2(_foreach_counter, __LINE__) < total_loops; ++CPPSPMD_GLUER2(_foreach_counter, __LINE__)) { \
		if ((CPPSPMD_GLUER2(_foreach_counter, __LINE__) == (total_loops - 1)) && (total_partial)) { exec_mask partial_mask = exec_mask(vint_t((int)total_partial) > vint_t(program_index)); m_exec = m_exec & partial_mask; }

#define SPMD_FOREACH_END(loop_var) m_exec = m_exec | m_continue_mask; if (!any(m_exec)) break; m_continue_mask = exec_mask::all_off(); check_masks(); store_all(loop_var, loop_var + PROGRAM_COUNT); } }

// Okay to use spmd_continue or spmd_return, but not spmd_break
#define SPMD_FOREACH_ACTIVE(index_var) int64_t index_var; { uint64_t _movemask = m_exec.get_movemask(); if (_movemask) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \
	for (uint32_t _i = 0; _i < PROGRAM_COUNT; ++_i) { \
		if (_movemask & (1U << _i)) { \
			m_exec.enable_lane(_i); m_exec = m_exec & m_kernel_exec; \
			(index_var) = _i; \

#define SPMD_FOREACH_ACTIVE_END } } } }

// Okay to use spmd_continue, but not spmd_break/spmd_continue
#define SPMD_FOREACH_UNIQUE_INT(index_var, var) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \
	CPPSPMD_DECL(int_t, _vals[PROGRAM_COUNT]); store_linear_all(_vals, var); std::sort(_vals, _vals + PROGRAM_COUNT); \
	const int _n = (int)(std::unique(_vals, _vals + PROGRAM_COUNT) - _vals); \
	for (int _i = 0; _i < _n; ++_i) { int index_var = _vals[_i]; vbool cond = (vint_t(var) == vint_t(index_var)); m_exec = exec_mask(cond);

#define SPMD_FOREACH_UNIQUE_INT_END } }

struct scoped_simple_while_restorer
{
	spmd_kernel* m_pKernel;
	exec_mask m_orig_exec;
#ifdef _DEBUG
	bool m_prev_in_loop;
#endif

	CPPSPMD_FORCE_INLINE scoped_simple_while_restorer(spmd_kernel* pKernel) :
		m_pKernel(pKernel),
		m_orig_exec(pKernel->m_exec)
	{

#ifdef _DEBUG
		m_prev_in_loop = pKernel->m_in_loop;
		pKernel->m_in_loop = true;
#endif
	}

	CPPSPMD_FORCE_INLINE ~scoped_simple_while_restorer()
	{
		m_pKernel->m_exec = m_orig_exec;
#ifdef _DEBUG
		m_pKernel->m_in_loop = m_prev_in_loop;
		m_pKernel->check_masks();
#endif
	}
};

// Cannot use SPMD break, continue, or return inside simple while

#define SPMD_SWHILE(cond) { scoped_simple_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \
	while(true) { \
		exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break;
#define SPMD_SWEND } }

// Cannot use SPMD break, continue, or return inside simple do
#define SPMD_SDO { scoped_simple_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) {
#define SPMD_SEND_DO(cond) exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break; } }

#undef SPMD_FOR
#undef SPMD_END_FOR
#define SPMD_FOR(for_init, for_cond) { for_init; scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) { exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(for_cond)); \
	m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break;
#define SPMD_END_FOR(for_inc) m_exec = m_exec | m_continue_mask; m_continue_mask = exec_mask::all_off(); check_masks(); for_inc; } }

template<typename ForInitBody, typename ForCondBody, typename ForIncrBody, typename ForBody>
CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_for(const ForInitBody& forInitBody, const ForCondBody& forCondBody, const ForIncrBody& forIncrBody, const ForBody& forBody)
{
	exec_mask orig_exec = m_exec;

	forInitBody();

	exec_mask orig_continue_mask = m_continue_mask;
	m_continue_mask = exec_mask::all_off();

#ifdef _DEBUG
	const bool prev_in_loop = m_in_loop;
	m_in_loop = true;
#endif

	while(true)
	{
		exec_mask cond_exec = exec_mask(forCondBody());
		m_exec = m_exec & cond_exec;

		if (!any(m_exec))
			break;

		forBody();

		m_exec = m_exec | m_continue_mask;
		m_continue_mask = exec_mask::all_off();
		check_masks();

		forIncrBody();
	}

	m_exec = orig_exec & m_kernel_exec;
	m_continue_mask = orig_continue_mask;

#ifdef _DEBUG
	m_in_loop = prev_in_loop;
	check_masks();
#endif
}
