Page 237 - ARM 64 Bit Assembly Language
P. 237
Integer mathematics 225
538 tmp = bigint_trim(l);
539 bigint_free(l);
540 return tmp;
541 }
542
543 /******************************************************************/
544 /* Test and compare operatioins */
545 /******************************************************************/
546
547 /* Compare bigint to zero */
548 inline int bigint_is_zero(bigint b) {
549 for (int i = 0; i < b->size; i++)
550 if (b->blks[i])
551 return 0;
552 return 1;
553 }
554
555 inline int bigint_le(bigint l, bigint r) {
556 return (bigint_cmp(l, r) < 1);
557 }
558
559 inline int bigint_lt(bigint l, bigint r) {
560 return (bigint_cmp(l, r) == -1);
561 }
562
563 inline int bigint_ge(bigint l, bigint r) {
564 return (bigint_cmp(l, r) > -1);
565 }
566
567 inline int bigint_gt(bigint l, bigint r) {
568 return (bigint_cmp(l, r) == 1);
569 }
570
571 inline int bigint_eq(bigint l, bigint r) {
572 return (!bigint_cmp(l, r));
573 }
574
575 inline int bigint_ne(bigint l, bigint r) {
576 return abs(bigint_cmp(l, r));
577 }
578
579 /* bigint_cmp is the core of all of the comparisons */
580 int bigint_cmp(bigint l, bigint r) {
581 bigint d = bigint_sub(l,r);
582 int cmp;
583 if ((d->size == 0) || (d->size == 1 && d->blks[0] == 0)) {
584 cmp = 0; // d == 0
585 } else if (d->blks[d->size-1] & ((bigchunk)1 << (BITSPERCHUNK-1))) {
586 cmp = -1; // d < 0 (MSB == 1)