Skip to content

Commit 735afc8

Browse files
authored
[libc] Added type-generic macros for fixed-point functions (llvm#129371)
Adds macros `absfx`, `countlsfx` and `roundfx` . ref: llvm#129111
1 parent 667bbd2 commit 735afc8

File tree

4 files changed

+182
-1
lines changed

4 files changed

+182
-1
lines changed

libc/include/llvm-libc-macros/stdfix-macros.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,45 @@
323323
#define ULACCUM_EPSILON 0x1.0p-32ULK
324324
#endif // ULACCUM_EPSILON
325325

326+
#define absfx(x) \
327+
_Generic((x), \
328+
fract: absr, \
329+
short fract: abshr, \
330+
long fract: abslr, \
331+
accum: absk, \
332+
short accum: abshk, \
333+
long accum: abslk)(x)
334+
335+
#define countlsfx(x) \
336+
_Generic((x), \
337+
fract: countlsr, \
338+
short fract: countlshr, \
339+
long fract: countlslr, \
340+
accum: countlsk, \
341+
short accum: countlshk, \
342+
long accum: countlslk, \
343+
unsigned fract: countlsur, \
344+
unsigned short fract: countlsuhr, \
345+
unsigned long fract: countlsulr, \
346+
unsigned accum: countlsuk, \
347+
unsigned short accum: countlsuhk, \
348+
unsigned long accum: countlsulk)(x)
349+
350+
#define roundfx(x, y) \
351+
_Generic((x), \
352+
fract: roundr, \
353+
short fract: roundhr, \
354+
long fract: roundlr, \
355+
accum: roundk, \
356+
short accum: roundhk, \
357+
long accum: roundlk, \
358+
unsigned fract: roundur, \
359+
unsigned short fract: rounduhr, \
360+
unsigned long fract: roundulr, \
361+
unsigned accum: rounduk, \
362+
unsigned short accum: rounduhk, \
363+
unsigned long accum: roundulk)(x, y)
364+
326365
#endif // LIBC_COMPILER_HAS_FIXED_POINT
327366

328367
#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H

libc/include/stdfix.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
header: stdfix.h
22
header_template: stdfix.h.def
3-
macros: []
3+
macros:
4+
- macro_name: absfx
5+
macro_header: stdfix-macros.h
6+
- macro_name: countlsfx
7+
macro_header: stdfix-macros.h
8+
- macro_name: roundfx
9+
macro_header: stdfix-macros.h
410
types:
511
- type_name: stdfix-types
612
enums: []

libc/test/src/stdfix/CMakeLists.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ endif()
44

55
add_custom_target(libc-stdfix-tests)
66

7+
78
foreach(suffix IN ITEMS hr r lr hk k lk)
89
add_libc_test(
910
abs${suffix}_test
@@ -176,3 +177,25 @@ add_libc_test(
176177
libc.src.__support.fixed_point.fx_rep
177178
libc.src.__support.FPUtil.basic_operations
178179
)
180+
181+
set(macros_depends)
182+
183+
foreach(s IN ITEMS r hr lr k hk lk)
184+
list(APPEND macros_depends
185+
libc.src.stdfix.abs${s}
186+
libc.src.stdfix.countls${s}
187+
libc.src.stdfix.countlsu${s}
188+
libc.src.stdfix.round${s}
189+
libc.src.stdfix.roundu${s}
190+
)
191+
endforeach()
192+
193+
add_libc_test(
194+
macros_test
195+
SUITE libc-stdfix-tests
196+
SRCS macros_test.cpp
197+
DEPENDS
198+
libc.include.stdfix
199+
${macros_depends}
200+
)
201+

libc/test/src/stdfix/macros_test.cpp

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//===-- Unittests for absfx -----------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "AbsTest.h"
10+
#include "src/stdfix/abshk.h"
11+
#include "src/stdfix/abshr.h"
12+
#include "src/stdfix/absk.h"
13+
#include "src/stdfix/abslk.h"
14+
#include "src/stdfix/abslr.h"
15+
#include "src/stdfix/absr.h"
16+
17+
#include "src/stdfix/countlshk.h"
18+
#include "src/stdfix/countlshr.h"
19+
#include "src/stdfix/countlsk.h"
20+
#include "src/stdfix/countlslk.h"
21+
#include "src/stdfix/countlslr.h"
22+
#include "src/stdfix/countlsr.h"
23+
#include "src/stdfix/countlsuhk.h"
24+
#include "src/stdfix/countlsuhr.h"
25+
#include "src/stdfix/countlsuk.h"
26+
#include "src/stdfix/countlsulk.h"
27+
#include "src/stdfix/countlsulr.h"
28+
#include "src/stdfix/countlsur.h"
29+
30+
#include "src/stdfix/roundhk.h"
31+
#include "src/stdfix/roundhr.h"
32+
#include "src/stdfix/roundk.h"
33+
#include "src/stdfix/roundlk.h"
34+
#include "src/stdfix/roundlr.h"
35+
#include "src/stdfix/roundr.h"
36+
#include "src/stdfix/rounduhk.h"
37+
#include "src/stdfix/rounduhr.h"
38+
#include "src/stdfix/rounduk.h"
39+
#include "src/stdfix/roundulk.h"
40+
#include "src/stdfix/roundulr.h"
41+
#include "src/stdfix/roundur.h"
42+
43+
using LIBC_NAMESPACE::abshk;
44+
using LIBC_NAMESPACE::abshr;
45+
using LIBC_NAMESPACE::absk;
46+
using LIBC_NAMESPACE::abslk;
47+
using LIBC_NAMESPACE::abslr;
48+
using LIBC_NAMESPACE::absr;
49+
using LIBC_NAMESPACE::countlshk;
50+
using LIBC_NAMESPACE::countlshr;
51+
using LIBC_NAMESPACE::countlsk;
52+
using LIBC_NAMESPACE::countlslk;
53+
using LIBC_NAMESPACE::countlslr;
54+
using LIBC_NAMESPACE::countlsr;
55+
using LIBC_NAMESPACE::countlsuhk;
56+
using LIBC_NAMESPACE::countlsuhr;
57+
using LIBC_NAMESPACE::countlsuk;
58+
using LIBC_NAMESPACE::countlsulk;
59+
using LIBC_NAMESPACE::countlsulr;
60+
using LIBC_NAMESPACE::countlsur;
61+
using LIBC_NAMESPACE::roundhk;
62+
using LIBC_NAMESPACE::roundhr;
63+
using LIBC_NAMESPACE::roundk;
64+
using LIBC_NAMESPACE::roundlk;
65+
using LIBC_NAMESPACE::roundlr;
66+
using LIBC_NAMESPACE::roundr;
67+
using LIBC_NAMESPACE::rounduhk;
68+
using LIBC_NAMESPACE::rounduhr;
69+
using LIBC_NAMESPACE::rounduk;
70+
using LIBC_NAMESPACE::roundulk;
71+
using LIBC_NAMESPACE::roundulr;
72+
using LIBC_NAMESPACE::roundur;
73+
74+
TEST(LlvmLibcAbsfxTest, Basic) {
75+
ASSERT_EQ(absfx(-0.5r), absr(-0.5r));
76+
ASSERT_EQ(absfx(-0.5hr), abshr(-0.5hr));
77+
ASSERT_EQ(absfx(-0.5lr), abslr(-0.5lr));
78+
ASSERT_EQ(absfx(-0.5k), absk(-0.5k));
79+
ASSERT_EQ(absfx(-0.5hk), abshk(-0.5hk));
80+
ASSERT_EQ(absfx(-0.5lk), abslk(-0.5lk));
81+
}
82+
83+
TEST(LlvmLibcRoundfxTest, Basic) {
84+
ASSERT_EQ(roundfx(0.75r, 0), roundr(0.75r, 0));
85+
ASSERT_EQ(roundfx(0.75hr, 0), roundhr(0.75hr, 0));
86+
ASSERT_EQ(roundfx(0.75lr, 0), roundlr(0.75lr, 0));
87+
ASSERT_EQ(roundfx(0.75k, 0), roundk(0.75k, 0));
88+
ASSERT_EQ(roundfx(0.75hk, 0), roundhk(0.75hk, 0));
89+
ASSERT_EQ(roundfx(0.75lk, 0), roundlk(0.75lk, 0));
90+
91+
ASSERT_EQ(roundfx(0.75ur, 0), roundur(0.75ur, 0));
92+
ASSERT_EQ(roundfx(0.75uhr, 0), rounduhr(0.75uhr, 0));
93+
ASSERT_EQ(roundfx(0.75ulr, 0), roundulr(0.75ulr, 0));
94+
ASSERT_EQ(roundfx(0.75uk, 0), rounduk(0.75uk, 0));
95+
ASSERT_EQ(roundfx(0.75uhk, 0), rounduhk(0.75uhk, 0));
96+
ASSERT_EQ(roundfx(0.75ulk, 0), roundulk(0.75ulk, 0));
97+
}
98+
99+
TEST(LlvmLibcCountlsfxTest, Basic) {
100+
ASSERT_EQ(countlsfx(0.5r), countlsr(0.5r));
101+
ASSERT_EQ(countlsfx(0.5hr), countlshr(0.5hr));
102+
ASSERT_EQ(countlsfx(0.5lr), countlslr(0.5lr));
103+
ASSERT_EQ(countlsfx(0.5k), countlsk(0.5k));
104+
ASSERT_EQ(countlsfx(0.5hk), countlshk(0.5hk));
105+
ASSERT_EQ(countlsfx(0.5lk), countlslk(0.5lk));
106+
107+
ASSERT_EQ(countlsfx(0.5ur), countlsur(0.5ur));
108+
ASSERT_EQ(countlsfx(0.5uhr), countlsuhr(0.5uhr));
109+
ASSERT_EQ(countlsfx(0.5ulr), countlsulr(0.5ulr));
110+
ASSERT_EQ(countlsfx(0.5uk), countlsuk(0.5uk));
111+
ASSERT_EQ(countlsfx(0.5uhk), countlsuhk(0.5uhk));
112+
ASSERT_EQ(countlsfx(0.5ulk), countlsulk(0.5ulk));
113+
}

0 commit comments

Comments
 (0)