on master help sign in
Merge pull request #333 from bitlisp/bigint-float-conversion
f593dccEdwin Brady
rts/idris_gmp.c+24
@@ -308,6 +308,30 @@ VAL idris_castBigInt(VM* vm, VAL i) {
308 }
308 }
309}
309}
310
310
311+VAL idris_castBigFloat(VM* vm, VAL i) {
312+ if (ISINT(i)) {
313+ return MKFLOAT(vm, GETINT(i));
314+ } else {
315+ return MKFLOAT(vm, mpz_get_d(GETMPZ(i)));
316+ }
317+}
318+
319+VAL idris_castFloatBig(VM* vm, VAL f) {
320+ double val = GETFLOAT(f);
321+
322+ mpz_t* bigint;
323+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
324+ sizeof(mpz_t), 0);
325+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
326+
327+ mpz_init_set_d(*bigint, val);
328+
329+ SETTY(cl, BIGINT);
330+ cl -> info.ptr = (void*)bigint;
331+
332+ return cl;
333+}
334+
311VAL idris_castStrBig(VM* vm, VAL i) {
335VAL idris_castStrBig(VM* vm, VAL i) {
312 return MKBIGC(vm, GETSTR(i));
336 return MKBIGC(vm, GETSTR(i));
313}
337}
rts/idris_gmp.h+2
@@ -24,6 +24,8 @@ VAL idris_bigGe(VM*, VAL x, VAL y);
24
24
25VAL idris_castIntBig(VM* vm, VAL i);
25VAL idris_castIntBig(VM* vm, VAL i);
26VAL idris_castBigInt(VM* vm, VAL i);
26VAL idris_castBigInt(VM* vm, VAL i);
27+VAL idris_castFloatBig(VM* vm, VAL i);
28+VAL idris_castBigFloat(VM* vm, VAL i);
27VAL idris_castStrBig(VM* vm, VAL i);
29VAL idris_castStrBig(VM* vm, VAL i);
28VAL idris_castBigStr(VM* vm, VAL i);
30VAL idris_castBigStr(VM* vm, VAL i);
29
31
src/IRTS/CodegenC.hs+2
@@ -285,6 +285,8 @@ doOp v LFLe [l, r] = v ++ "FLOATBOP(<=," ++ creg l ++ ", " ++ creg r ++ ")"
285doOp v LFGt [l, r] = v ++ "FLOATBOP(>," ++ creg l ++ ", " ++ creg r ++ ")"
285doOp v LFGt [l, r] = v ++ "FLOATBOP(>," ++ creg l ++ ", " ++ creg r ++ ")"
286doOp v LFGe [l, r] = v ++ "FLOATBOP(>=," ++ creg l ++ ", " ++ creg r ++ ")"
286doOp v LFGe [l, r] = v ++ "FLOATBOP(>=," ++ creg l ++ ", " ++ creg r ++ ")"
287
287
288+doOp v (LIntFloat ITBig) [x] = v ++ "idris_castBigFloat(vm, " ++ creg x ++ ")"
289+doOp v (LFloatInt ITBig) [x] = v ++ "idris_castFloatBig(vm, " ++ creg x ++ ")"
288doOp v (LPlus ITBig) [l, r] = v ++ "idris_bigPlus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
290doOp v (LPlus ITBig) [l, r] = v ++ "idris_bigPlus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
289doOp v (LMinus ITBig) [l, r] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
291doOp v (LMinus ITBig) [l, r] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
290doOp v (LTimes ITBig) [l, r] = v ++ "idris_bigTimes(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
292doOp v (LTimes ITBig) [l, r] = v ++ "idris_bigTimes(vm, " ++ creg l ++ ", " ++ creg r ++ ")"