- MAYBE_GC(R2_PTR | R4_PTR, cmpIntegerIntzh_fast);
- arg1._mp_size = R1.i;
- arg1._mp_alloc= ((StgArrWords *)R2.p)->words;
- arg1._mp_d = (mp_limb_t *) (BYTE_ARR_CTS(R2.p));
- arg2._mp_size = R3.i;
- arg2._mp_alloc= ((StgArrWords *)R4.p)->words;
- arg2._mp_d = (mp_limb_t *) (BYTE_ARR_CTS(R4.p));
- r = RET_STGCALL2(I_,mpz_cmp,&arg1,&arg2);
- RET_N(r);
+
+ // paraphrased from mpz_cmp() in the GMP sources
+ usize = R1.i;
+ vsize = R3.i;
+
+ if (usize != vsize) {
+ R1.i = usize - vsize; JMP_(ENTRY_CODE(Sp[0]));
+ }
+
+ if (usize == 0) {
+ R1.i = 0; JMP_(ENTRY_CODE(Sp[0]));
+ }
+
+ size = abs(usize);
+
+ up = BYTE_ARR_CTS(R2.p);
+ vp = BYTE_ARR_CTS(R4.p);
+
+ cmp = RET_STGCALL3(I_, mpn_cmp, (mp_limb_t *)up, (mp_limb_t *)vp, size);
+
+ if (cmp == 0) {
+ R1.i = 0; JMP_(ENTRY_CODE(Sp[0]));
+ }
+
+ if ((cmp < 0) == (usize < 0)) {
+ R1.i = 1;
+ } else {
+ R1.i = (-1);
+ }
+ /* Result parked in R1, return via info-pointer at TOS */
+ JMP_(ENTRY_CODE(Sp[0]));