#include "PPintrin.h" #include "logger.h" //****************** //* Implementation * //****************** __pp_mask _pp_init_ones(int first) { __pp_mask mask; for (int i = 0; i < VECTOR_WIDTH; i++) { mask.value[i] = (i < first) ? true : false; } return mask; } __pp_mask _pp_mask_not(__pp_mask &maska) { __pp_mask resultMask; for (int i = 0; i < VECTOR_WIDTH; i++) { resultMask.value[i] = !maska.value[i]; } PPLogger.addLog("masknot", _pp_init_ones(), VECTOR_WIDTH); return resultMask; } __pp_mask _pp_mask_or(__pp_mask &maska, __pp_mask &maskb) { __pp_mask resultMask; for (int i = 0; i < VECTOR_WIDTH; i++) { resultMask.value[i] = maska.value[i] | maskb.value[i]; } PPLogger.addLog("maskor", _pp_init_ones(), VECTOR_WIDTH); return resultMask; } __pp_mask _pp_mask_and(__pp_mask &maska, __pp_mask &maskb) { __pp_mask resultMask; for (int i = 0; i < VECTOR_WIDTH; i++) { resultMask.value[i] = maska.value[i] && maskb.value[i]; } PPLogger.addLog("maskand", _pp_init_ones(), VECTOR_WIDTH); return resultMask; } int _pp_cntbits(__pp_mask &maska) { int count = 0; for (int i = 0; i < VECTOR_WIDTH; i++) { if (maska.value[i]) count++; } PPLogger.addLog("cntbits", _pp_init_ones(), VECTOR_WIDTH); return count; } template void _pp_vset(__pp_vec &vecResult, T value, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? value : vecResult.value[i]; } PPLogger.addLog("vset", mask, VECTOR_WIDTH); } template void _pp_vset(__pp_vec_float &vecResult, float value, __pp_mask &mask); template void _pp_vset(__pp_vec_int &vecResult, int value, __pp_mask &mask); void _pp_vset_float(__pp_vec_float &vecResult, float value, __pp_mask &mask) { _pp_vset(vecResult, value, mask); } void _pp_vset_int(__pp_vec_int &vecResult, int value, __pp_mask &mask) { _pp_vset(vecResult, value, mask); } __pp_vec_float _pp_vset_float(float value) { __pp_vec_float vecResult; __pp_mask mask = _pp_init_ones(); _pp_vset_float(vecResult, value, mask); return vecResult; } __pp_vec_int _pp_vset_int(int value) { __pp_vec_int vecResult; __pp_mask mask = _pp_init_ones(); _pp_vset_int(vecResult, value, mask); return vecResult; } template void _pp_vmove(__pp_vec &dest, __pp_vec &src, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { dest.value[i] = mask.value[i] ? src.value[i] : dest.value[i]; } PPLogger.addLog("vmove", mask, VECTOR_WIDTH); } template void _pp_vmove(__pp_vec_float &dest, __pp_vec_float &src, __pp_mask &mask); template void _pp_vmove(__pp_vec_int &dest, __pp_vec_int &src, __pp_mask &mask); void _pp_vmove_float(__pp_vec_float &dest, __pp_vec_float &src, __pp_mask &mask) { _pp_vmove(dest, src, mask); } void _pp_vmove_int(__pp_vec_int &dest, __pp_vec_int &src, __pp_mask &mask) { _pp_vmove(dest, src, mask); } template void _pp_vload(__pp_vec &dest, T *src, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { dest.value[i] = mask.value[i] ? src[i] : dest.value[i]; } PPLogger.addLog("vload", mask, VECTOR_WIDTH); } template void _pp_vload(__pp_vec_float &dest, float *src, __pp_mask &mask); template void _pp_vload(__pp_vec_int &dest, int *src, __pp_mask &mask); void _pp_vload_float(__pp_vec_float &dest, float *src, __pp_mask &mask) { _pp_vload(dest, src, mask); } void _pp_vload_int(__pp_vec_int &dest, int *src, __pp_mask &mask) { _pp_vload(dest, src, mask); } template void _pp_vstore(T *dest, __pp_vec &src, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { dest[i] = mask.value[i] ? src.value[i] : dest[i]; } PPLogger.addLog("vstore", mask, VECTOR_WIDTH); } template void _pp_vstore(float *dest, __pp_vec_float &src, __pp_mask &mask); template void _pp_vstore(int *dest, __pp_vec_int &src, __pp_mask &mask); void _pp_vstore_float(float *dest, __pp_vec_float &src, __pp_mask &mask) { _pp_vstore(dest, src, mask); } void _pp_vstore_int(int *dest, __pp_vec_int &src, __pp_mask &mask) { _pp_vstore(dest, src, mask); } template void _pp_vadd(__pp_vec &vecResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? (veca.value[i] + vecb.value[i]) : vecResult.value[i]; } PPLogger.addLog("vadd", mask, VECTOR_WIDTH); } template void _pp_vadd(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vadd(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vadd_float(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vadd(vecResult, veca, vecb, mask); } void _pp_vadd_int(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vadd(vecResult, veca, vecb, mask); } template void _pp_vsub(__pp_vec &vecResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? (veca.value[i] - vecb.value[i]) : vecResult.value[i]; } PPLogger.addLog("vsub", mask, VECTOR_WIDTH); } template void _pp_vsub(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vsub(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vsub_float(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vsub(vecResult, veca, vecb, mask); } void _pp_vsub_int(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vsub(vecResult, veca, vecb, mask); } template void _pp_vmult(__pp_vec &vecResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? (veca.value[i] * vecb.value[i]) : vecResult.value[i]; } PPLogger.addLog("vmult", mask, VECTOR_WIDTH); } template void _pp_vmult(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vmult(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vmult_float(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vmult(vecResult, veca, vecb, mask); } void _pp_vmult_int(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vmult(vecResult, veca, vecb, mask); } template void _pp_vdiv(__pp_vec &vecResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? (veca.value[i] / vecb.value[i]) : vecResult.value[i]; } PPLogger.addLog("vdiv", mask, VECTOR_WIDTH); } template void _pp_vdiv(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vdiv(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vdiv_float(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vdiv(vecResult, veca, vecb, mask); } void _pp_vdiv_int(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vdiv(vecResult, veca, vecb, mask); } template void _pp_vabs(__pp_vec &vecResult, __pp_vec &veca, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { vecResult.value[i] = mask.value[i] ? (abs(veca.value[i])) : vecResult.value[i]; } PPLogger.addLog("vabs", mask, VECTOR_WIDTH); } template void _pp_vabs(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_mask &mask); template void _pp_vabs(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_mask &mask); void _pp_vabs_float(__pp_vec_float &vecResult, __pp_vec_float &veca, __pp_mask &mask) { _pp_vabs(vecResult, veca, mask); } void _pp_vabs_int(__pp_vec_int &vecResult, __pp_vec_int &veca, __pp_mask &mask) { _pp_vabs(vecResult, veca, mask); } template void _pp_vgt(__pp_mask &maskResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { maskResult.value[i] = mask.value[i] ? (veca.value[i] > vecb.value[i]) : maskResult.value[i]; } PPLogger.addLog("vgt", mask, VECTOR_WIDTH); } template void _pp_vgt(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vgt(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vgt_float(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vgt(maskResult, veca, vecb, mask); } void _pp_vgt_int(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vgt(maskResult, veca, vecb, mask); } template void _pp_vlt(__pp_mask &maskResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { maskResult.value[i] = mask.value[i] ? (veca.value[i] < vecb.value[i]) : maskResult.value[i]; } PPLogger.addLog("vlt", mask, VECTOR_WIDTH); } template void _pp_vlt(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_vlt(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_vlt_float(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_vlt(maskResult, veca, vecb, mask); } void _pp_vlt_int(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_vlt(maskResult, veca, vecb, mask); } template void _pp_veq(__pp_mask &maskResult, __pp_vec &veca, __pp_vec &vecb, __pp_mask &mask) { for (int i = 0; i < VECTOR_WIDTH; i++) { maskResult.value[i] = mask.value[i] ? (veca.value[i] == vecb.value[i]) : maskResult.value[i]; } PPLogger.addLog("veq", mask, VECTOR_WIDTH); } template void _pp_veq(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask); template void _pp_veq(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask); void _pp_veq_float(__pp_mask &maskResult, __pp_vec_float &veca, __pp_vec_float &vecb, __pp_mask &mask) { _pp_veq(maskResult, veca, vecb, mask); } void _pp_veq_int(__pp_mask &maskResult, __pp_vec_int &veca, __pp_vec_int &vecb, __pp_mask &mask) { _pp_veq(maskResult, veca, vecb, mask); } template void _pp_hadd(__pp_vec &vecResult, __pp_vec &vec) { for (int i = 0; i < VECTOR_WIDTH / 2; i++) { T result = vec.value[2 * i] + vec.value[2 * i + 1]; vecResult.value[2 * i] = result; vecResult.value[2 * i + 1] = result; } PPLogger.addLog("hadd", _pp_init_ones(), VECTOR_WIDTH); } template void _pp_hadd(__pp_vec_float &vecResult, __pp_vec_float &vec); void _pp_hadd_float(__pp_vec_float &vecResult, __pp_vec_float &vec) { _pp_hadd(vecResult, vec); } template void _pp_interleave(__pp_vec &vecResult, __pp_vec vec) { for (int i = 0; i < VECTOR_WIDTH; i++) { int index = i < VECTOR_WIDTH / 2 ? (2 * i) : (2 * (i - VECTOR_WIDTH / 2) + 1); vecResult.value[i] = vec.value[index]; } PPLogger.addLog("interleave", _pp_init_ones(), VECTOR_WIDTH); } template void _pp_interleave(__pp_vec_float &vecResult, __pp_vec_float vec); void _pp_interleave_float(__pp_vec_float &vecResult, __pp_vec_float vec) { _pp_interleave(vecResult, vec); } void addUserLog(const char *logStr) { PPLogger.addLog(logStr, _pp_init_ones(), 0); }