@@ -2,131 +2,94 @@
22
33#include "idris_rts.h"
44
5−VAL idris_b8(VM *vm, VAL a) {
6− uint8_t A = GETINT(a);
7− VAL cl = allocate(sizeof(Closure), 0);
5+VAL idris_b8const(VM *vm, uint8_t a) {
6+ Bits8 * cl = iallocate(vm, sizeof(*cl), 0);
87 SETTY(cl, CT_BITS8);
9− cl->info.bits8 = (uint8_t) A;
10− return cl;
8+ cl->bits8 = a;
9+ return (VAL)cl;
1110}
1211
13−VAL idris_b16(VM *vm, VAL a) {
14− uint16_t A = GETINT(a);
15− VAL cl = allocate(sizeof(Closure), 0);
12+VAL idris_b16const(VM *vm, uint16_t a) {
13+ Bits16 * cl = iallocate(vm, sizeof(*cl), 0);
1614 SETTY(cl, CT_BITS16);
17− cl->info.bits16 = (uint16_t) A;
18− return cl;
15+ cl->bits16 = a;
16+ return (VAL)cl;
1917}
2018
21−VAL idris_b32(VM *vm, VAL a) {
22− uint32_t A = GETINT(a);
23− VAL cl = allocate(sizeof(Closure), 0);
19+VAL idris_b32const(VM *vm, uint32_t a) {
20+ Bits32 * cl = iallocate(vm, sizeof(*cl), 0);
2421 SETTY(cl, CT_BITS32);
25− cl->info.bits32 = (uint32_t) A;
26− return cl;
22+ cl->bits32 = a;
23+ return (VAL)cl;
2724}
2825
29−VAL idris_b64(VM *vm, VAL a) {
30− uint64_t A = GETINT(a);
31− VAL cl = allocate(sizeof(Closure), 0);
26+VAL idris_b64const(VM *vm, uint64_t a) {
27+ Bits64 * cl = iallocate(vm, sizeof(*cl), 0);
3228 SETTY(cl, CT_BITS64);
33− cl->info.bits64 = (uint64_t) A;
34− return cl;
29+ cl->bits64 = a;
30+ return (VAL)cl;
3531}
3632
37−VAL idris_castB32Int(VM *vm, VAL a) {
38− return MKINT(GETBITS32(a));
33+VAL idris_b8(VM *vm, VAL a) {
34+ return idris_b8const(vm, GETINT(a));
3935}
4036
41−VAL idris_b8const(VM *vm, uint8_t a) {
42− VAL cl = allocate(sizeof(Closure), 0);
43− SETTY(cl, CT_BITS8);
44− cl->info.bits8 = a;
45− return cl;
37+VAL idris_b16(VM *vm, VAL a) {
38+ return idris_b16const(vm, GETINT(a));
4639}
4740
48−VAL idris_b16const(VM *vm, uint16_t a) {
49− VAL cl = allocate(sizeof(Closure), 0);
50− SETTY(cl, CT_BITS16);
51− cl->info.bits16 = a;
52− return cl;
41+VAL idris_b32(VM *vm, VAL a) {
42+ return idris_b32const(vm, GETINT(a));
5343}
5444
55−VAL idris_b32const(VM *vm, uint32_t a) {
56− VAL cl = allocate(sizeof(Closure), 0);
57− SETTY(cl, CT_BITS32);
58− cl->info.bits32 = a;
59− return cl;
45+VAL idris_b64(VM *vm, VAL a) {
46+ return idris_b64const(vm, GETINT(a));
6047}
6148
62−VAL idris_b64const(VM *vm, uint64_t a) {
63− VAL cl = allocate(sizeof(Closure), 0);
64− SETTY(cl, CT_BITS64);
65− cl->info.bits64 = a;
66− return cl;
49+VAL idris_castB32Int(VM *vm, VAL a) {
50+ return MKINT(GETBITS32(a));
6751}
6852
6953VAL idris_b8Plus(VM *vm, VAL a, VAL b) {
7054 uint8_t A = GETBITS8(a);
7155 uint8_t B = GETBITS8(b);
72− VAL cl = allocate(sizeof(Closure), 0);
73− SETTY(cl, CT_BITS8);
74− cl->info.bits8 = A + B;
75− return cl;
56+ return idris_b8const(vm, A + B);
7657}
7758
7859VAL idris_b8Minus(VM *vm, VAL a, VAL b) {
7960 uint8_t A = GETBITS8(a);
8061 uint8_t B = GETBITS8(b);
81− VAL cl = allocate(sizeof(Closure), 0);
82− SETTY(cl, CT_BITS8);
83− cl->info.bits8 = A - B;
84− return cl;
62+ return idris_b8const(vm, A - B);
8563}
8664
8765VAL idris_b8Times(VM *vm, VAL a, VAL b) {
8866 uint8_t A = GETBITS8(a);
8967 uint8_t B = GETBITS8(b);
90− VAL cl = allocate(sizeof(Closure), 0);
91− SETTY(cl, CT_BITS8);
92− cl->info.bits8 = A * B;
93− return cl;
68+ return idris_b8const(vm, A * B);
9469}
9570
9671VAL idris_b8UDiv(VM *vm, VAL a, VAL b) {
9772 uint8_t A = GETBITS8(a);
9873 uint8_t B = GETBITS8(b);
99− VAL cl = allocate(sizeof(Closure), 0);
100− SETTY(cl, CT_BITS8);
101− cl->info.bits8 = A / B;
102− return cl;
74+ return idris_b8const(vm, A / B);
10375}
10476
10577VAL idris_b8SDiv(VM *vm, VAL a, VAL b) {
106− uint8_t A = GETBITS8(a);
107− uint8_t B = GETBITS8(b);
108− VAL cl = allocate(sizeof(Closure), 0);
109− SETTY(cl, CT_BITS8);
110− cl->info.bits8 = (uint8_t) (((int8_t) A) / ((int8_t) B));
111− return cl;
78+ int8_t A = GETBITS8(a);
79+ int8_t B = GETBITS8(b);
80+ return idris_b8const(vm, A / B);
11281}
11382
11483VAL idris_b8URem(VM *vm, VAL a, VAL b) {
11584 uint8_t A = GETBITS8(a);
11685 uint8_t B = GETBITS8(b);
117− VAL cl = allocate(sizeof(Closure), 0);
118− SETTY(cl, CT_BITS8);
119− cl->info.bits8 = A % B;
120− return cl;
86+ return idris_b8const(vm, A % B);
12187}
12288
12389VAL idris_b8SRem(VM *vm, VAL a, VAL b) {
124− uint8_t A = GETBITS8(a);
125− uint8_t B = GETBITS8(b);
126− VAL cl = allocate(sizeof(Closure), 0);
127− SETTY(cl, CT_BITS8);
128− cl->info.bits8 = (uint8_t) (((int8_t) A) % ((int8_t) B));
129− return cl;
90+ int8_t A = GETBITS8(a);
91+ int8_t B = GETBITS8(b);
92+ return idris_b8const(vm, A % B);
13093}
13194
13295VAL idris_b8Lt(VM *vm, VAL a, VAL b) {
@@ -151,127 +114,85 @@ VAL idris_b8Gte(VM *vm, VAL a, VAL b) {
151114
152115VAL idris_b8Compl(VM *vm, VAL a) {
153116 uint8_t A = GETBITS8(a);
154− VAL cl = allocate(sizeof(Closure), 0);
155− SETTY(cl, CT_BITS8);
156− cl->info.bits8 = ~ A;
157− return cl;
117+ return idris_b8const(vm, ~ A);
158118}
159119
160120VAL idris_b8And(VM *vm, VAL a, VAL b) {
161121 uint8_t A = GETBITS8(a);
162122 uint8_t B = GETBITS8(b);
163− VAL cl = allocate(sizeof(Closure), 0);
164− SETTY(cl, CT_BITS8);
165− cl->info.bits8 = A & B;
166− return cl;
123+ return idris_b8const(vm, A & B);
167124}
168125
169126VAL idris_b8Or(VM *vm, VAL a, VAL b) {
170127 uint8_t A = GETBITS8(a);
171128 uint8_t B = GETBITS8(b);
172− VAL cl = allocate(sizeof(Closure), 0);
173− SETTY(cl, CT_BITS8);
174− cl->info.bits8 = A | B;
175− return cl;
129+ return idris_b8const(vm, A | B);
176130}
177131
178132VAL idris_b8Xor(VM *vm, VAL a, VAL b) {
179133 uint8_t A = GETBITS8(a);
180134 uint8_t B = GETBITS8(b);
181− VAL cl = allocate(sizeof(Closure), 0);
182− SETTY(cl, CT_BITS8);
183− cl->info.bits8 = A ^ B;
184− return cl;
135+ return idris_b8const(vm, A ^ B);
185136}
186137
187138VAL idris_b8Shl(VM *vm, VAL a, VAL b) {
188139 uint8_t A = GETBITS8(a);
189140 uint8_t B = GETBITS8(b);
190− VAL cl = allocate(sizeof(Closure), 0);
191− SETTY(cl, CT_BITS8);
192− cl->info.bits8 = A << B;
193− return cl;
141+ return idris_b8const(vm, A << B);
194142}
195143
196144VAL idris_b8LShr(VM *vm, VAL a, VAL b) {
197145 uint8_t A = GETBITS8(a);
198146 uint8_t B = GETBITS8(b);
199− VAL cl = allocate(sizeof(Closure), 0);
200− SETTY(cl, CT_BITS8);
201− cl->info.bits8 = A >> B;
202− return cl;
147+ return idris_b8const(vm, A >> B);
203148}
204149
205150VAL idris_b8AShr(VM *vm, VAL a, VAL b) {
206− uint8_t A = GETBITS8(a);
207− uint8_t B = GETBITS8(b);
208− VAL cl = allocate(sizeof(Closure), 0);
209− SETTY(cl, CT_BITS8);
210− cl->info.bits8 = (uint8_t) (((int8_t) A) >> ((int8_t) B));
211− return cl;
151+ int8_t A = GETBITS8(a);
152+ int8_t B = GETBITS8(b);
153+ return idris_b8const(vm, A >> B);
212154}
213155
214156VAL idris_b16Plus(VM *vm, VAL a, VAL b) {
215157 uint16_t A = GETBITS16(a);
216158 uint16_t B = GETBITS16(b);
217− VAL cl = allocate(sizeof(Closure), 0);
218− SETTY(cl, CT_BITS16);
219− cl->info.bits16 = A + B;
220− return cl;
159+ return idris_b16const(vm, A + B);
221160}
222161
223162VAL idris_b16Minus(VM *vm, VAL a, VAL b) {
224163 uint16_t A = GETBITS16(a);
225164 uint16_t B = GETBITS16(b);
226− VAL cl = allocate(sizeof(Closure), 0);
227− SETTY(cl, CT_BITS16);
228− cl->info.bits16 = A - B;
229− return cl;
165+ return idris_b16const(vm, A - B);
230166}
231167
232168VAL idris_b16Times(VM *vm, VAL a, VAL b) {
233169 uint16_t A = GETBITS16(a);
234170 uint16_t B = GETBITS16(b);
235− VAL cl = allocate(sizeof(Closure), 0);
236− SETTY(cl, CT_BITS16);
237− cl->info.bits16 = A * B;
238− return cl;
171+ return idris_b16const(vm, A * B);
239172}
240173
241174VAL idris_b16UDiv(VM *vm, VAL a, VAL b) {
242175 uint16_t A = GETBITS16(a);
243176 uint16_t B = GETBITS16(b);
244− VAL cl = allocate(sizeof(Closure), 0);
245− SETTY(cl, CT_BITS16);
246− cl->info.bits16 = A / B;
247− return cl;
177+ return idris_b16const(vm, A / B);
248178}
249179
250180VAL idris_b16SDiv(VM *vm, VAL a, VAL b) {
251− uint16_t A = GETBITS16(a);
252− uint16_t B = GETBITS16(b);
253− VAL cl = allocate(sizeof(Closure), 0);
254− SETTY(cl, CT_BITS16);
255− cl->info.bits16 = (uint16_t) (((int16_t) A) / ((int16_t) B));
256− return cl;
181+ int16_t A = GETBITS16(a);
182+ int16_t B = GETBITS16(b);
183+ return idris_b16const(vm, A / B);
257184}
258185
259186VAL idris_b16URem(VM *vm, VAL a, VAL b) {
260187 uint16_t A = GETBITS16(a);
261188 uint16_t B = GETBITS16(b);
262− VAL cl = allocate(sizeof(Closure), 0);
263− SETTY(cl, CT_BITS16);
264− cl->info.bits16 = A % B;
265− return cl;
189+ return idris_b16const(vm, A % B);
266190}
267191
268192VAL idris_b16SRem(VM *vm, VAL a, VAL b) {
269− uint16_t A = GETBITS16(a);
270− uint16_t B = GETBITS16(b);
271− VAL cl = allocate(sizeof(Closure), 0);
272− SETTY(cl, CT_BITS16);
273− cl->info.bits16 = (uint16_t) (((int16_t) A) % ((int16_t) B));
274− return cl;
193+ int16_t A = GETBITS16(a);
194+ int16_t B = GETBITS16(b);
195+ return idris_b16const(vm, A % B);
275196}
276197
277198VAL idris_b16Lt(VM *vm, VAL a, VAL b) {
@@ -296,127 +217,85 @@ VAL idris_b16Gte(VM *vm, VAL a, VAL b) {
296217
297218VAL idris_b16Compl(VM *vm, VAL a) {
298219 uint16_t A = GETBITS16(a);
299− VAL cl = allocate(sizeof(Closure), 0);
300− SETTY(cl, CT_BITS16);
301− cl->info.bits16 = ~ A;
302− return cl;
220+ return idris_b16const(vm, ~ A);
303221}
304222
305223VAL idris_b16And(VM *vm, VAL a, VAL b) {
306224 uint16_t A = GETBITS16(a);
307225 uint16_t B = GETBITS16(b);
308− VAL cl = allocate(sizeof(Closure), 0);
309− SETTY(cl, CT_BITS16);
310− cl->info.bits16 = A & B;
311− return cl;
226+ return idris_b16const(vm, A & B);
312227}
313228
314229VAL idris_b16Or(VM *vm, VAL a, VAL b) {
315230 uint16_t A = GETBITS16(a);
316231 uint16_t B = GETBITS16(b);
317− VAL cl = allocate(sizeof(Closure), 0);
318− SETTY(cl, CT_BITS16);
319− cl->info.bits16 = A | B;
320− return cl;
232+ return idris_b16const(vm, A | B);
321233}
322234
323235VAL idris_b16Xor(VM *vm, VAL a, VAL b) {
324236 uint16_t A = GETBITS16(a);
325237 uint16_t B = GETBITS16(b);
326− VAL cl = allocate(sizeof(Closure), 0);
327− SETTY(cl, CT_BITS16);
328− cl->info.bits16 = A ^ B;
329− return cl;
238+ return idris_b16const(vm, A ^ B);
330239}
331240
332241VAL idris_b16Shl(VM *vm, VAL a, VAL b) {
333242 uint16_t A = GETBITS16(a);
334243 uint16_t B = GETBITS16(b);
335− VAL cl = allocate(sizeof(Closure), 0);
336− SETTY(cl, CT_BITS16);
337− cl->info.bits16 = A << B;
338− return cl;
244+ return idris_b16const(vm, A << B);
339245}
340246
341247VAL idris_b16LShr(VM *vm, VAL a, VAL b) {
342248 uint16_t A = GETBITS16(a);
343249 uint16_t B = GETBITS16(b);
344− VAL cl = allocate(sizeof(Closure), 0);
345− SETTY(cl, CT_BITS16);
346− cl->info.bits16 = A >> B;
347− return cl;
250+ return idris_b16const(vm, A >> B);
348251}
349252
350253VAL idris_b16AShr(VM *vm, VAL a, VAL b) {
351− uint16_t A = GETBITS16(a);
352− uint16_t B = GETBITS16(b);
353− VAL cl = allocate(sizeof(Closure), 0);
354− SETTY(cl, CT_BITS16);
355− cl->info.bits16 = (uint16_t) (((int16_t) A) >> ((int16_t) B));
356− return cl;
254+ int16_t A = GETBITS16(a);
255+ int16_t B = GETBITS16(b);
256+ return idris_b16const(vm, A >> B);
357257}
358258
359259VAL idris_b32Plus(VM *vm, VAL a, VAL b) {
360260 uint32_t A = GETBITS32(a);
361261 uint32_t B = GETBITS32(b);
362− VAL cl = allocate(sizeof(Closure), 0);
363− SETTY(cl, CT_BITS32);
364− cl->info.bits32 = A + B;
365− return cl;
262+ return idris_b32const(vm, A + B);
366263}
367264
368265VAL idris_b32Minus(VM *vm, VAL a, VAL b) {
369266 uint32_t A = GETBITS32(a);
370267 uint32_t B = GETBITS32(b);
371− VAL cl = allocate(sizeof(Closure), 0);
372− SETTY(cl, CT_BITS32);
373− cl->info.bits32 = A - B;
374− return cl;
268+ return idris_b32const(vm, A - B);
375269}
376270
377271VAL idris_b32Times(VM *vm, VAL a, VAL b) {
378272 uint32_t A = GETBITS32(a);
379273 uint32_t B = GETBITS32(b);
380− VAL cl = allocate(sizeof(Closure), 0);
381− SETTY(cl, CT_BITS32);
382− cl->info.bits32 = A * B;
383− return cl;
274+ return idris_b32const(vm, A * B);
384275}
385276
386277VAL idris_b32UDiv(VM *vm, VAL a, VAL b) {
387278 uint32_t A = GETBITS32(a);
388279 uint32_t B = GETBITS32(b);
389− VAL cl = allocate(sizeof(Closure), 0);
390− SETTY(cl, CT_BITS32);
391− cl->info.bits32 = A / B;
392− return cl;
280+ return idris_b32const(vm, A / B);
393281}
394282
395283VAL idris_b32SDiv(VM *vm, VAL a, VAL b) {
396− uint32_t A = GETBITS32(a);
397− uint32_t B = GETBITS32(b);
398− VAL cl = allocate(sizeof(Closure), 0);
399− SETTY(cl, CT_BITS32);
400− cl->info.bits32 = (uint32_t) (((int32_t) A) / ((int32_t) B));
401− return cl;
284+ int32_t A = GETBITS32(a);
285+ int32_t B = GETBITS32(b);
286+ return idris_b32const(vm, A / B);
402287}
403288
404289VAL idris_b32URem(VM *vm, VAL a, VAL b) {
405290 uint32_t A = GETBITS32(a);
406291 uint32_t B = GETBITS32(b);
407− VAL cl = allocate(sizeof(Closure), 0);
408− SETTY(cl, CT_BITS32);
409− cl->info.bits32 = A % B;
410− return cl;
292+ return idris_b32const(vm, A % B);
411293}
412294
413295VAL idris_b32SRem(VM *vm, VAL a, VAL b) {
414− uint32_t A = GETBITS32(a);
415− uint32_t B = GETBITS32(b);
416− VAL cl = allocate(sizeof(Closure), 0);
417− SETTY(cl, CT_BITS32);
418− cl->info.bits32 = (uint32_t) (((int32_t) A) % ((int32_t) B));
419− return cl;
296+ int32_t A = GETBITS32(a);
297+ int32_t B = GETBITS32(b);
298+ return idris_b32const(vm, A % B);
420299}
421300
422301VAL idris_b32Lt(VM *vm, VAL a, VAL b) {
@@ -441,353 +320,246 @@ VAL idris_b32Gte(VM *vm, VAL a, VAL b) {
441320
442321VAL idris_b32Compl(VM *vm, VAL a) {
443322 uint32_t A = GETBITS32(a);
444− VAL cl = allocate(sizeof(Closure), 0);
445− SETTY(cl, CT_BITS32);
446− cl->info.bits32 = ~ A;
447− return cl;
323+ return idris_b32const(vm, ~ A);
448324}
449325
450326VAL idris_b32And(VM *vm, VAL a, VAL b) {
451327 uint32_t A = GETBITS32(a);
452328 uint32_t B = GETBITS32(b);
453− VAL cl = allocate(sizeof(Closure), 0);
454− SETTY(cl, CT_BITS32);
455− cl->info.bits32 = A & B;
456− return cl;
329+ return idris_b32const(vm, A & B);
457330}
458331
459332VAL idris_b32Or(VM *vm, VAL a, VAL b) {
460333 uint32_t A = GETBITS32(a);
461334 uint32_t B = GETBITS32(b);
462− VAL cl = allocate(sizeof(Closure), 0);
463− SETTY(cl, CT_BITS32);
464− cl->info.bits32 = A | B;
465− return cl;
335+ return idris_b32const(vm, A | B);
466336}
467337
468338VAL idris_b32Xor(VM *vm, VAL a, VAL b) {
469339 uint32_t A = GETBITS32(a);
470340 uint32_t B = GETBITS32(b);
471− VAL cl = allocate(sizeof(Closure), 0);
472− SETTY(cl, CT_BITS32);
473− cl->info.bits32 = A ^ B;
474− return cl;
341+ return idris_b32const(vm, A ^ B);
475342}
476343
477344VAL idris_b32Shl(VM *vm, VAL a, VAL b) {
478345 uint32_t A = GETBITS32(a);
479346 uint32_t B = GETBITS32(b);
480− VAL cl = allocate(sizeof(Closure), 0);
481− SETTY(cl, CT_BITS32);
482− cl->info.bits32 = A << B;
483− return cl;
347+ return idris_b32const(vm, A << B);
484348}
485349
486350VAL idris_b32LShr(VM *vm, VAL a, VAL b) {
487351 uint32_t A = GETBITS32(a);
488352 uint32_t B = GETBITS32(b);
489− VAL cl = allocate(sizeof(Closure), 0);
490− SETTY(cl, CT_BITS32);
491− cl->info.bits32 = A >> B;
492− return cl;
353+ return idris_b32const(vm, A >> B);
493354}
494355
495356VAL idris_b32AShr(VM *vm, VAL a, VAL b) {
496− uint32_t A = GETBITS32(a);
497− uint32_t B = GETBITS32(b);
498− VAL cl = allocate(sizeof(Closure), 0);
499− SETTY(cl, CT_BITS32);
500− cl->info.bits32 = (uint32_t) (((int32_t)A) >> ((int32_t)B));
501− return cl;
357+ int32_t A = GETBITS32(a);
358+ int32_t B = GETBITS32(b);
359+ return idris_b32const(vm, A >> B);
502360}
503361
504362VAL idris_b64Plus(VM *vm, VAL a, VAL b) {
505363 uint64_t A = GETBITS64(a);
506364 uint64_t B = GETBITS64(b);
507− VAL cl = allocate(sizeof(Closure), 0);
508− SETTY(cl, CT_BITS64);
509− cl->info.bits64 = A + B;
510− return cl;
365+ return idris_b64const(vm, A + B);
511366}
512367
513368VAL idris_b64Minus(VM *vm, VAL a, VAL b) {
514369 uint64_t A = GETBITS64(a);
515370 uint64_t B = GETBITS64(b);
516− VAL cl = allocate(sizeof(Closure), 0);
517− SETTY(cl, CT_BITS64);
518− cl->info.bits64 = A - B;
519− return cl;
371+ return idris_b64const(vm, A - B);
520372}
521373
522374VAL idris_b64Times(VM *vm, VAL a, VAL b) {
523375 uint64_t A = GETBITS64(a);
524376 uint64_t B = GETBITS64(b);
525− VAL cl = allocate(sizeof(Closure), 0);
526− SETTY(cl, CT_BITS64);
527− cl->info.bits64 = A * B;
528− return cl;
377+ return idris_b64const(vm, A * B);
529378}
530379
531380VAL idris_b64UDiv(VM *vm, VAL a, VAL b) {
532381 uint64_t A = GETBITS64(a);
533382 uint64_t B = GETBITS64(b);
534− VAL cl = allocate(sizeof(Closure), 0);
535− SETTY(cl, CT_BITS64);
536− cl->info.bits64 = A / B;
537− return cl;
383+ return idris_b64const(vm, A / B);
538384}
539385
540386VAL idris_b64SDiv(VM *vm, VAL a, VAL b) {
541− uint64_t A = GETBITS64(a);
542− uint64_t B = GETBITS64(b);
543− VAL cl = allocate(sizeof(Closure), 0);
544− SETTY(cl, CT_BITS64);
545− cl->info.bits64 = (uint64_t) (((int64_t) A) / ((int64_t) B));
546− return cl;
387+ int64_t A = GETBITS64(a);
388+ int64_t B = GETBITS64(b);
389+ return idris_b64const(vm, A / B);
547390}
548391
549392VAL idris_b64URem(VM *vm, VAL a, VAL b) {
550393 uint64_t A = GETBITS64(a);
551394 uint64_t B = GETBITS64(b);
552− VAL cl = allocate(sizeof(Closure), 0);
553− SETTY(cl, CT_BITS64);
554− cl->info.bits64 = A % B;
555− return cl;
395+ return idris_b64const(vm, A % B);
556396}
557397
558398VAL idris_b64SRem(VM *vm, VAL a, VAL b) {
559− uint64_t A = GETBITS64(a);
560− uint64_t B = GETBITS64(b);
561− VAL cl = allocate(sizeof(Closure), 0);
562− SETTY(cl, CT_BITS64);
563− cl->info.bits64 = (uint64_t) (((int64_t) A) % ((int64_t) B));
564− return cl;
399+ int64_t A = GETBITS64(a);
400+ int64_t B = GETBITS64(b);
401+ return idris_b64const(vm, A % B);
565402}
566403
567404VAL idris_b64Lt(VM *vm, VAL a, VAL b) {
568− return MKINT((i_int) (a->info.bits64 < b->info.bits64));
405+ uint64_t A = GETBITS64(a);
406+ uint64_t B = GETBITS64(b);
407+ return MKINT((i_int) (A < B));
569408}
570409
571410VAL idris_b64Gt(VM *vm, VAL a, VAL b) {
572− return MKINT((i_int) (a->info.bits64 > b->info.bits64));
411+ uint64_t A = GETBITS64(a);
412+ uint64_t B = GETBITS64(b);
413+ return MKINT((i_int) (A > B));
573414}
574415
575416VAL idris_b64Eq(VM *vm, VAL a, VAL b) {
576− return MKINT((i_int) (a->info.bits64 == b->info.bits64));
417+ uint64_t A = GETBITS64(a);
418+ uint64_t B = GETBITS64(b);
419+ return MKINT((i_int) (A == B));
577420}
578421
579422VAL idris_b64Lte(VM *vm, VAL a, VAL b) {
580− return MKINT((i_int) (a->info.bits64 <= b->info.bits64));
423+ uint64_t A = GETBITS64(a);
424+ uint64_t B = GETBITS64(b);
425+ return MKINT((i_int) (A <= B));
581426}
582427
583428VAL idris_b64Gte(VM *vm, VAL a, VAL b) {
584− return MKINT((i_int) (a->info.bits64 >= b->info.bits64));
429+ uint64_t A = GETBITS64(a);
430+ uint64_t B = GETBITS64(b);
431+ return MKINT((i_int) (A >= B));
585432}
586433
587434VAL idris_b64Compl(VM *vm, VAL a) {
588435 uint64_t A = GETBITS64(a);
589− VAL cl = allocate(sizeof(Closure), 0);
590− SETTY(cl, CT_BITS64);
591− cl->info.bits64 = ~ A;
592− return cl;
436+ return idris_b64const(vm, ~ A);
593437}
594438
595439VAL idris_b64And(VM *vm, VAL a, VAL b) {
596440 uint64_t A = GETBITS64(a);
597441 uint64_t B = GETBITS64(b);
598− VAL cl = allocate(sizeof(Closure), 0);
599− SETTY(cl, CT_BITS64);
600− cl->info.bits64 = A & B;
601− return cl;
442+ return idris_b64const(vm, A & B);
602443}
603444
604445VAL idris_b64Or(VM *vm, VAL a, VAL b) {
605446 uint64_t A = GETBITS64(a);
606447 uint64_t B = GETBITS64(b);
607− VAL cl = allocate(sizeof(Closure), 0);
608− SETTY(cl, CT_BITS64);
609− cl->info.bits64 = A | B;
610− return cl;
448+ return idris_b64const(vm, A | B);
611449}
612450
613451VAL idris_b64Xor(VM *vm, VAL a, VAL b) {
614452 uint64_t A = GETBITS64(a);
615453 uint64_t B = GETBITS64(b);
616− VAL cl = allocate(sizeof(Closure), 0);
617− SETTY(cl, CT_BITS64);
618− cl->info.bits64 = A ^ B;
619− return cl;
454+ return idris_b64const(vm, A ^ B);
620455}
621456
622457VAL idris_b64Shl(VM *vm, VAL a, VAL b) {
623458 uint64_t A = GETBITS64(a);
624459 uint64_t B = GETBITS64(b);
625− VAL cl = allocate(sizeof(Closure), 0);
626− SETTY(cl, CT_BITS64);
627− cl->info.bits64 = A << B;
628− return cl;
460+ return idris_b64const(vm, A << B);
629461}
630462
631463VAL idris_b64LShr(VM *vm, VAL a, VAL b) {
632464 uint64_t A = GETBITS64(a);
633465 uint64_t B = GETBITS64(b);
634− VAL cl = allocate(sizeof(Closure), 0);
635− SETTY(cl, CT_BITS64);
636− cl->info.bits64 = A >> B;
637− return cl;
466+ return idris_b64const(vm, A >> B);
638467}
639468
640469VAL idris_b64AShr(VM *vm, VAL a, VAL b) {
641− uint64_t A = GETBITS64(a);
642− uint64_t B = GETBITS64(b);
643− VAL cl = allocate(sizeof(Closure), 0);
644− SETTY(cl, CT_BITS64);
645− cl->info.bits64 = (uint64_t) (((int64_t) A) >> ((int64_t) B));
646− return cl;
470+ int64_t A = GETBITS64(a);
471+ int64_t B = GETBITS64(b);
472+ return idris_b64const(vm, A >> B);
647473}
648474
649475VAL idris_b8Z16(VM *vm, VAL a) {
650476 uint8_t A = GETBITS8(a);
651− VAL cl = allocate(sizeof(Closure), 0);
652− SETTY(cl, CT_BITS16);
653− cl->info.bits16 = (uint16_t) A;
654− return cl;
477+ return idris_b16const(vm, A);
655478}
656479
657480VAL idris_b8Z32(VM *vm, VAL a) {
658481 uint8_t A = GETBITS8(a);
659− VAL cl = allocate(sizeof(Closure), 0);
660− SETTY(cl, CT_BITS32);
661− cl->info.bits32 = (uint32_t) A;
662− return cl;
482+ return idris_b32const(vm, A);
663483}
664484
665485VAL idris_b8Z64(VM *vm, VAL a) {
666486 uint8_t A = GETBITS8(a);
667− VAL cl = allocate(sizeof(Closure), 0);
668− SETTY(cl, CT_BITS64);
669− cl->info.bits64 = (uint64_t) A;
670− return cl;
487+ return idris_b64const(vm, A);
671488}
672489
673490VAL idris_b8S16(VM *vm, VAL a) {
674− uint8_t A = GETBITS8(a);
675− VAL cl = allocate(sizeof(Closure), 0);
676− SETTY(cl, CT_BITS16);
677− cl->info.bits16 = (uint16_t) (int16_t) (int8_t) A;
678− return cl;
491+ int8_t A = GETBITS8(a);
492+ return idris_b16const(vm, (int16_t) A);
679493}
680494
681495VAL idris_b8S32(VM *vm, VAL a) {
682− uint8_t A = GETBITS8(a);
683− VAL cl = allocate(sizeof(Closure), 0);
684− SETTY(cl, CT_BITS32);
685− cl->info.bits32 = (uint32_t) (int32_t) (int8_t) A;
686− return cl;
496+ int8_t A = GETBITS8(a);
497+ return idris_b32const(vm, (int32_t) A);
687498}
688499
689500VAL idris_b8S64(VM *vm, VAL a) {
690− uint8_t A = GETBITS8(a);
691− VAL cl = allocate(sizeof(Closure), 0);
692− SETTY(cl, CT_BITS64);
693− cl->info.bits64 = (uint64_t) (int64_t) (int8_t) A;
694− return cl;
501+ int8_t A = GETBITS8(a);
502+ return idris_b64const(vm, (int64_t) A);
695503}
696504
697505VAL idris_b16Z32(VM *vm, VAL a) {
698506 uint16_t A = GETBITS16(a);
699− VAL cl = allocate(sizeof(Closure), 0);
700− SETTY(cl, CT_BITS32);
701− cl->info.bits32 = (uint32_t) A;
702− return cl;
507+ return idris_b32const(vm, (uint32_t) A);
703508}
704509
705510VAL idris_b16Z64(VM *vm, VAL a) {
706511 uint16_t A = GETBITS16(a);
707− VAL cl = allocate(sizeof(Closure), 0);
708− SETTY(cl, CT_BITS64);
709− cl->info.bits64 = (uint64_t) A;
710− return cl;
512+ return idris_b64const(vm, (uint64_t) A);
711513}
712514
713515VAL idris_b16S32(VM *vm, VAL a) {
714− uint16_t A = GETBITS16(a);
715− VAL cl = allocate(sizeof(Closure), 0);
716− SETTY(cl, CT_BITS32);
717− cl->info.bits32 = (uint32_t) (int32_t) (int16_t) A;
718− return cl;
516+ int16_t A = GETBITS16(a);
517+ return idris_b32const(vm, (int32_t) A);
719518}
720519
721520VAL idris_b16S64(VM *vm, VAL a) {
722− uint16_t A = GETBITS16(a);
723− VAL cl = allocate(sizeof(Closure), 0);
724− SETTY(cl, CT_BITS64);
725− cl->info.bits64 = (uint64_t) (int64_t) (int16_t) A;
726− return cl;
521+ int16_t A = GETBITS16(a);
522+ return idris_b64const(vm, (int64_t) A);
727523}
728524
729525VAL idris_b16T8(VM *vm, VAL a) {
730526 uint16_t A = GETBITS16(a);
731− VAL cl = allocate(sizeof(Closure), 0);
732− SETTY(cl, CT_BITS8);
733− cl->info.bits8 = (uint8_t) A;
734− return cl;
527+ return idris_b8const(vm, (uint8_t) A);
735528}
736529
737530VAL idris_b32Z64(VM *vm, VAL a) {
738531 uint32_t A = GETBITS32(a);
739− VAL cl = allocate(sizeof(Closure), 0);
740− SETTY(cl, CT_BITS64);
741− cl->info.bits64 = (uint64_t) A;
742− return cl;
532+ return idris_b64const(vm, (uint64_t) A);
743533}
744534
745535VAL idris_b32S64(VM *vm, VAL a) {
746− uint32_t A = GETBITS32(a);
747− VAL cl = allocate(sizeof(Closure), 0);
748− SETTY(cl, CT_BITS64);
749− cl->info.bits64 = (uint64_t) (int64_t) (int32_t) A;
750− return cl;
536+ int32_t A = GETBITS32(a);
537+ return idris_b64const(vm, (int64_t) A);
751538}
752539
753540VAL idris_b32T8(VM *vm, VAL a) {
754541 uint32_t A = GETBITS32(a);
755− VAL cl = allocate(sizeof(Closure), 0);
756− SETTY(cl, CT_BITS8);
757− cl->info.bits8 = (uint8_t) A;
758− return cl;
542+ return idris_b8const(vm, (uint8_t) A);
759543}
760544
761545VAL idris_b32T16(VM *vm, VAL a) {
762546 uint32_t A = GETBITS32(a);
763− VAL cl = allocate(sizeof(Closure), 0);
764− SETTY(cl, CT_BITS16);
765− cl->info.bits16 = (uint16_t) A;
766− return cl;
547+ return idris_b16const(vm, (uint16_t) A);
767548}
768549
769550VAL idris_b64T8(VM *vm, VAL a) {
770551 uint64_t A = GETBITS64(a);
771− VAL cl = allocate(sizeof(Closure), 0);
772− SETTY(cl, CT_BITS8);
773− cl->info.bits8 = (uint8_t) A;
774− return cl;
552+ return idris_b8const(vm, (uint8_t) A);
775553}
776554
777555VAL idris_b64T16(VM *vm, VAL a) {
778556 uint64_t A = GETBITS64(a);
779− VAL cl = allocate(sizeof(Closure), 0);
780− SETTY(cl, CT_BITS16);
781− cl->info.bits16 = (uint16_t) A;
782− return cl;
557+ return idris_b16const(vm, (uint16_t) A);
783558}
784559
785560VAL idris_b64T32(VM *vm, VAL a) {
786561 uint64_t A = GETBITS64(a);
787− VAL cl = allocate(sizeof(Closure), 0);
788− SETTY(cl, CT_BITS32);
789− cl->info.bits32 = (uint32_t) A;
790− return cl;
562+ return idris_b32const(vm, (uint32_t) A);
791563}
792564
793565VAL idris_peekB8(VM* vm, VAL ptr, VAL offset) {