php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
private.h
Go to the documentation of this file.
1/* private.h: bcmath library header. */
2/*
3 Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
4 Copyright (C) 2000 Philip A. Nelson
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details. (LICENSE)
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to:
18
19 The Free Software Foundation, Inc.
20 59 Temple Place, Suite 330
21 Boston, MA 02111-1307 USA.
22
23 You may contact the author by:
24 e-mail: philnelson@acm.org
25 us-mail: Philip A. Nelson
26 Computer Science Department, 9062
27 Western Washington University
28 Bellingham, WA 98226-9062
29
30*************************************************************************/
31
32/* "Private" routines to bcmath. */
33
34#include <stdbool.h>
35#include <stddef.h>
36#include "zend_portability.h"
37
38/* This will be 0x01010101 for 32-bit and 0x0101010101010101 for 64-bit */
39#define SWAR_ONES (~((size_t) 0) / 0xFF)
40/* This repeats a byte `x` into an entire 32/64-bit word.
41 * Example: SWAR_REPEAT(0xAB) will be 0xABABABAB for 32-bit and 0xABABABABABABABAB for 64-bit. */
42#define SWAR_REPEAT(x) (SWAR_ONES * (x))
43
44#if SIZEOF_SIZE_T >= 8
45# define BC_BSWAP(u) ZEND_BYTES_SWAP64(u)
46 typedef uint64_t BC_VECTOR;
47# define BC_VECTOR_SIZE 8
48/* The boundary number is computed from BASE ** BC_VECTOR_SIZE */
49# define BC_VECTOR_BOUNDARY_NUM (BC_VECTOR) 100000000
50#else
51# define BC_BSWAP(u) ZEND_BYTES_SWAP32(u)
52 typedef uint32_t BC_VECTOR;
53# define BC_VECTOR_SIZE 4
54/* The boundary number is computed from BASE ** BC_VECTOR_SIZE */
55# define BC_VECTOR_BOUNDARY_NUM (BC_VECTOR) 10000
56#endif
57
58#ifdef WORDS_BIGENDIAN
59# define BC_LITTLE_ENDIAN 0
60#else
61# define BC_LITTLE_ENDIAN 1
62#endif
63
64/*
65 * Adding more than this many times may cause uint32_t/uint64_t to overflow.
66 * Typically this is 1844 for 64bit and 42 for 32bit.
67 */
68#define BC_VECTOR_NO_OVERFLOW_ADD_COUNT (~((BC_VECTOR) 0) / (BC_VECTOR_BOUNDARY_NUM * BC_VECTOR_BOUNDARY_NUM))
69
70
71/* routines */
72bcmath_compare_result _bc_do_compare (bc_num n1, bc_num n2, size_t scale, bool use_sign);
struct bc_struct * bc_num
Definition bcmath.h:39
bcmath_compare_result
Definition bcmath.h:113
void _bc_rm_leading_zeros(bc_num num)
Definition rmzero.c:39
bcmath_compare_result _bc_do_compare(bc_num n1, bc_num n2, size_t scale, bool use_sign)
Definition compare.c:42
uint32_t BC_VECTOR
Definition private.h:52
bc_num _bc_do_sub(bc_num n1, bc_num n2)
Definition doaddsub.c:172
bc_num _bc_do_add(bc_num n1, bc_num n2)
Definition doaddsub.c:41