on master help sign in
Remainder primitives for C codegen
4ea88e1Benjamin Saunders
rts/idris_bitstring.c+62−3
@@ -95,6 +95,20 @@ VAL idris_b8SDiv(VM *vm, VAL a, VAL b) {
95 return cl;
95 return cl;
96}
96}
97
97
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+
98VAL idris_b8Lt(VM *vm, VAL a, VAL b) {
112VAL idris_b8Lt(VM *vm, VAL a, VAL b) {
99 VAL cl = allocate(vm, sizeof(Closure), 0);
113 VAL cl = allocate(vm, sizeof(Closure), 0);
100 SETTY(cl, BITS8);
114 SETTY(cl, BITS8);
@@ -211,7 +225,22 @@ VAL idris_b16SDiv(VM *vm, VAL a, VAL b) {
211 VAL cl = allocate(vm, sizeof(Closure), 0);
225 VAL cl = allocate(vm, sizeof(Closure), 0);
212 SETTY(cl, BITS16);
226 SETTY(cl, BITS16);
213 cl->info.bits16 =
227 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));
215 return cl;
244 return cl;
216}
245}
217
246
@@ -331,7 +360,22 @@ VAL idris_b32SDiv(VM *vm, VAL a, VAL b) {
331 VAL cl = allocate(vm, sizeof(Closure), 0);
360 VAL cl = allocate(vm, sizeof(Closure), 0);
332 SETTY(cl, BITS32);
361 SETTY(cl, BITS32);
333 cl->info.bits32 =
362 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));
335 return cl;
379 return cl;
336}
380}
337
381
@@ -451,7 +495,22 @@ VAL idris_b64SDiv(VM *vm, VAL a, VAL b) {
451 VAL cl = allocate(vm, sizeof(Closure), 0);
495 VAL cl = allocate(vm, sizeof(Closure), 0);
452 SETTY(cl, BITS64);
496 SETTY(cl, BITS64);
453 cl->info.bits64 =
497 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));
455 return cl;
514 return cl;
456}
515}
457
516
rts/idris_bitstring.h+8
@@ -17,6 +17,8 @@ VAL idris_b8Minus(VM *vm, VAL a, VAL b);
17VAL idris_b8Times(VM *vm, VAL a, VAL b);
17VAL idris_b8Times(VM *vm, VAL a, VAL b);
18VAL idris_b8UDiv(VM *vm, VAL a, VAL b);
18VAL idris_b8UDiv(VM *vm, VAL a, VAL b);
19VAL idris_b8SDiv(VM *vm, VAL a, VAL b);
19VAL 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);
20VAL idris_b8Lt(VM *vm, VAL a, VAL b);
22VAL idris_b8Lt(VM *vm, VAL a, VAL b);
21VAL idris_b8Gt(VM *vm, VAL a, VAL b);
23VAL idris_b8Gt(VM *vm, VAL a, VAL b);
22VAL idris_b8Eq(VM *vm, VAL a, VAL b);
24VAL idris_b8Eq(VM *vm, VAL a, VAL b);
@@ -46,6 +48,8 @@ VAL idris_b16Minus(VM *vm, VAL a, VAL b);
46VAL idris_b16Times(VM *vm, VAL a, VAL b);
48VAL idris_b16Times(VM *vm, VAL a, VAL b);
47VAL idris_b16UDiv(VM *vm, VAL a, VAL b);
49VAL idris_b16UDiv(VM *vm, VAL a, VAL b);
48VAL idris_b16SDiv(VM *vm, VAL a, VAL b);
50VAL 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);
49VAL idris_b16Lt(VM *vm, VAL a, VAL b);
53VAL idris_b16Lt(VM *vm, VAL a, VAL b);
50VAL idris_b16Gt(VM *vm, VAL a, VAL b);
54VAL idris_b16Gt(VM *vm, VAL a, VAL b);
51VAL idris_b16Eq(VM *vm, VAL a, VAL b);
55VAL idris_b16Eq(VM *vm, VAL a, VAL b);
@@ -70,6 +74,8 @@ VAL idris_b32Minus(VM *vm, VAL a, VAL b);
70VAL idris_b32Times(VM *vm, VAL a, VAL b);
74VAL idris_b32Times(VM *vm, VAL a, VAL b);
71VAL idris_b32UDiv(VM *vm, VAL a, VAL b);
75VAL idris_b32UDiv(VM *vm, VAL a, VAL b);
72VAL idris_b32SDiv(VM *vm, VAL a, VAL b);
76VAL 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);
73VAL idris_b32Lt(VM *vm, VAL a, VAL b);
79VAL idris_b32Lt(VM *vm, VAL a, VAL b);
74VAL idris_b32Gt(VM *vm, VAL a, VAL b);
80VAL idris_b32Gt(VM *vm, VAL a, VAL b);
75VAL idris_b32Eq(VM *vm, VAL a, VAL b);
81VAL idris_b32Eq(VM *vm, VAL a, VAL b);
@@ -93,6 +99,8 @@ VAL idris_b64Minus(VM *vm, VAL a, VAL b);
93VAL idris_b64Times(VM *vm, VAL a, VAL b);
99VAL idris_b64Times(VM *vm, VAL a, VAL b);
94VAL idris_b64UDiv(VM *vm, VAL a, VAL b);
100VAL idris_b64UDiv(VM *vm, VAL a, VAL b);
95VAL idris_b64SDiv(VM *vm, VAL a, VAL b);
101VAL 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);
96VAL idris_b64Lt(VM *vm, VAL a, VAL b);
104VAL idris_b64Lt(VM *vm, VAL a, VAL b);
97VAL idris_b64Gt(VM *vm, VAL a, VAL b);
105VAL idris_b64Gt(VM *vm, VAL a, VAL b);
98VAL idris_b64Eq(VM *vm, VAL a, VAL b);
106VAL 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 ++
323doOp v LB8Times [x, y] = v ++ "idris_b8Times(vm, " ++ creg x ++ "," ++ creg y ++ ")"
323doOp v LB8Times [x, y] = v ++ "idris_b8Times(vm, " ++ creg x ++ "," ++ creg y ++ ")"
324doOp v LB8UDiv [x, y] = v ++ "idris_b8UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
324doOp v LB8UDiv [x, y] = v ++ "idris_b8UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
325doOp v LB8SDiv [x, y] = v ++ "idris_b8SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
325doOp 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 ++ ")"
326
328
327doOp v LB8Z16 [x] = v ++ "idris_b8Z16(vm, " ++ creg x ++ ")"
329doOp v LB8Z16 [x] = v ++ "idris_b8Z16(vm, " ++ creg x ++ ")"
328doOp v LB8Z32 [x] = v ++ "idris_b8Z32(vm, " ++ creg x ++ ")"
330doOp v LB8Z32 [x] = v ++ "idris_b8Z32(vm, " ++ creg x ++ ")"
@@ -355,6 +357,10 @@ doOp v LB16UDiv [x, y] =
355 v ++ "idris_b16UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
357 v ++ "idris_b16UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
356doOp v LB16SDiv [x, y] =
358doOp v LB16SDiv [x, y] =
357 v ++ "idris_b16SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
359 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 ++ ")"
358
364
359doOp v LB16Z32 [x] = v ++ "idris_b16Z32(vm, " ++ creg x ++ ")"
365doOp v LB16Z32 [x] = v ++ "idris_b16Z32(vm, " ++ creg x ++ ")"
360doOp v LB16Z64 [x] = v ++ "idris_b16Z64(vm, " ++ creg x ++ ")"
366doOp v LB16Z64 [x] = v ++ "idris_b16Z64(vm, " ++ creg x ++ ")"
@@ -386,6 +392,10 @@ doOp v LB32UDiv [x, y] =
386 v ++ "idris_b32UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
392 v ++ "idris_b32UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
387doOp v LB32SDiv [x, y] =
393doOp v LB32SDiv [x, y] =
388 v ++ "idris_b32SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
394 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 ++ ")"
389
399
390doOp v LB32Z64 [x] = v ++ "idris_b32Z64(vm, " ++ creg x ++ ")"
400doOp v LB32Z64 [x] = v ++ "idris_b32Z64(vm, " ++ creg x ++ ")"
391doOp v LB32S64 [x] = v ++ "idris_b32S64(vm, " ++ creg x ++ ")"
401doOp v LB32S64 [x] = v ++ "idris_b32S64(vm, " ++ creg x ++ ")"
@@ -416,6 +426,10 @@ doOp v LB64UDiv [x, y] =
416 v ++ "idris_b64UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
426 v ++ "idris_b64UDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
417doOp v LB64SDiv [x, y] =
427doOp v LB64SDiv [x, y] =
418 v ++ "idris_b64SDiv(vm, " ++ creg x ++ "," ++ creg y ++ ")"
428 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 ++ ")"
419
433
420doOp v LB64T8 [x] = v ++ "idris_b64T8(vm, " ++ creg x ++ ")"
434doOp v LB64T8 [x] = v ++ "idris_b64T8(vm, " ++ creg x ++ ")"
421doOp v LB64T16 [x] = v ++ "idris_b64T16(vm, " ++ creg x ++ ")"
435doOp v LB64T16 [x] = v ++ "idris_b64T16(vm, " ++ creg x ++ ")"