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)
   232   233   234   235   236   237   238   239   240   241   242