Skip to content

Commit 63aa648

Browse files
committed
Slim down indexed access as far as currently possible
Interestingly, the same code written as statements is significantly slower. See notes.
1 parent de98a19 commit 63aa648

16 files changed

+949
-1369
lines changed

dist/asc.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/asc.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/n-body/build/index.asm.js

Lines changed: 97 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ function asmFunc(global, env, buffer) {
666666
$3 = HEAPU32[$0 >> 2] | 0;
667667
if ($1 >>> 0 >= ((HEAP32[$3 >> 2] | 0) >>> 2 | 0) >>> 0) {
668668
if ($1 >>> 0 >= 268435454 >>> 0) {
669-
abort(0 | 0, 4 | 0, 75 | 0, 41 | 0);
669+
abort(0 | 0, 4 | 0, 81 | 0, 41 | 0);
670670
abort();
671671
}
672672
$3 = $lib_internal_arraybuffer_reallocUnsafe($3 | 0, ($1 + 1 | 0) << 2 | 0 | 0) | 0;
@@ -676,47 +676,42 @@ function asmFunc(global, env, buffer) {
676676
HEAP32[(($3 + ($1 << 2 | 0) | 0) + 8 | 0) >> 2] = $2;
677677
}
678678

679-
function $lib_array_Array_Body____get($0, $1) {
680-
$0 = $0 | 0;
681-
$1 = $1 | 0;
682-
var $2 = 0;
683-
$2 = HEAPU32[$0 >> 2] | 0;
684-
if ($1 >>> 0 >= ((HEAP32[$2 >> 2] | 0) >>> 2 | 0) >>> 0) {
685-
abort(0 | 0, 4 | 0, 64 | 0, 37 | 0);
686-
abort();
687-
}
688-
return HEAPU32[(($2 + ($1 << 2 | 0) | 0) + 8 | 0) >> 2] | 0 | 0;
689-
}
690-
691679
function assembly_index_NBodySystem_constructor($0, $1) {
692680
$0 = $0 | 0;
693681
$1 = $1 | 0;
694-
var $3 = 0, $2 = 0, $4 = 0.0, $5 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0, $8 = 0;
695-
$3 = $1;
696-
$8 = HEAP32[($3 + 4 | 0) >> 2] | 0;
682+
var $2 = 0, $3 = 0, $5 = 0, $4 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0.0, $9 = 0, $9 = 0, $11 = 0, $12 = 0;
683+
$2 = $1;
684+
$9 = HEAP32[($2 + 4 | 0) >> 2] | 0;
697685
continue_0 : do {
698-
if (($2 | 0) < ($8 | 0)) {
699-
$3 = $lib_array_Array_Body____get($1 | 0, $2 | 0) | 0;
700-
$4 = +HEAPF64[($3 + 48 | 0) >> 3];
701-
$5 = $5 + +HEAPF64[($3 + 24 | 0) >> 3] * $4;
702-
$6 = $6 + +HEAPF64[($3 + 32 | 0) >> 3] * $4;
703-
$7 = $7 + +HEAPF64[($3 + 40 | 0) >> 3] * $4;
704-
$2 = $2 + 1 | 0;
686+
if (($3 | 0) < ($9 | 0)) {
687+
$2 = $3;
688+
$5 = $1;
689+
$5 = HEAPU32[$5 >> 2] | 0;
690+
if ($2 >>> 0 < ((HEAP32[$5 >> 2] | 0) >>> 2 | 0) >>> 0) $11 = HEAPU32[(($5 + ($2 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
691+
$2 = $11;
692+
$4 = +HEAPF64[($2 + 48 | 0) >> 3];
693+
$6 = $6 + +HEAPF64[($2 + 24 | 0) >> 3] * $4;
694+
$7 = $7 + +HEAPF64[($2 + 32 | 0) >> 3] * $4;
695+
$8 = $8 + +HEAPF64[($2 + 40 | 0) >> 3] * $4;
696+
$3 = $3 + 1 | 0;
705697
continue continue_0;
706698
}
707699
break continue_0;
708700
} while (1);
709-
if ($0) $8 = $0; else {
710-
$2 = $lib_allocator_arena_allocate_memory(4 | 0) | 0;
711-
HEAP32[$2 >> 2] = 0;
712-
$0 = $2;
713-
$8 = $0;
701+
if ($0) $9 = $0; else {
702+
$3 = $lib_allocator_arena_allocate_memory(4 | 0) | 0;
703+
HEAP32[$3 >> 2] = 0;
704+
$0 = $3;
705+
$9 = $0;
714706
}
715-
HEAP32[$8 >> 2] = $1;
716-
$1 = $lib_array_Array_Body____get(HEAPU32[$0 >> 2] | 0 | 0, 0 | 0) | 0;
717-
HEAPF64[($1 + 24 | 0) >> 3] = -$5 / 39.47841760435743;
718-
HEAPF64[($1 + 32 | 0) >> 3] = -$6 / 39.47841760435743;
719-
HEAPF64[($1 + 40 | 0) >> 3] = -$7 / 39.47841760435743;
707+
HEAP32[$9 >> 2] = $1;
708+
$1 = HEAPU32[$0 >> 2] | 0;
709+
$1 = HEAPU32[$1 >> 2] | 0;
710+
if (0 >>> 0 < ((HEAP32[$1 >> 2] | 0) >>> 2 | 0) >>> 0) $12 = HEAPU32[(($1 + 0 | 0) + 8 | 0) >> 2] | 0; else abort();
711+
$1 = $12;
712+
HEAPF64[($1 + 24 | 0) >> 3] = -$6 / 39.47841760435743;
713+
HEAPF64[($1 + 32 | 0) >> 3] = -$7 / 39.47841760435743;
714+
HEAPF64[($1 + 40 | 0) >> 3] = -$8 / 39.47841760435743;
720715
return $0 | 0;
721716
}
722717

@@ -733,59 +728,72 @@ function asmFunc(global, env, buffer) {
733728

734729
function assembly_index_getBody($0) {
735730
$0 = $0 | 0;
736-
var $1 = 0, $2 = 0;
731+
var $1 = 0, $2 = 0, $3 = 0;
737732
$1 = HEAPU32[assembly_index_system >> 2] | 0;
738-
if ($0 >>> 0 < (HEAP32[($1 + 4 | 0) >> 2] | 0) >>> 0) $2 = $lib_array_Array_Body____get($1 | 0, $0 | 0) | 0; else $2 = 0;
733+
if ($0 >>> 0 < (HEAP32[($1 + 4 | 0) >> 2] | 0) >>> 0) {
734+
$1 = HEAPU32[$1 >> 2] | 0;
735+
if ($0 >>> 0 < ((HEAP32[$1 >> 2] | 0) >>> 2 | 0) >>> 0) $3 = HEAPU32[(($1 + ($0 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
736+
$2 = $3;
737+
} else $2 = 0;
739738
return $2 | 0;
740739
}
741740

742741
function assembly_index_NBodySystem_advance($0, $1) {
743742
$0 = $0 | 0;
744743
$1 = +$1;
745-
var $2 = 0, $3 = 0.0, $4 = 0.0, $5 = 0, $6 = 0.0, $7 = 0.0, $8 = 0.0, $9 = 0, $10 = 0.0, $11 = 0.0, $12 = 0.0, $13 = 0, $14 = 0, $15 = 0.0, $16 = 0.0, $17 = 0.0, $18 = 0.0;
744+
var $2 = 0, $4 = 0.0, $3 = 0, $5 = 0.0, $6 = 0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $10 = 0.0, $11 = 0.0, $12 = 0.0, $13 = 0, $14 = 0, $19 = 0, $16 = 0, $15 = 0.0, $16 = 0.0, $17 = 0.0, $18 = 0.0, $21 = 0.0, $22 = 0;
746745
$13 = HEAPU32[$0 >> 2] | 0;
747746
$0 = $13;
748747
$14 = HEAP32[($0 + 4 | 0) >> 2] | 0;
749748
continue_0 : do {
750-
if (($5 | 0) < ($14 | 0)) {
751-
$0 = $lib_array_Array_Body____get($13 | 0, $5 | 0) | 0;
749+
if (($6 | 0) < ($14 | 0)) {
750+
$3 = $6;
751+
$0 = $13;
752+
$0 = HEAPU32[$0 >> 2] | 0;
753+
if ($3 >>> 0 < ((HEAP32[$0 >> 2] | 0) >>> 2 | 0) >>> 0) $16 = HEAPU32[(($0 + ($3 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
754+
$0 = $16;
752755
$15 = +HEAPF64[$0 >> 3];
753756
$16 = +HEAPF64[($0 + 8 | 0) >> 3];
754757
$17 = +HEAPF64[($0 + 16 | 0) >> 3];
755-
$6 = +HEAPF64[($0 + 24 | 0) >> 3];
756-
$7 = +HEAPF64[($0 + 32 | 0) >> 3];
757-
$8 = +HEAPF64[($0 + 40 | 0) >> 3];
758+
$7 = +HEAPF64[($0 + 24 | 0) >> 3];
759+
$8 = +HEAPF64[($0 + 32 | 0) >> 3];
760+
$9 = +HEAPF64[($0 + 40 | 0) >> 3];
758761
$18 = +HEAPF64[($0 + 48 | 0) >> 3];
759-
$9 = $5 + 1 | 0;
762+
$3 = $6 + 1 | 0;
760763
continue_1 : do {
761-
if (($9 | 0) < ($14 | 0)) {
762-
$2 = $lib_array_Array_Body____get($13 | 0, $9 | 0) | 0;
763-
$10 = $15 - +HEAPF64[$2 >> 3];
764+
if (($3 | 0) < ($14 | 0)) {
765+
$21 = $15;
766+
$19 = $3;
767+
$2 = $13;
768+
$2 = HEAPU32[$2 >> 2] | 0;
769+
if ($19 >>> 0 < ((HEAP32[$2 >> 2] | 0) >>> 2 | 0) >>> 0) $22 = HEAPU32[(($2 + ($19 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
770+
$2 = $22;
771+
$10 = $21 - +HEAPF64[$2 >> 3];
764772
$11 = $16 - +HEAPF64[($2 + 8 | 0) >> 3];
765773
$12 = $17 - +HEAPF64[($2 + 16 | 0) >> 3];
766-
$3 = $10 * $10 + $11 * $11 + $12 * $12;
767-
$4 = Math_sqrt($3);
768-
$3 = $1 / ($3 * $4);
769-
$4 = $18 * $3;
770-
$3 = +HEAPF64[($2 + 48 | 0) >> 3] * $3;
771-
$6 = $6 - $10 * $3;
772-
$7 = $7 - $11 * $3;
773-
$8 = $8 - $12 * $3;
774-
HEAPF64[($2 + 24 | 0) >> 3] = +HEAPF64[($2 + 24 | 0) >> 3] + $10 * $4;
775-
HEAPF64[($2 + 32 | 0) >> 3] = +HEAPF64[($2 + 32 | 0) >> 3] + $11 * $4;
776-
HEAPF64[($2 + 40 | 0) >> 3] = +HEAPF64[($2 + 40 | 0) >> 3] + $12 * $4;
777-
$9 = $9 + 1 | 0;
774+
$4 = $10 * $10 + $11 * $11 + $12 * $12;
775+
$5 = Math_sqrt($4);
776+
$4 = $1 / ($4 * $5);
777+
$5 = $18 * $4;
778+
$4 = +HEAPF64[($2 + 48 | 0) >> 3] * $4;
779+
$7 = $7 - $10 * $4;
780+
$8 = $8 - $11 * $4;
781+
$9 = $9 - $12 * $4;
782+
HEAPF64[($2 + 24 | 0) >> 3] = +HEAPF64[($2 + 24 | 0) >> 3] + $10 * $5;
783+
HEAPF64[($2 + 32 | 0) >> 3] = +HEAPF64[($2 + 32 | 0) >> 3] + $11 * $5;
784+
HEAPF64[($2 + 40 | 0) >> 3] = +HEAPF64[($2 + 40 | 0) >> 3] + $12 * $5;
785+
$3 = $3 + 1 | 0;
778786
continue continue_1;
779787
}
780788
break continue_1;
781789
} while (1);
782-
HEAPF64[($0 + 24 | 0) >> 3] = $6;
783-
HEAPF64[($0 + 32 | 0) >> 3] = $7;
784-
HEAPF64[($0 + 40 | 0) >> 3] = $8;
785-
HEAPF64[$0 >> 3] = +HEAPF64[$0 >> 3] + $1 * $6;
786-
HEAPF64[($0 + 8 | 0) >> 3] = +HEAPF64[($0 + 8 | 0) >> 3] + $1 * $7;
787-
HEAPF64[($0 + 16 | 0) >> 3] = +HEAPF64[($0 + 16 | 0) >> 3] + $1 * $8;
788-
$5 = $5 + 1 | 0;
790+
HEAPF64[($0 + 24 | 0) >> 3] = $7;
791+
HEAPF64[($0 + 32 | 0) >> 3] = $8;
792+
HEAPF64[($0 + 40 | 0) >> 3] = $9;
793+
HEAPF64[$0 >> 3] = +HEAPF64[$0 >> 3] + $1 * $7;
794+
HEAPF64[($0 + 8 | 0) >> 3] = +HEAPF64[($0 + 8 | 0) >> 3] + $1 * $8;
795+
HEAPF64[($0 + 16 | 0) >> 3] = +HEAPF64[($0 + 16 | 0) >> 3] + $1 * $9;
796+
$6 = $6 + 1 | 0;
789797
continue continue_0;
790798
}
791799
break continue_0;
@@ -794,40 +802,49 @@ function asmFunc(global, env, buffer) {
794802

795803
function assembly_index_NBodySystem_energy($0) {
796804
$0 = $0 | 0;
797-
var $1 = 0.0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $10 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $11 = 0.0, $12 = 0.0, $13 = 0.0, $14 = 0.0, $15 = 0.0;
805+
var $1 = 0.0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $10 = 0.0, $11 = 0, $6 = 0.0, $9 = 0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $13 = 0.0, $14 = 0.0, $15 = 0.0, $16 = 0.0, $17 = 0, $18 = 0.0, $19 = 0.0;
798806
$4 = HEAPU32[$0 >> 2] | 0;
799807
$0 = $4;
800808
$5 = HEAP32[($0 + 4 | 0) >> 2] | 0;
801809
continue_0 : do {
802-
if (($2 | 0) < ($5 | 0)) {
803-
$0 = $lib_array_Array_Body____get($4 | 0, $2 | 0) | 0;
810+
if (($3 | 0) < ($5 | 0)) {
811+
$2 = $3;
812+
$0 = $4;
813+
$0 = HEAPU32[$0 >> 2] | 0;
814+
if ($2 >>> 0 < ((HEAP32[$0 >> 2] | 0) >>> 2 | 0) >>> 0) $9 = HEAPU32[(($0 + ($2 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
815+
$0 = $9;
804816
$7 = +HEAPF64[$0 >> 3];
805817
$8 = +HEAPF64[($0 + 8 | 0) >> 3];
806818
$9 = +HEAPF64[($0 + 16 | 0) >> 3];
807-
$11 = $1;
819+
$13 = $1;
808820
$10 = +HEAPF64[($0 + 48 | 0) >> 3];
809821
$1 = +HEAPF64[($0 + 24 | 0) >> 3];
810-
$12 = $1 * $1;
822+
$14 = $1 * $1;
811823
$1 = +HEAPF64[($0 + 32 | 0) >> 3];
812-
$13 = $12 + $1 * $1;
824+
$15 = $14 + $1 * $1;
813825
$1 = +HEAPF64[($0 + 40 | 0) >> 3];
814-
$1 = $11 + .5 * $10 * ($13 + $1 * $1);
815-
$0 = $2 + 1 | 0;
826+
$1 = $13 + .5 * $10 * ($15 + $1 * $1);
827+
$0 = $3 + 1 | 0;
816828
continue_1 : do {
817829
if (($0 | 0) < ($5 | 0)) {
818-
$3 = $lib_array_Array_Body____get($4 | 0, $0 | 0) | 0;
819-
$6 = $7 - +HEAPF64[$3 >> 3];
820-
$14 = $1;
821-
$1 = $8 - +HEAPF64[($3 + 8 | 0) >> 3];
822-
$15 = $6 * $6 + $1 * $1;
823-
$1 = $9 - +HEAPF64[($3 + 16 | 0) >> 3];
824-
$1 = $14 - $10 * +HEAPF64[($3 + 48 | 0) >> 3] / Math_sqrt($15 + $1 * $1);
830+
$16 = $7;
831+
$11 = $0;
832+
$2 = $4;
833+
$2 = HEAPU32[$2 >> 2] | 0;
834+
if ($11 >>> 0 < ((HEAP32[$2 >> 2] | 0) >>> 2 | 0) >>> 0) $17 = HEAPU32[(($2 + ($11 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
835+
$2 = $17;
836+
$6 = $16 - +HEAPF64[$2 >> 3];
837+
$18 = $1;
838+
$1 = $8 - +HEAPF64[($2 + 8 | 0) >> 3];
839+
$19 = $6 * $6 + $1 * $1;
840+
$1 = $9 - +HEAPF64[($2 + 16 | 0) >> 3];
841+
$1 = $18 - $10 * +HEAPF64[($2 + 48 | 0) >> 3] / Math_sqrt($19 + $1 * $1);
825842
$0 = $0 + 1 | 0;
826843
continue continue_1;
827844
}
828845
break continue_1;
829846
} while (1);
830-
$2 = $2 + 1 | 0;
847+
$3 = $3 + 1 | 0;
831848
continue continue_0;
832849
}
833850
break continue_0;
153 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)