zeek/auxil/spicy/3rdparty/SafeInt/Test/ConstExpr_Intrinsics.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

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