213 lines
5.9 KiB
C++
213 lines
5.9 KiB
C++
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
#if !defined __GNUC__
|
|
// relative include path contains '..', specific to this file
|
|
#pragma warning( disable: 4464 )
|
|
#endif
|
|
|
|
#include "../SafeInt.hpp"
|
|
|
|
#if SAFEINT_USE_INTRINSICS
|
|
|
|
_CONSTEXPR14 std::int16_t CastInt()
|
|
{
|
|
const std::int16_t t1 = 2;
|
|
const std::int16_t u1 = -3;
|
|
std::int16_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int16_t, std::int16_t, MultiplicationState_CastInt>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::uint16_t CastUint()
|
|
{
|
|
const std::uint16_t t1 = 2;
|
|
const std::uint16_t u1 = 3;
|
|
std::uint16_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint16_t, std::uint16_t, MultiplicationState_CastUint>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::int32_t CastInt64()
|
|
{
|
|
const std::int32_t t1 = 2;
|
|
const std::int32_t u1 = -3;
|
|
std::int32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int32_t, std::int32_t, MultiplicationState_CastInt64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::uint32_t CastUint64()
|
|
{
|
|
const std::uint32_t t1 = 2;
|
|
const std::uint32_t u1 = 3;
|
|
std::uint32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint32_t, std::uint32_t, MultiplicationState_CastUint64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::uint64_t Uint64Uint64()
|
|
{
|
|
const std::uint64_t t1 = 2;
|
|
const std::uint64_t u1 = 3;
|
|
std::uint64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint64_t, std::uint64_t, MultiplicationState_Uint64Uint64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::uint64_t Uint64Uint()
|
|
{
|
|
const std::uint64_t t1 = 2;
|
|
const std::uint32_t u1 = 3;
|
|
std::uint64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint64_t, std::uint32_t, MultiplicationState_Uint64Uint>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::uint32_t UintUint64()
|
|
{
|
|
const std::uint32_t t1 = 2;
|
|
const std::uint64_t u1 = 3;
|
|
std::uint32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint32_t, std::uint64_t, MultiplicationState_UintUint64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::uint64_t Uint64Int()
|
|
{
|
|
const std::uint64_t t1 = 2;
|
|
const std::int32_t u1 = 3;
|
|
std::uint64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint64_t, std::int32_t, MultiplicationState_Uint64Int>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::uint64_t Uint64Int64()
|
|
{
|
|
const std::uint64_t t1 = 2;
|
|
const std::int64_t u1 = 3;
|
|
std::uint64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint64_t, std::int64_t, MultiplicationState_Uint64Int64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::uint32_t UintInt64()
|
|
{
|
|
const std::uint32_t t1 = 2;
|
|
const std::int64_t u1 = 3;
|
|
std::uint32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::uint32_t, std::int64_t, MultiplicationState_UintInt64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::int64_t Int64Uint()
|
|
{
|
|
const std::int64_t t1 = 2;
|
|
const std::uint32_t u1 = 3;
|
|
std::int64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int64_t, std::uint32_t, MultiplicationState_Int64Uint>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::int64_t Int64Int64()
|
|
{
|
|
const std::int64_t t1 = 2;
|
|
const std::int64_t u1 = 3;
|
|
std::int64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int64_t, std::int64_t, MultiplicationState_Int64Int64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::int64_t Int64Int()
|
|
{
|
|
const std::int64_t t1 = 2;
|
|
const std::int32_t u1 = 3;
|
|
std::int64_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int64_t, std::int32_t, MultiplicationState_Int64Int>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14 std::int32_t IntUint64()
|
|
{
|
|
const std::int32_t t1 = 2;
|
|
const std::uint64_t u1 = 3;
|
|
std::int32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int32_t, std::uint64_t, MultiplicationState_IntUint64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::int64_t Int64Uint64()
|
|
{
|
|
const std::int64_t t1 = 2;
|
|
const std::uint64_t u1 = 3;
|
|
std::int64_t r1 = 0;
|
|
|
|
if (!MultiplicationHelper< std::int64_t, std::uint64_t, MultiplicationState_Int64Uint64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
_CONSTEXPR14_MULTIPLY std::int32_t IntInt64()
|
|
{
|
|
const std::int32_t t1 = 2;
|
|
const std::int64_t u1 = 3;
|
|
std::int32_t r1 = 0;
|
|
if (!MultiplicationHelper< std::int32_t, std::int64_t, MultiplicationState_IntInt64>::Multiply(t1, u1, r1))
|
|
return 0;
|
|
|
|
return r1;
|
|
}
|
|
|
|
void IntrinsicConstExpr()
|
|
{
|
|
// Need to ensure that nothing that calls an intrinsic is marked constexpr, and everything that doesn't call an intrinsic is marked
|
|
static constexpr std::int16_t test1 = CastInt();
|
|
static constexpr std::uint16_t test2 = CastUint();
|
|
static constexpr std::int32_t test3 = CastInt64();
|
|
static constexpr std::uint32_t test4 = CastUint64();
|
|
static _CONSTEXPR14_MULTIPLY std::uint64_t test5 = Uint64Uint64();
|
|
static _CONSTEXPR14_MULTIPLY std::uint64_t test6 = Uint64Uint();
|
|
static constexpr std::uint32_t test7 = UintUint64();
|
|
static _CONSTEXPR14_MULTIPLY std::uint64_t test8 = Uint64Int();
|
|
static _CONSTEXPR14_MULTIPLY std::uint64_t test9 = Uint64Int64();
|
|
static constexpr std::uint32_t test10 = UintInt64();
|
|
static _CONSTEXPR14_MULTIPLY std::int64_t test11 = Int64Uint();
|
|
static _CONSTEXPR14_MULTIPLY std::int64_t test12 = Int64Int64();
|
|
static _CONSTEXPR14_MULTIPLY std::int64_t test13 = Int64Int();
|
|
static constexpr std::int32_t test14 = IntUint64();
|
|
static _CONSTEXPR14_MULTIPLY std::int64_t test15 = Int64Uint64();
|
|
static _CONSTEXPR14_MULTIPLY std::int32_t test16 = IntInt64();
|
|
}
|
|
|
|
#else
|
|
void IntrinsicConstExpr(){}
|
|
#endif |