Skip to content

Commit edfd55c

Browse files
ext/bcmath: use vector in compare (#18859)
1 parent feb1d63 commit edfd55c

File tree

1 file changed

+39
-30
lines changed

1 file changed

+39
-30
lines changed

ext/bcmath/libbcmath/src/compare.c

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,25 @@
3939
than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just
4040
compare the magnitudes. */
4141

42+
static inline bcmath_compare_result bc_compare_get_result_val(bool left_abs_greater, bool use_sign, sign left_sign)
43+
{
44+
if (left_abs_greater) {
45+
/* Magnitude of left > right. */
46+
if (!use_sign || left_sign == PLUS) {
47+
return BCMATH_LEFT_GREATER;
48+
} else {
49+
return BCMATH_RIGHT_GREATER;
50+
}
51+
} else {
52+
/* Magnitude of left < right. */
53+
if (!use_sign || left_sign == PLUS) {
54+
return BCMATH_RIGHT_GREATER;
55+
} else {
56+
return BCMATH_LEFT_GREATER;
57+
}
58+
}
59+
}
60+
4261
bcmath_compare_result _bc_do_compare(bc_num n1, bc_num n2, size_t scale, bool use_sign)
4362
{
4463
/* First, compare signs. */
@@ -66,21 +85,7 @@ bcmath_compare_result _bc_do_compare(bc_num n1, bc_num n2, size_t scale, bool us
6685

6786
/* Now compare the magnitude. */
6887
if (n1->n_len != n2->n_len) {
69-
if (n1->n_len > n2->n_len) {
70-
/* Magnitude of n1 > n2. */
71-
if (!use_sign || n1->n_sign == PLUS) {
72-
return BCMATH_LEFT_GREATER;
73-
} else {
74-
return BCMATH_RIGHT_GREATER;
75-
}
76-
} else {
77-
/* Magnitude of n1 < n2. */
78-
if (!use_sign || n1->n_sign == PLUS) {
79-
return BCMATH_RIGHT_GREATER;
80-
} else {
81-
return BCMATH_LEFT_GREATER;
82-
}
83-
}
88+
return bc_compare_get_result_val(n1->n_len > n2->n_len, use_sign, n1->n_sign);
8489
}
8590

8691
size_t n1_scale = MIN(n1->n_scale, scale);
@@ -92,28 +97,32 @@ bcmath_compare_result _bc_do_compare(bc_num n1, bc_num n2, size_t scale, bool us
9297
const char *n1ptr = n1->n_value;
9398
const char *n2ptr = n2->n_value;
9499

100+
while (count >= sizeof(BC_VECTOR)) {
101+
BC_VECTOR n1bytes;
102+
BC_VECTOR n2bytes;
103+
memcpy(&n1bytes, n1ptr, sizeof(BC_VECTOR));
104+
memcpy(&n2bytes, n2ptr, sizeof(BC_VECTOR));
105+
106+
if (n1bytes != n2bytes) {
107+
#if BC_LITTLE_ENDIAN
108+
n1bytes = BC_BSWAP(n1bytes);
109+
n2bytes = BC_BSWAP(n2bytes);
110+
#endif
111+
return bc_compare_get_result_val(n1bytes > n2bytes, use_sign, n1->n_sign);
112+
}
113+
count -= sizeof(BC_VECTOR);
114+
n1ptr += sizeof(BC_VECTOR);
115+
n2ptr += sizeof(BC_VECTOR);
116+
}
117+
95118
while ((count > 0) && (*n1ptr == *n2ptr)) {
96119
n1ptr++;
97120
n2ptr++;
98121
count--;
99122
}
100123

101124
if (count != 0) {
102-
if (*n1ptr > *n2ptr) {
103-
/* Magnitude of n1 > n2. */
104-
if (!use_sign || n1->n_sign == PLUS) {
105-
return BCMATH_LEFT_GREATER;
106-
} else {
107-
return BCMATH_RIGHT_GREATER;
108-
}
109-
} else {
110-
/* Magnitude of n1 < n2. */
111-
if (!use_sign || n1->n_sign == PLUS) {
112-
return BCMATH_RIGHT_GREATER;
113-
} else {
114-
return BCMATH_LEFT_GREATER;
115-
}
116-
}
125+
return bc_compare_get_result_val(*n1ptr > *n2ptr, use_sign, n1->n_sign);
117126
}
118127

119128
/* They are equal up to the last part of the equal part of the fraction. */

0 commit comments

Comments
 (0)