Skip to content

Commit 8cfc423

Browse files
authored
Merge pull request #650 from sanpeqf/feat-dword
feat dword: prioritize using the compiler for computation
2 parents a96032a + d130e03 commit 8cfc423

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/* SPDX-License-Identifier: LGPL-3.0-or-later */
2+
/*
3+
* Copyright(c) 2024 John Sanpe <sanpeqf@gmail.com>
4+
*/
5+
6+
#ifndef _BFDEV_ASM_DWORD_H_
7+
#define _BFDEV_ASM_DWORD_H_
8+
9+
#include <bfdev/config.h>
10+
#include <bfdev/asm/bitsperlong.h>
11+
12+
BFDEV_BEGIN_DECLS
13+
14+
#if BFDEV_BITS_PER_LONG == 32
15+
# define __BFDEV_ASM_HAVE_DWORD 1
16+
#else /* BFDEV_BITS_PER_LONG == 64 */
17+
# define __BFDEV_ASM_HAVE_DWORD __SIZEOF_INT128__
18+
#endif
19+
20+
#ifndef BFDEV_ASM_HAVE_DWORD
21+
# define BFDEV_ASM_HAVE_DWORD __BFDEV_ASM_HAVE_DWORD
22+
#endif
23+
24+
BFDEV_END_DECLS
25+
26+
#ifdef BFDEV_ASM_HAVE_DWORD
27+
# include <bfdev/asm-generic/dword-compiler.h>
28+
#endif
29+
30+
#include <bfdev/asm-generic/dword.h>
31+
32+
#endif /* _BFDEV_ASM_DWORD_H_ */
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* SPDX-License-Identifier: LGPL-3.0-or-later */
2+
/*
3+
* Copyright(c) 2025 John Sanpe <sanpeqf@gmail.com>
4+
*/
5+
6+
#ifndef _BFDEV_ASM_GENERIC_DWORD_H_
7+
#define _BFDEV_ASM_GENERIC_DWORD_H_
8+
9+
#include <bfdev/config.h>
10+
#include <bfdev/types.h>
11+
#include <bfdev/stddef.h>
12+
#include <bfdev/bits.h>
13+
14+
BFDEV_BEGIN_DECLS
15+
16+
#if BFDEV_BITS_PER_LONG == 32
17+
typedef uint64_t bfdev_dword_t;
18+
#else
19+
typedef unsigned __int128 bfdev_dword_t;
20+
#endif
21+
22+
#ifndef bfdev_dword_addd
23+
# define bfdev_dword_addd bfdev_dword_addd
24+
static __bfdev_always_inline void
25+
bfdev_dword_addd(bfdev_uw_t *sh, bfdev_uw_t *sl, bfdev_uw_t ah,
26+
bfdev_uw_t al, bfdev_uw_t bh, bfdev_uw_t bl)
27+
{
28+
bfdev_dword_t ac, bc, sc;
29+
30+
ac = (bfdev_dword_t)ah << BFDEV_BITS_PER_LONG | al;
31+
bc = (bfdev_dword_t)bh << BFDEV_BITS_PER_LONG | bl;
32+
33+
sc = ac + bc;
34+
*sh = (bfdev_uw_t)(sc >> BFDEV_BITS_PER_LONG);
35+
*sl = (bfdev_uw_t)sc;
36+
}
37+
#endif
38+
39+
#ifndef bfdev_dword_sub_ddmmss
40+
# define bfdev_dword_sub_ddmmss bfdev_dword_sub_ddmmss
41+
static __bfdev_always_inline void
42+
bfdev_dword_sub_ddmmss(bfdev_uw_t *sh, bfdev_uw_t *sl, bfdev_uw_t ah,
43+
bfdev_uw_t al, bfdev_uw_t bh, bfdev_uw_t bl)
44+
{
45+
bfdev_dword_t ac, bc, sc;
46+
47+
ac = (bfdev_dword_t)ah << BFDEV_BITS_PER_LONG | al;
48+
bc = (bfdev_dword_t)bh << BFDEV_BITS_PER_LONG | bl;
49+
50+
sc = ac - bc;
51+
*sh = (bfdev_uw_t)(sc >> BFDEV_BITS_PER_LONG);
52+
*sl = (bfdev_uw_t)sc;
53+
}
54+
#endif
55+
56+
#ifndef bfdev_dword_umul_ppmm
57+
# define bfdev_dword_umul_ppmm bfdev_dword_umul_ppmm
58+
static __bfdev_always_inline void
59+
bfdev_dword_umul_ppmm(bfdev_uw_t *dh, bfdev_uw_t *dl,
60+
bfdev_uw_t va, bfdev_uw_t vb)
61+
{
62+
bfdev_dword_t sc;
63+
64+
sc = (bfdev_dword_t)va * vb;
65+
*dh = (bfdev_uw_t)(sc >> BFDEV_BITS_PER_LONG);
66+
*dl = (bfdev_uw_t)sc;
67+
}
68+
#endif
69+
70+
#ifndef bfdev_dword_udiv_qrnnd
71+
# define bfdev_dword_udiv_qrnnd bfdev_dword_udiv_qrnnd
72+
static __bfdev_always_inline void
73+
bfdev_dword_udiv_qrnnd(bfdev_uw_t *quot, bfdev_uw_t *rem, bfdev_uw_t vh,
74+
bfdev_uw_t vl, bfdev_uw_t div)
75+
{
76+
bfdev_dword_t vc;
77+
78+
vc = (bfdev_dword_t)vh << BFDEV_BITS_PER_LONG | vl;
79+
*quot = (bfdev_uw_t)(vc / div);
80+
*rem = (bfdev_uw_t)(vc % div);
81+
}
82+
#endif
83+
84+
BFDEV_END_DECLS
85+
86+
#endif /* _BFDEV_ASM_GENERIC_DWORD_H_ */

0 commit comments

Comments
 (0)