on master help sign in
Remainder primitives for C codegen
commit4ea88e194bbf238cd7969a9d4a2e6ac1c3315fe5 authorBenjamin Saunders <besaunde@sfu.ca> dateSun 13 Jan 2013, 16:14 (14 years ago) parentd20d0b9
3 files changed+84−3
rts/idris_bitstring.c+62−3 rts/idris_bitstring.h+8 src/IRTS/CodegenC.hs+14
rts/idris_bitstring.c+62−3
@@ -95,6 +95,20 @@ VAL idris_b8SDiv(VM *vm, VAL a, VAL b) {
9595 return cl;
9696}
9797
98+VAL idris_b8URem(VM *vm, VAL a, VAL b) {
99+ VAL cl = allocate(vm, sizeof(Closure), 0);
100+ SETTY(cl, BITS8);
101+ cl->info.bits8 = a->info.bits8 % b->info.bits8;
102+ return cl;
103+}
104+
105+VAL idris_b8SRem(VM *vm, VAL a, VAL b) {
106+ VAL cl = allocate(vm, sizeof(Closure), 0);
107+ SETTY(cl, BITS8);
108+ cl->info.bits8 = (uint8_t) (((int8_t) a->info.bits8) % ((int8_t) b->info.bits8));
109+ return cl;
110+}
111+
98112VAL idris_b8Lt(VM *vm, VAL a, VAL b) {
99113 VAL cl = allocate(vm, sizeof(Closure), 0);
100114 SETTY(cl, BITS8);
@@ -211,7 +225,22 @@ VAL idris_b16SDiv(VM *vm, VAL a, VAL b) {
211225 VAL cl = allocate(vm, sizeof(Closure), 0);
212226 SETTY(cl, BITS16);
213227 cl->info.bits16 =
214− (uint16_t) (((int16_t) a->info.bits16) / ((int16_t) b->info.bits16));
228+ (uint16_t) (((int16_t) a->info.bits16) / ((int16_t) b->info.bits16));
229+ return cl;
230+}
231+
232+VAL idris_b16URem(VM *vm, VAL a, VAL b) {
233+ VAL cl = allocate(vm, sizeof(Closure), 0);
234+ SETTY(cl, BITS16);
235+ cl->info.bits16 = a->info.bits16 % b->info.bits16;
236+ return cl;
237+}
238+
239+VAL idris_b16SRem(VM *vm, VAL a, VAL b) {
240+ VAL cl = allocate(vm, sizeof(Closure), 0);
241+ SETTY(cl, BITS16);
242+ cl->info.bits16 =
243+ (uint16_t) (((int16_t) a->info.bits16) % ((int16_t) b->info.bits16));
215244 return cl;
216245}
217246
@@ -331,7 +360,22 @@ VAL idris_b32SDiv(VM *vm, VAL a, VAL b) {
331360 VAL cl = allocate(vm, sizeof(Closure), 0);
332361 SETTY(cl, BITS32);
333362 cl->info.bits32 =
334− (uint32_t) (((int32_t) a->info.bits32) / ((int32_t) b->info.bits32));
363+ (uint32_t) (((int32_t) a->info.bits32) / ((int32_t) b->info.bits32));
364+ return cl;
365+}
366+
367+VAL idris_b32URem(VM *vm, VAL a, VAL b) {
368+ VAL cl = allocate(vm, sizeof(Closure), 0);
369+ SETTY(cl, BITS32);
370+ cl->info.bits32 = a->info.bits32 % b->info.bits32;
371+ return cl;
372+}
373+
374+VAL idris_b32SRem(VM *vm, VAL a, VAL b) {
375+ VAL cl = allocate(vm, sizeof(Closure), 0);
376+ SETTY(cl, BITS32);
377+ cl->info.bits32 =
378+ (uint32_t) (((int32_t) a->info.bits32) % ((int32_t) b->info.bits32));
335379 return cl;
336380}
337381
@@ -451,7 +495,22 @@ VAL idris_b64SDiv(VM *vm, VAL a, VAL b) {
451495 VAL cl = allocate(vm, sizeof(Closure), 0);
452496 SETTY(cl, BITS64);
453497 cl->info.bits64 =
454− (uint64_t) (((int64_t) a->info.bits64) / ((int64_t) b->info.bits64));
498+ (uint64_t) (((int64_t) a->info.bits64) / ((int64_t) b->info.bits64));
499+ return cl;
500+}
501+
502+VAL idris_b64URem(VM *vm, VAL a, VAL b) {
503+ VAL cl = allocate(vm, sizeof(Closure), 0);
504+ SETTY(cl, BITS64);
505+ cl->info.bits64 = a->info.bits64 % b->info.bits64;
506+ return cl;
507+}
508+
509+VAL idris_b64SRem(VM *vm, VAL a, VAL b) {
510+ VAL cl = allocate(vm, sizeof(Closure), 0);
511+ SETTY(cl, BITS64);
512+ cl->info.bits64 =
513+ (uint64_t) (((int64_t) a->info.bits64) % ((int64_t) b->info.bits64));
455514 return cl;
456515}
457516
rts/idris_bitstring.h+8
@@ -17,6 +17,8 @@ VAL idris_b8Minus(VM *vm, VAL a, VAL b);
1717VAL idris_b8Times(VM *vm, VAL a, VAL b);
1818VAL idris_b8UDiv(VM *vm, VAL a, VAL b);
1919VAL idris_b8SDiv(VM *vm, VAL a, VAL b);
20+VAL idris_b8URem(VM *vm, VAL a, VAL b);
21+VAL idris_b8SRem(VM *vm, VAL a, VAL b);
2022VAL idris_b8Lt(VM *vm, VAL a, VAL b);
2123VAL idris_b8Gt(VM *vm, VAL a, VAL b);
2224VAL idris_b8Eq(VM *vm, VAL a, VAL b);
@@ -46,6 +48,8 @@ VAL idris_b16Minus(VM *vm, VAL a, VAL b);
4648VAL idris_b16Times(VM *vm, VAL a, VAL b);
4749VAL idris_b16UDiv(VM *vm, VAL a, VAL b);
4850VAL idris_b16SDiv(VM *vm, VAL a, VAL b);
51+VAL idris_b16URem(VM *vm, VAL a, VAL b);
52+VAL idris_b16SRem(VM *vm, VAL a, VAL b);
4953VAL idris_b16Lt(VM *vm, VAL a, VAL b);
5054VAL idris_b16Gt(VM *vm, VAL a, VAL b);
5155VAL idris_b16Eq(VM *vm, VAL a, VAL b);
@@ -70,6 +74,8 @@ VAL idris_b32Minus(VM *vm, VAL a, VAL b);
7074VAL idris_b32Times(VM *vm, VAL a, VAL b);
7175VAL idris_b32UDiv(VM *vm, VAL a, VAL b);
7276VAL idris_b32SDiv(VM *vm, VAL a, VAL b);
77+VAL idris_b32URem(VM *vm, VAL a, VAL b);
78+VAL idris_b32SRem(VM *vm, VAL a, VAL b);
7379VAL idris_b32Lt(VM *vm, VAL a, VAL b);
7480VAL idris_b32Gt(VM *vm, VAL a, VAL b);
7581VAL idris_b32Eq(VM *vm, VAL a, VAL b);
@@ -93,6 +99,8 @@ VAL idris_b64Minus(VM *vm, VAL a, VAL b);
9399VAL idris_b64Times(VM *vm, VAL a, VAL b);
94100VAL idris_b64UDiv(VM *vm, VAL a, VAL b);
95101VAL idris_b64SDiv(VM *vm, VAL a, VAL b);
102+VAL idris_b64URem(VM *vm, VAL a, VAL b);
103+VAL idris_b64SRem(VM *vm, VAL a, VAL b);
96104VAL idris_b64Lt(VM *vm, VAL a, VAL b);
97105VAL idris_b64Gt(VM *vm, VAL a, VAL b);
98106VAL idris_b64Eq(VM *vm, VAL a, VAL b);
src/IRTS/CodegenC.hs+14
@@ -323,6 +323,8 @@ doOp v LB8Minus [x, y] = v ++ "idris_b8Minus(vm, " ++ creg x ++ "," ++ creg y ++
323323doOp v LB8Times [x, y] = v ++ "idris_b8Times(vm, " ++ creg x ++ "," ++ creg y ++ ")"
324324doOp v LB8UDiv [x, y] = v ++ "idris_b8UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
325325doOp v LB8SDiv [x, y] = v ++ "idris_b8SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
326+doOp v LB8URem [x, y] = v ++ "idris_b8URem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
327+doOp v LB8SRem [x, y] = v ++ "idris_b8SRem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
326328
327329doOp v LB8Z16 [x] = v ++ "idris_b8Z16(vm, " ++ creg x ++ ")"
328330doOp v LB8Z32 [x] = v ++ "idris_b8Z32(vm, " ++ creg x ++ ")"
@@ -355,6 +357,10 @@ doOp v LB16UDiv [x, y] =
355357 v ++ "idris_b16UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
356358doOp v LB16SDiv [x, y] =
357359 v ++ "idris_b16SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
360+doOp v LB16URem [x, y] =
361+ v ++ "idris_b16URem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
362+doOp v LB16SRem [x, y] =
363+ v ++ "idris_b16SRem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
358364
359365doOp v LB16Z32 [x] = v ++ "idris_b16Z32(vm, " ++ creg x ++ ")"
360366doOp v LB16Z64 [x] = v ++ "idris_b16Z64(vm, " ++ creg x ++ ")"
@@ -386,6 +392,10 @@ doOp v LB32UDiv [x, y] =
386392 v ++ "idris_b32UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
387393doOp v LB32SDiv [x, y] =
388394 v ++ "idris_b32SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
395+doOp v LB32URem [x, y] =
396+ v ++ "idris_b32URem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
397+doOp v LB32SRem [x, y] =
398+ v ++ "idris_b32SRem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
389399
390400doOp v LB32Z64 [x] = v ++ "idris_b32Z64(vm, " ++ creg x ++ ")"
391401doOp v LB32S64 [x] = v ++ "idris_b32S64(vm, " ++ creg x ++ ")"
@@ -416,6 +426,10 @@ doOp v LB64UDiv [x, y] =
416426 v ++ "idris_b64UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
417427doOp v LB64SDiv [x, y] =
418428 v ++ "idris_b64SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
429+doOp v LB64URem [x, y] =
430+ v ++ "idris_b64URem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
431+doOp v LB64SRem [x, y] =
432+ v ++ "idris_b64SRem(vm, " ++ creg x ++ "," ++ creg y ++ ")"
419433
420434doOp v LB64T8 [x] = v ++ "idris_b64T8(vm, " ++ creg x ++ ")"
421435doOp v LB64T16 [x] = v ++ "idris_b64T16(vm, " ++ creg x ++ ")"