on master help sign in
Add gc copy for bit vectors
commitb6b8fd27a3ee6c30bb8a231f5ce442a2210b082a authorMattias Lundell <mattias@lundell.com> dateThu 1 Jan 2015, 23:13 (12 years ago) parentee32989
3 files changed+59
rts/idris_bitstring.c+42 rts/idris_bitstring.h+5 rts/idris_gc.c+12
rts/idris_bitstring.c+42
@@ -1,3 +1,5 @@
1+#include <assert.h>
2+
13#include "idris_rts.h"
24
35VAL idris_b8CopyForGC(VM *vm, VAL a) {
@@ -848,3 +850,43 @@ VAL idris_IDXB64x2(VM* vm, VAL vec, VAL idx) {
848850 _mm_storeu_si128((__m128i*)&data, sse);
849851 return MKB64(vm, data[idx->info.bits32]);
850852}
853+
854+VAL idris_b8x16CopyForGC(VM *vm, VAL vec) {
855+ __m128i sse = *vec->info.bits128p;
856+ VAL cl = allocate(sizeof(Closure) + 16 + sizeof(__m128i), 1);
857+ SETTY(cl, BITS8X16);
858+ cl->info.bits128p = (__m128i*)ALIGN((uintptr_t)cl + sizeof(Closure), 16);
859+ assert ((uintptr_t)cl->info.bits128p % 16 == 0);
860+ *cl->info.bits128p = sse;
861+ return cl;
862+}
863+
864+VAL idris_b16x8CopyForGC(VM *vm, VAL vec) {
865+ __m128i sse = *vec->info.bits128p;
866+ VAL cl = allocate(sizeof(Closure) + 16 + sizeof(__m128i), 1);
867+ SETTY(cl, BITS16X8);
868+ cl->info.bits128p = (__m128i*)ALIGN((uintptr_t)cl + sizeof(Closure), 16);
869+ assert ((uintptr_t)cl->info.bits128p % 16 == 0);
870+ *cl->info.bits128p = sse;
871+ return cl;
872+}
873+
874+VAL idris_b32x4CopyForGC(VM *vm, VAL vec) {
875+ __m128i sse = *vec->info.bits128p;
876+ VAL cl = allocate(sizeof(Closure) + 16 + sizeof(__m128i), 1);
877+ SETTY(cl, BITS32X4);
878+ cl->info.bits128p = (__m128i*)ALIGN((uintptr_t)cl + sizeof(Closure), 16);
879+ assert ((uintptr_t)cl->info.bits128p % 16 == 0);
880+ *cl->info.bits128p = sse;
881+ return cl;
882+}
883+
884+VAL idris_b64x2CopyForGC(VM *vm, VAL vec) {
885+ __m128i sse = *vec->info.bits128p;
886+ VAL cl = allocate(sizeof(Closure) + 16 + sizeof(__m128i), 1);
887+ SETTY(cl, BITS64X2);
888+ cl->info.bits128p = (__m128i*)ALIGN((uintptr_t)cl + sizeof(Closure), 16);
889+ assert ((uintptr_t)cl->info.bits128p % 16 == 0);
890+ *cl->info.bits128p = sse;
891+ return cl;
892+}
rts/idris_bitstring.h+5
@@ -131,4 +131,9 @@ VAL idris_IDXB16x8(VM* vm, VAL vec, VAL idx);
131131VAL idris_IDXB32x4(VM* vm, VAL vec, VAL idx);
132132VAL idris_IDXB64x2(VM* vm, VAL vec, VAL idx);
133133
134+VAL idris_b8x16CopyForGC(VM *vm, VAL a);
135+VAL idris_b16x8CopyForGC(VM *vm, VAL a);
136+VAL idris_b32x4CopyForGC(VM *vm, VAL a);
137+VAL idris_b64x2CopyForGC(VM *vm, VAL a);
138+
134139#endif
rts/idris_gc.c+12
@@ -55,6 +55,18 @@ VAL copy(VM* vm, VAL x) {
5555 case BITS64:
5656 cl = idris_b64CopyForGC(vm, x);
5757 break;
58+ case BITS8X16:
59+ cl = idris_b8x16CopyForGC(vm, x);
60+ break;
61+ case BITS16X8:
62+ cl = idris_b16x8CopyForGC(vm, x);
63+ break;
64+ case BITS32X4:
65+ cl = idris_b32x4CopyForGC(vm, x);
66+ break;
67+ case BITS64X2:
68+ cl = idris_b64x2CopyForGC(vm, x);
69+ break;
5870 case FWD:
5971 return x->info.ptr;
6072 default: