on master help sign in
Merge pull request #333 from bitlisp/bigint-float-conversion

Integer <-> Float conversion in C codegen

commitf593dcc69d03133ffb9c50743b02a5a46239e884 authorEdwin Brady <edwin.brady@gmail.com> dateSun 16 Jun 2013, 03:39 (13 years ago) parent5fa7c0e7d6f7f7
3 files changed+28
rts/idris_gmp.c+24 rts/idris_gmp.h+2 src/IRTS/CodegenC.hs+2
rts/idris_gmp.c+24
@@ -308,6 +308,30 @@ VAL idris_castBigInt(VM* vm, VAL i) {
308308 }
309309}
310310
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+
311335VAL idris_castStrBig(VM* vm, VAL i) {
312336 return MKBIGC(vm, GETSTR(i));
313337}
rts/idris_gmp.h+2
@@ -24,6 +24,8 @@ VAL idris_bigGe(VM*, VAL x, VAL y);
2424
2525VAL idris_castIntBig(VM* vm, VAL i);
2626VAL idris_castBigInt(VM* vm, VAL i);
27+VAL idris_castFloatBig(VM* vm, VAL i);
28+VAL idris_castBigFloat(VM* vm, VAL i);
2729VAL idris_castStrBig(VM* vm, VAL i);
2830VAL idris_castBigStr(VM* vm, VAL i);
2931
src/IRTS/CodegenC.hs+2
@@ -285,6 +285,8 @@ doOp v LFLe [l, r] = v ++ "FLOATBOP(<=," ++ creg l ++ ", " ++ creg r ++ ")"
285285doOp v LFGt [l, r] = v ++ "FLOATBOP(>," ++ creg l ++ ", " ++ creg r ++ ")"
286286doOp v LFGe [l, r] = v ++ "FLOATBOP(>=," ++ creg l ++ ", " ++ creg r ++ ")"
287287
288+doOp v (LIntFloat ITBig) [x] = v ++ "idris_castBigFloat(vm, " ++ creg x ++ ")"
289+doOp v (LFloatInt ITBig) [x] = v ++ "idris_castFloatBig(vm, " ++ creg x ++ ")"
288290doOp v (LPlus ITBig) [l, r] = v ++ "idris_bigPlus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
289291doOp v (LMinus ITBig) [l, r] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
290292doOp v (LTimes ITBig) [l, r] = v ++ "idris_bigTimes(vm, " ++ creg l ++ ", " ++ creg r ++ ")"