#pragma once #ifndef _ZEUS_SIMD_INCLUDED #error simd_none.hpp must not be included directly. Include simd.hpp instead. #endif namespace zeus::_simd { using m128_abi = __simd_abi<_StorageKind::_Array, 4>; using m128d_abi = __simd_abi<_StorageKind::_Array, 4>; // m128 ABI template <> inline simd simd::operator-() const { return {-__s_.__storage_[0], -__s_.__storage_[1], -__s_.__storage_[2], -__s_.__storage_[3]}; } inline simd operator+(const simd& a, const simd& b) { return {a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]}; } inline simd operator-(const simd& a, const simd& b) { return {a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3]}; } inline simd operator*(const simd& a, const simd& b) { return {a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3]}; } inline simd operator/(const simd& a, const simd& b) { return {a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3]}; } inline simd& operator+=(simd& a, const simd& b) { a[0] += b[0]; a[1] += b[1]; a[2] += b[2]; a[3] += b[3]; return a; } inline simd& operator-=(simd& a, const simd& b) { a[0] -= b[0]; a[1] -= b[1]; a[2] -= b[2]; a[3] -= b[3]; return a; } inline simd& operator*=(simd& a, const simd& b) { a[0] *= b[0]; a[1] *= b[1]; a[2] *= b[2]; a[3] *= b[3]; return a; } inline simd& operator/=(simd& a, const simd& b) { a[0] /= b[0]; a[1] /= b[1]; a[2] /= b[2]; a[3] /= b[3]; return a; } inline simd::mask_type operator==(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] == b[0]; ret[1] = a[1] == b[1]; ret[2] = a[2] == b[2]; ret[3] = a[3] == b[3]; return ret; } inline simd::mask_type operator!=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] != b[0]; ret[1] = a[1] != b[1]; ret[2] = a[2] != b[2]; ret[3] = a[3] != b[3]; return ret; } inline simd::mask_type operator>=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] >= b[0]; ret[1] = a[1] >= b[1]; ret[2] = a[2] >= b[2]; ret[3] = a[3] >= b[3]; return ret; } inline simd::mask_type operator<=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] <= b[0]; ret[1] = a[1] <= b[1]; ret[2] = a[2] <= b[2]; ret[3] = a[3] <= b[3]; return ret; } inline simd::mask_type operator>(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] > b[0]; ret[1] = a[1] > b[1]; ret[2] = a[2] > b[2]; ret[3] = a[3] > b[3]; return ret; } inline simd::mask_type operator<(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] < b[0]; ret[1] = a[1] < b[1]; ret[2] = a[2] < b[2]; ret[3] = a[3] < b[3]; return ret; } // m128d ABI template <> inline simd simd::operator-() const { return {-__s_.__storage_[0], -__s_.__storage_[1], -__s_.__storage_[2], -__s_.__storage_[3]}; } inline simd operator+(const simd& a, const simd& b) { return {a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]}; } inline simd operator-(const simd& a, const simd& b) { return {a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3]}; } inline simd operator*(const simd& a, const simd& b) { return {a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3]}; } inline simd operator/(const simd& a, const simd& b) { return {a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3]}; } inline simd& operator+=(simd& a, const simd& b) { a[0] += b[0]; a[1] += b[1]; a[2] += b[2]; a[3] += b[3]; return a; } inline simd& operator-=(simd& a, const simd& b) { a[0] -= b[0]; a[1] -= b[1]; a[2] -= b[2]; a[3] -= b[3]; return a; } inline simd& operator*=(simd& a, const simd& b) { a[0] *= b[0]; a[1] *= b[1]; a[2] *= b[2]; a[3] *= b[3]; return a; } inline simd& operator/=(simd& a, const simd& b) { a[0] /= b[0]; a[1] /= b[1]; a[2] /= b[2]; a[3] /= b[3]; return a; } inline simd::mask_type operator==(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] == b[0]; ret[1] = a[1] == b[1]; ret[2] = a[2] == b[2]; ret[3] = a[3] == b[3]; return ret; } inline simd::mask_type operator!=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] != b[0]; ret[1] = a[1] != b[1]; ret[2] = a[2] != b[2]; ret[3] = a[3] != b[3]; return ret; } inline simd::mask_type operator>=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] >= b[0]; ret[1] = a[1] >= b[1]; ret[2] = a[2] >= b[2]; ret[3] = a[3] >= b[3]; return ret; } inline simd::mask_type operator<=(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] <= b[0]; ret[1] = a[1] <= b[1]; ret[2] = a[2] <= b[2]; ret[3] = a[3] <= b[3]; return ret; } inline simd::mask_type operator>(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] > b[0]; ret[1] = a[1] > b[1]; ret[2] = a[2] > b[2]; ret[3] = a[3] > b[3]; return ret; } inline simd::mask_type operator<(const simd& a, const simd& b) { simd::mask_type ret; ret[0] = a[0] < b[0]; ret[1] = a[1] < b[1]; ret[2] = a[2] < b[2]; ret[3] = a[3] < b[3]; return ret; } } // namespace zeus::_simd