Implement ck_pr_dec_is_zero family of functions (#115)
* Implement ck_pr_dec_is_zero family of functions * include/ck_pr.h: add ck_pr_{dec,inc}_is_zero and implement ck_pr_{dec,inc}_zero in terms of the new functions. Convert the architecture-specific implementations of ck_pr_foo_zero for x86 and x86-64 to ck_pr_foo_is_zero. * regressions/ck_pr/validate: add smoke tests for ck_pr_dec_{,is_}zero and ck_pr_inc_{,is_}zero * doc: document ck_pr_inc_is_zeroawsm
parent
0f017230cc
commit
1c2469358e
@ -0,0 +1,105 @@
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ck_pr.h>
|
||||
|
||||
#define EXPECT(ACTUAL, IS_ZERO, TYPE, INITIAL) do { \
|
||||
TYPE expected = (TYPE)((TYPE)INITIAL - (TYPE)1); \
|
||||
if ((ACTUAL) != expected) { \
|
||||
printf("FAIL [ %" PRIx64" != %" PRIx64" ]\n", \
|
||||
(uint64_t)(ACTUAL), \
|
||||
(uint64_t)expected); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
\
|
||||
if ((IS_ZERO) != ((ACTUAL) == 0)) { \
|
||||
printf("FAIL [ %s != %s ]\n", \
|
||||
((IS_ZERO) ? "true" : "false"), \
|
||||
(((ACTUAL) == 0) ? "true" : "false")); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TEST_ZERO(TYPE, SUFFIX) do { \
|
||||
TYPE datum; \
|
||||
bool is_zero; \
|
||||
\
|
||||
datum = 0; \
|
||||
ck_pr_dec_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 0); \
|
||||
\
|
||||
datum = (TYPE)-1; \
|
||||
ck_pr_dec_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, -1); \
|
||||
\
|
||||
datum = (TYPE)1; \
|
||||
ck_pr_dec_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 1); \
|
||||
\
|
||||
datum = (TYPE)2; \
|
||||
ck_pr_dec_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 2); \
|
||||
} while (0)
|
||||
|
||||
#define TEST_IS_ZERO(TYPE, SUFFIX) do { \
|
||||
TYPE datum; \
|
||||
bool is_zero; \
|
||||
\
|
||||
datum = 0; \
|
||||
is_zero = ck_pr_dec_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 0); \
|
||||
\
|
||||
datum = (TYPE)-1; \
|
||||
is_zero = ck_pr_dec_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, -1); \
|
||||
\
|
||||
datum = (TYPE)1; \
|
||||
is_zero = ck_pr_dec_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 1); \
|
||||
\
|
||||
datum = (TYPE)2; \
|
||||
is_zero = ck_pr_dec_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 2); \
|
||||
} while (0)
|
||||
|
||||
#define TEST(TYPE, SUFFIX) do { \
|
||||
TEST_ZERO(TYPE, SUFFIX); \
|
||||
TEST_IS_ZERO(TYPE, SUFFIX); \
|
||||
} while (0)
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
#ifdef CK_F_PR_DEC_64_ZERO
|
||||
TEST(uint64_t, 64);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_32_ZERO
|
||||
TEST(uint32_t, 32);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_16_ZERO
|
||||
TEST(uint16_t, 16);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_8_ZERO
|
||||
TEST(uint8_t, 8);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_UINT_ZERO
|
||||
TEST(unsigned int, uint);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_INT_ZERO
|
||||
TEST(int, int);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_DEC_CHAR_ZERO
|
||||
TEST(char, char);
|
||||
#endif
|
||||
|
||||
return (0);
|
||||
}
|
@ -0,0 +1,105 @@
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ck_pr.h>
|
||||
|
||||
#define EXPECT(ACTUAL, IS_ZERO, TYPE, INITIAL) do { \
|
||||
TYPE expected = (TYPE)((TYPE)INITIAL + (TYPE)1); \
|
||||
if ((ACTUAL) != expected) { \
|
||||
printf("FAIL [ %" PRIx64" != %" PRIx64" ]\n", \
|
||||
(uint64_t)(ACTUAL), \
|
||||
(uint64_t)expected); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
\
|
||||
if ((IS_ZERO) != ((ACTUAL) == 0)) { \
|
||||
printf("FAIL [ %s != %s ]\n", \
|
||||
((IS_ZERO) ? "true" : "false"), \
|
||||
(((ACTUAL) == 0) ? "true" : "false")); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TEST_ZERO(TYPE, SUFFIX) do { \
|
||||
TYPE datum; \
|
||||
bool is_zero; \
|
||||
\
|
||||
datum = 0; \
|
||||
ck_pr_inc_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 0); \
|
||||
\
|
||||
datum = (TYPE)-1; \
|
||||
ck_pr_inc_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, -1); \
|
||||
\
|
||||
datum = (TYPE)1; \
|
||||
ck_pr_inc_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 1); \
|
||||
\
|
||||
datum = (TYPE)2; \
|
||||
ck_pr_inc_##SUFFIX##_zero(&datum, &is_zero); \
|
||||
EXPECT(datum, is_zero, TYPE, 2); \
|
||||
} while (0)
|
||||
|
||||
#define TEST_IS_ZERO(TYPE, SUFFIX) do { \
|
||||
TYPE datum; \
|
||||
bool is_zero; \
|
||||
\
|
||||
datum = 0; \
|
||||
is_zero = ck_pr_inc_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 0); \
|
||||
\
|
||||
datum = (TYPE)-1; \
|
||||
is_zero = ck_pr_inc_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, -1); \
|
||||
\
|
||||
datum = (TYPE)1; \
|
||||
is_zero = ck_pr_inc_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 1); \
|
||||
\
|
||||
datum = (TYPE)2; \
|
||||
is_zero = ck_pr_inc_##SUFFIX##_is_zero(&datum); \
|
||||
EXPECT(datum, is_zero, TYPE, 2); \
|
||||
} while (0)
|
||||
|
||||
#define TEST(TYPE, SUFFIX) do { \
|
||||
TEST_ZERO(TYPE, SUFFIX); \
|
||||
TEST_IS_ZERO(TYPE, SUFFIX); \
|
||||
} while (0)
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
#ifdef CK_F_PR_INC_64_ZERO
|
||||
TEST(uint64_t, 64);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_32_ZERO
|
||||
TEST(uint32_t, 32);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_16_ZERO
|
||||
TEST(uint16_t, 16);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_8_ZERO
|
||||
TEST(uint8_t, 8);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_UINT_ZERO
|
||||
TEST(unsigned int, uint);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_INT_ZERO
|
||||
TEST(int, int);
|
||||
#endif
|
||||
|
||||
#ifdef CK_F_PR_INC_CHAR_ZERO
|
||||
TEST(char, char);
|
||||
#endif
|
||||
|
||||
return (0);
|
||||
}
|
Loading…
Reference in new issue