@@ -196,6 +196,88 @@ VAL bigMod(VM* vm, VAL x, VAL y) {
196 return cl;
196 return cl;
199+VAL bigAnd(VM* vm, VAL x, VAL y) {
200+ idris_requireAlloc(IDRIS_MAXGMP);
203+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
205+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
206+ mpz_and(*bigint, GETMPZ(GETBIG(vm,x)), GETMPZ(GETBIG(vm,y)));
208+ cl -> info.ptr = (void*)bigint;
212+VAL bigOr(VM* vm, VAL x, VAL y) {
213+ idris_requireAlloc(IDRIS_MAXGMP);
216+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
218+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
219+ mpz_ior(*bigint, GETMPZ(GETBIG(vm,x)), GETMPZ(GETBIG(vm,y)));
221+ cl -> info.ptr = (void*)bigint;
225+VAL bigShiftLeft(VM* vm, VAL x, VAL y) {
226+ idris_requireAlloc(IDRIS_MAXGMP);
229+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
231+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
232+ mpz_mul_2exp(*bigint, GETMPZ(GETBIG(vm,x)), GETINT(y));
234+ cl -> info.ptr = (void*)bigint;
239+VAL bigLShiftRight(VM* vm, VAL x, VAL y) {
240+ idris_requireAlloc(IDRIS_MAXGMP);
243+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
245+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
246+ mpz_fdiv_q_2exp(*bigint, GETMPZ(GETBIG(vm,x)), GETINT(y));
248+ cl -> info.ptr = (void*)bigint;
252+VAL bigAShiftRight(VM* vm, VAL x, VAL y) {
253+ idris_requireAlloc(IDRIS_MAXGMP);
256+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
258+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
259+ mpz_fdiv_q_2exp(*bigint, GETMPZ(GETBIG(vm,x)), GETINT(y));
261+ cl -> info.ptr = (void*)bigint;
265+VAL idris_bigAnd(VM* vm, VAL x, VAL y) {
266+ if (ISINT(x) && ISINT(y)) {
267+ return INTOP(&, x, y);
269+ return bigAnd(vm, GETBIG(vm, x), GETBIG(vm, y));
273+VAL idris_bigOr(VM* vm, VAL x, VAL y) {
274+ if (ISINT(x) && ISINT(y)) {
275+ return INTOP(|, x, y);
277+ return bigOr(vm, GETBIG(vm, x), GETBIG(vm, y));
199VAL idris_bigPlus(VM* vm, VAL x, VAL y) {
281VAL idris_bigPlus(VM* vm, VAL x, VAL y) {
200 if (ISINT(x) && ISINT(y)) {
282 if (ISINT(x) && ISINT(y)) {
201 i_int vx = GETINT(x);
283 i_int vx = GETINT(x);
@@ -253,6 +335,30 @@ VAL idris_bigTimes(VM* vm, VAL x, VAL y) {
338+VAL idris_bigShiftLeft(VM* vm, VAL x, VAL y) {
339+ if (ISINT(x) && ISINT(y)) {
340+ return INTOP(<<, x, y);
342+ return bigShiftLeft(vm, GETBIG(vm, x), GETBIG(vm, y));
346+VAL idris_bigAShiftRight(VM* vm, VAL x, VAL y) {
347+ if (ISINT(x) && ISINT(y)) {
348+ return INTOP(>>, x, y);
350+ return bigAShiftRight(vm, GETBIG(vm, x), GETBIG(vm, y));
354+VAL idris_bigLShiftRight(VM* vm, VAL x, VAL y) {
355+ if (ISINT(x) && ISINT(y)) {
356+ return INTOP(>>, x, y);
358+ return bigLShiftRight(vm, GETBIG(vm, x), GETBIG(vm, y));
256VAL idris_bigDivide(VM* vm, VAL x, VAL y) {
362VAL idris_bigDivide(VM* vm, VAL x, VAL y) {
257 if (ISINT(x) && ISINT(y)) {
363 if (ISINT(x) && ISINT(y)) {
258 return INTOP(/, x, y);
364 return INTOP(/, x, y);