|
| 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