|
14 | 14 | #include "llvm/Support/Alignment.h"
|
15 | 15 | #include "gtest/gtest.h"
|
16 | 16 | #include <array>
|
| 17 | +#include <climits> |
17 | 18 | #include <optional>
|
18 | 19 |
|
19 | 20 | using namespace llvm;
|
@@ -2911,6 +2912,91 @@ TEST(APIntTest, RoundingSDiv) {
|
2911 | 2912 | }
|
2912 | 2913 | }
|
2913 | 2914 |
|
| 2915 | +TEST(APIntTest, Average) { |
| 2916 | + APInt A0(32, 0); |
| 2917 | + APInt A2(32, 2); |
| 2918 | + APInt A100(32, 100); |
| 2919 | + APInt A101(32, 101); |
| 2920 | + APInt A200(32, 200, false); |
| 2921 | + APInt ApUMax(32, UINT_MAX, false); |
| 2922 | + |
| 2923 | + EXPECT_EQ(APInt(32, 150), APIntOps::avgFloorU(A100, A200)); |
| 2924 | + EXPECT_EQ(APIntOps::RoundingUDiv(A100 + A200, A2, APInt::Rounding::DOWN), |
| 2925 | + APIntOps::avgFloorU(A100, A200)); |
| 2926 | + EXPECT_EQ(APIntOps::RoundingUDiv(A100 + A200, A2, APInt::Rounding::UP), |
| 2927 | + APIntOps::avgCeilU(A100, A200)); |
| 2928 | + EXPECT_EQ(APIntOps::RoundingUDiv(A100 + A101, A2, APInt::Rounding::DOWN), |
| 2929 | + APIntOps::avgFloorU(A100, A101)); |
| 2930 | + EXPECT_EQ(APIntOps::RoundingUDiv(A100 + A101, A2, APInt::Rounding::UP), |
| 2931 | + APIntOps::avgCeilU(A100, A101)); |
| 2932 | + EXPECT_EQ(A0, APIntOps::avgFloorU(A0, A0)); |
| 2933 | + EXPECT_EQ(A0, APIntOps::avgCeilU(A0, A0)); |
| 2934 | + EXPECT_EQ(ApUMax, APIntOps::avgFloorU(ApUMax, ApUMax)); |
| 2935 | + EXPECT_EQ(ApUMax, APIntOps::avgCeilU(ApUMax, ApUMax)); |
| 2936 | + EXPECT_EQ(APIntOps::RoundingUDiv(ApUMax, A2, APInt::Rounding::DOWN), |
| 2937 | + APIntOps::avgFloorU(A0, ApUMax)); |
| 2938 | + EXPECT_EQ(APIntOps::RoundingUDiv(ApUMax, A2, APInt::Rounding::UP), |
| 2939 | + APIntOps::avgCeilU(A0, ApUMax)); |
| 2940 | + |
| 2941 | + APInt Ap100(32, +100); |
| 2942 | + APInt Ap101(32, +101); |
| 2943 | + APInt Ap200(32, +200); |
| 2944 | + APInt Am1(32, -1); |
| 2945 | + APInt Am100(32, -100); |
| 2946 | + APInt Am101(32, -101); |
| 2947 | + APInt Am200(32, -200); |
| 2948 | + APInt AmSMin(32, INT_MIN); |
| 2949 | + APInt ApSMax(32, INT_MAX); |
| 2950 | + |
| 2951 | + EXPECT_EQ(APInt(32, +150), APIntOps::avgFloorS(Ap100, Ap200)); |
| 2952 | + EXPECT_EQ(APIntOps::RoundingSDiv(Ap100 + Ap200, A2, APInt::Rounding::DOWN), |
| 2953 | + APIntOps::avgFloorS(Ap100, Ap200)); |
| 2954 | + EXPECT_EQ(APIntOps::RoundingSDiv(Ap100 + Ap200, A2, APInt::Rounding::UP), |
| 2955 | + APIntOps::avgCeilS(Ap100, Ap200)); |
| 2956 | + |
| 2957 | + EXPECT_EQ(APInt(32, -150), APIntOps::avgFloorS(Am100, Am200)); |
| 2958 | + EXPECT_EQ(APIntOps::RoundingSDiv(Am100 + Am200, A2, APInt::Rounding::DOWN), |
| 2959 | + APIntOps::avgFloorS(Am100, Am200)); |
| 2960 | + EXPECT_EQ(APIntOps::RoundingSDiv(Am100 + Am200, A2, APInt::Rounding::UP), |
| 2961 | + APIntOps::avgCeilS(Am100, Am200)); |
| 2962 | + |
| 2963 | + EXPECT_EQ(APInt(32, +100), APIntOps::avgFloorS(Ap100, Ap101)); |
| 2964 | + EXPECT_EQ(APIntOps::RoundingSDiv(Ap100 + Ap101, A2, APInt::Rounding::DOWN), |
| 2965 | + APIntOps::avgFloorS(Ap100, Ap101)); |
| 2966 | + EXPECT_EQ(APInt(32, +101), APIntOps::avgCeilS(Ap100, Ap101)); |
| 2967 | + EXPECT_EQ(APIntOps::RoundingSDiv(Ap100 + Ap101, A2, APInt::Rounding::UP), |
| 2968 | + APIntOps::avgCeilS(Ap100, Ap101)); |
| 2969 | + |
| 2970 | + EXPECT_EQ(APInt(32, -101), APIntOps::avgFloorS(Am100, Am101)); |
| 2971 | + EXPECT_EQ(APIntOps::RoundingSDiv(Am100 + Am101, A2, APInt::Rounding::DOWN), |
| 2972 | + APIntOps::avgFloorS(Am100, Am101)); |
| 2973 | + EXPECT_EQ(APInt(32, -100), APIntOps::avgCeilS(Am100, Am101)); |
| 2974 | + EXPECT_EQ(APIntOps::RoundingSDiv(Am100 + Am101, A2, APInt::Rounding::UP), |
| 2975 | + APIntOps::avgCeilS(Am100, Am101)); |
| 2976 | + |
| 2977 | + EXPECT_EQ(AmSMin, APIntOps::avgFloorS(AmSMin, AmSMin)); |
| 2978 | + EXPECT_EQ(AmSMin, APIntOps::avgCeilS(AmSMin, AmSMin)); |
| 2979 | + |
| 2980 | + EXPECT_EQ(APIntOps::RoundingSDiv(AmSMin, A2, APInt::Rounding::DOWN), |
| 2981 | + APIntOps::avgFloorS(A0, AmSMin)); |
| 2982 | + EXPECT_EQ(APIntOps::RoundingSDiv(AmSMin, A2, APInt::Rounding::UP), |
| 2983 | + APIntOps::avgCeilS(A0, AmSMin)); |
| 2984 | + |
| 2985 | + EXPECT_EQ(A0, APIntOps::avgFloorS(A0, A0)); |
| 2986 | + EXPECT_EQ(A0, APIntOps::avgCeilS(A0, A0)); |
| 2987 | + |
| 2988 | + EXPECT_EQ(Am1, APIntOps::avgFloorS(AmSMin, ApSMax)); |
| 2989 | + EXPECT_EQ(A0, APIntOps::avgCeilS(AmSMin, ApSMax)); |
| 2990 | + |
| 2991 | + EXPECT_EQ(APIntOps::RoundingSDiv(ApSMax, A2, APInt::Rounding::DOWN), |
| 2992 | + APIntOps::avgFloorS(A0, ApSMax)); |
| 2993 | + EXPECT_EQ(APIntOps::RoundingSDiv(ApSMax, A2, APInt::Rounding::UP), |
| 2994 | + APIntOps::avgCeilS(A0, ApSMax)); |
| 2995 | + |
| 2996 | + EXPECT_EQ(ApSMax, APIntOps::avgFloorS(ApSMax, ApSMax)); |
| 2997 | + EXPECT_EQ(ApSMax, APIntOps::avgCeilS(ApSMax, ApSMax)); |
| 2998 | +} |
| 2999 | + |
2914 | 3000 | TEST(APIntTest, umul_ov) {
|
2915 | 3001 | const std::pair<uint64_t, uint64_t> Overflows[] = {
|
2916 | 3002 | {0x8000000000000000, 2},
|
|
0 commit comments