Asm.js

From Adam Colton
Jump to navigation Jump to search

http://anvaka.github.io/asmalidator/

Uses a prologue directive

 function MyAsmModule() {
   "use asm";
   // module body
 }

Example

 function GeometricMean(stdlib, foreign, buffer) {
   "use asm";
   
   var exp = stdlib.Math.exp;
   var log = stdlib.Math.log;
   var values = new stdlib.Float64Array(buffer);
   
   function logSum(start, end) {
     start = start|0;
     end = end|0;
     
     var sum = 0.0, p = 0, q = 0;
     
     // asm.js forces byte addressing of the heap by requiring shifting by 3
     for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
       sum = sum + +log(values[p>>3]);
     }
     
     return +sum;
   }
   
   function geometricMean(start, end) {
     start = start|0;
     end = end|0;
     
     return +exp(+logSum(start, end) / +((end - start)|0));
   }
   
   return { geometricMean: geometricMean };
 }

Types

  • int: x|0
  • double: +x

GC Notes

I think I'm going to use a copy garbage collector with two level pointers. So there will be a block of pointers that don't move and all pointer go through that block. I can form a single linked list of the unused pointers, a stack; as I deallocate pointers, push them on the pointer stack, as I need them, pop them off.