@@ -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+}