| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #include "RuntimeLanguagePch.h"
- #if defined(_M_ARM32_OR_ARM64)
- namespace Js
- {
- SIMDValue SIMDUint16x8Operation::OpUint16x8(uint16 values[])
- {
- SIMDValue result;
- for (uint i = 0; i < 8; i++)
- {
- result.u16[i] = values[i];
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpMin(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- for (uint idx = 0; idx < 8; ++idx)
- {
- result.u16[idx] = (aValue.u16[idx] < bValue.u16[idx]) ? aValue.u16[idx] : bValue.u16[idx];
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpMax(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- for (uint idx = 0; idx < 8; ++idx)
- {
- result.u16[idx] = (aValue.u16[idx] > bValue.u16[idx]) ? aValue.u16[idx] : bValue.u16[idx];
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpLessThan(const SIMDValue& aValue, const SIMDValue& bValue) //arun::ToDo return bool types
- {
- SIMDValue result;
- for(uint idx = 0; idx < 8; ++idx)
- {
- result.u16[idx] = (aValue.u16[idx] < bValue.u16[idx]) ? 0xff : 0x0;
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpLessThanOrEqual(const SIMDValue& aValue, const SIMDValue& bValue) //arun::ToDo return bool types
- {
- SIMDValue result;
- for (uint idx = 0; idx < 8; ++idx)
- {
- result.u16[idx] = (aValue.u16[idx] <= bValue.u16[idx]) ? 0xff : 0x0;
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpGreaterThanOrEqual(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- result = SIMDUint16x8Operation::OpLessThan(aValue, bValue);
- result = SIMDInt32x4Operation::OpNot(result);
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpGreaterThan(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- result = SIMDUint16x8Operation::OpLessThanOrEqual(aValue, bValue);
- result = SIMDInt32x4Operation::OpNot(result);
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpShiftRightByScalar(const SIMDValue& value, int count)
- {
- SIMDValue result;
- count = count & SIMDUtils::SIMDGetShiftAmountMask(2);
- for (uint idx = 0; idx < 8; ++idx)
- {
- result.u16[idx] = (value.u16[idx] >> count);
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpAddSaturate(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- for (uint idx = 0; idx < 8; ++idx)
- {
- uint32 a = (uint32)aValue.u16[idx];
- uint32 b = (uint32)bValue.u16[idx];
- result.u16[idx] = ((a + b) > MAXUINT16) ? MAXUINT16 : (uint16)(a + b);
- }
- return result;
- }
- SIMDValue SIMDUint16x8Operation::OpSubSaturate(const SIMDValue& aValue, const SIMDValue& bValue)
- {
- SIMDValue result;
- for (uint idx = 0; idx < 8; ++idx)
- {
- int a = (int)aValue.u16[idx];
- int b = (int)bValue.u16[idx];
- result.u16[idx] = ((a - b) < 0) ? 0 : (uint16)(a - b);
- }
- return result;
- }
- }
- #endif
|