Skip to content

Commit 54e3190

Browse files
committed
Optimize scalar comparisons
1 parent b7f5e0a commit 54e3190

12 files changed

+863
-1779
lines changed

ext/include/tensor_comparison.c

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,141 @@ void tensor_less_equal(zval * return_value, zval * a, zval * b)
167167

168168
RETVAL_ARR(Z_ARR(c));
169169
}
170+
171+
void tensor_equal_scalar(zval * return_value, zval * a, zval * b)
172+
{
173+
zval * valueA;
174+
zval comparison;
175+
zval c;
176+
177+
zend_array * aHat = Z_ARR_P(a);
178+
179+
array_init_size(&c, zend_array_count(aHat));
180+
181+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
182+
if (ZEPHIR_IS_EQUAL(valueA, b)) {
183+
ZVAL_LONG(&comparison, 1);
184+
} else {
185+
ZVAL_LONG(&comparison, 0);
186+
}
187+
188+
add_next_index_zval(&c, &comparison);
189+
} ZEND_HASH_FOREACH_END();
190+
191+
RETVAL_ARR(Z_ARR(c));
192+
}
193+
194+
void tensor_not_equal_scalar(zval * return_value, zval * a, zval * b)
195+
{
196+
zval * valueA;
197+
zval comparison;
198+
zval c;
199+
200+
zend_array * aHat = Z_ARR_P(a);
201+
202+
array_init_size(&c, zend_array_count(aHat));
203+
204+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
205+
if (ZEPHIR_IS_EQUAL(valueA, b)) {
206+
ZVAL_LONG(&comparison, 0);
207+
} else {
208+
ZVAL_LONG(&comparison, 1);
209+
}
210+
211+
add_next_index_zval(&c, &comparison);
212+
} ZEND_HASH_FOREACH_END();
213+
214+
RETVAL_ARR(Z_ARR(c));
215+
}
216+
217+
void tensor_greater_scalar(zval * return_value, zval * a, zval * b)
218+
{
219+
zval * valueA;
220+
zval comparison;
221+
zval c;
222+
223+
zend_array * aHat = Z_ARR_P(a);
224+
225+
array_init_size(&c, zend_array_count(aHat));
226+
227+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
228+
if (ZEPHIR_GT(valueA, b)) {
229+
ZVAL_LONG(&comparison, 1);
230+
} else {
231+
ZVAL_LONG(&comparison, 0);
232+
}
233+
234+
add_next_index_zval(&c, &comparison);
235+
} ZEND_HASH_FOREACH_END();
236+
237+
RETVAL_ARR(Z_ARR(c));
238+
}
239+
240+
void tensor_greater_equal_scalar(zval * return_value, zval * a, zval * b)
241+
{
242+
zval * valueA;
243+
zval comparison;
244+
zval c;
245+
246+
zend_array * aHat = Z_ARR_P(a);
247+
248+
array_init_size(&c, zend_array_count(aHat));
249+
250+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
251+
if (ZEPHIR_GE(valueA, b)) {
252+
ZVAL_LONG(&comparison, 1);
253+
} else {
254+
ZVAL_LONG(&comparison, 0);
255+
}
256+
257+
add_next_index_zval(&c, &comparison);
258+
} ZEND_HASH_FOREACH_END();
259+
260+
RETVAL_ARR(Z_ARR(c));
261+
}
262+
263+
void tensor_less_scalar(zval * return_value, zval * a, zval * b)
264+
{
265+
zval * valueA;
266+
zval comparison;
267+
zval c;
268+
269+
zend_array * aHat = Z_ARR_P(a);
270+
271+
array_init_size(&c, zend_array_count(aHat));
272+
273+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
274+
if (ZEPHIR_LT(valueA, b)) {
275+
ZVAL_LONG(&comparison, 1);
276+
} else {
277+
ZVAL_LONG(&comparison, 0);
278+
}
279+
280+
add_next_index_zval(&c, &comparison);
281+
} ZEND_HASH_FOREACH_END();
282+
283+
RETVAL_ARR(Z_ARR(c));
284+
}
285+
286+
void tensor_less_equal_scalar(zval * return_value, zval * a, zval * b)
287+
{
288+
zval * valueA;
289+
zval comparison;
290+
zval c;
291+
292+
zend_array * aHat = Z_ARR_P(a);
293+
294+
array_init_size(&c, zend_array_count(aHat));
295+
296+
ZEND_HASH_FOREACH_VAL(aHat, valueA) {
297+
if (ZEPHIR_LE(valueA, b)) {
298+
ZVAL_LONG(&comparison, 1);
299+
} else {
300+
ZVAL_LONG(&comparison, 0);
301+
}
302+
303+
add_next_index_zval(&c, &comparison);
304+
} ZEND_HASH_FOREACH_END();
305+
306+
RETVAL_ARR(Z_ARR(c));
307+
}

ext/include/tensor_comparison.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44
#include <Zend/zend.h>
55

66
void tensor_equal(zval * return_value, zval * a, zval * b);
7-
87
void tensor_not_equal(zval * return_value, zval * a, zval * b);
9-
108
void tensor_greater(zval * return_value, zval * a, zval * b);
11-
129
void tensor_greater_equal(zval * return_value, zval * a, zval * b);
13-
1410
void tensor_less(zval * return_value, zval * a, zval * b);
15-
1611
void tensor_less_equal(zval * return_value, zval * a, zval * b);
1712

13+
void tensor_equal_scalar(zval * return_value, zval * a, zval * b);
14+
void tensor_not_equal_scalar(zval * return_value, zval * a, zval * b);
15+
void tensor_greater_scalar(zval * return_value, zval * a, zval * b);
16+
void tensor_greater_equal_scalar(zval * return_value, zval * a, zval * b);
17+
void tensor_less_scalar(zval * return_value, zval * a, zval * b);
18+
void tensor_less_equal_scalar(zval * return_value, zval * a, zval * b);
19+
1820
#endif

0 commit comments

Comments
 (0)