import { op , VAL_TYPE , IS_NOT_ZEROISH , EPSILON , BLOCK } from "./encoding" ; import { FunctionDefinition } from "./types" ; import { BUFFER_SIZE } from "./constants" ; export const localFuncMap = { sqr : { args : [ VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . local_get ( 0 ) , ... op . local_get ( 0 ) , op . f64_mul ] , } , bor : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . local_get ( 0 ) , ... IS_NOT_ZEROISH , ... op . local_get ( 1 ) , ... IS_NOT_ZEROISH , op . i32_or , ... op . i32_const ( 0 ) , op . i32_ne , op . f64_convert_i32_s , ] , } , band : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . local_get ( 0 ) , ... IS_NOT_ZEROISH , ... op . local_get ( 1 ) , ... IS_NOT_ZEROISH , op . i32_and , ... op . i32_const ( 0 ) , op . i32_ne , op . f64_convert_i32_s , ] , } , sign : { args : [ VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . f64_const ( 0 ) , ... op . local_get ( 0 ) , op . f64_lt , ... op . local_get ( 0 ) , ... op . f64_const ( 0 ) , op . f64_lt , op . i32_sub , op . f64_convert_i32_s , ] , } , mod : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , localVariables : [ VAL_TYPE . i32 ] , binary : [ ... op . local_get ( 1 ) , op . i32_trunc_f64_s , ... op . local_tee ( 2 ) , ... op . i32_const ( 0 ) , op . i32_ne , ... op . if ( BLOCK . f64 ) , ... op . local_get ( 0 ) , op . i32_trunc_f64_s , ... op . local_get ( 2 ) , op . i32_rem_s , op . f64_convert_i32_s , op . else , ... op . f64_const ( 0 ) , op . end , ] , } , bitwiseOr : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . local_get ( 0 ) , op . i64_trunc_s_f64 , ... op . local_get ( 1 ) , op . i64_trunc_s_f64 , op . i64_or , op . f64_convert_i64_s , ] , } , bitwiseAnd : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , binary : [ ... op . local_get ( 0 ) , op . i64_trunc_s_f64 , ... op . local_get ( 1 ) , op . i64_trunc_s_f64 , op . i64_and , op . f64_convert_i64_s , ] , } , div : { args : [ VAL_TYPE . f64 , VAL_TYPE . f64 ] , returns : [ VAL_TYPE . f64 ] , localVariables : [ VAL_TYPE . i32 ] , binary : [ ... op . local_get ( 1 ) , ... op . f64_const ( 0 ) , op . f64_ne , ... op . if ( BLOCK . f64 ) , ... op . local_get ( 0 ) , ... op . local_get ( 1 ) , op . f64_div , op . else , ... op . f64_const ( 0 ) , op . end , ] , } , _getBufferIndex : { args : [ VAL_TYPE . f64 ] , returns : [ VAL_TYPE . i32 ] , localVariables : [ VAL_TYPE . f64 , VAL_TYPE . i32 , ] , binary : [ ... op . f64_const ( EPSILON ) , ... op . local_get ( 0 ) , op . f64_add , ... op . local_tee ( 1 ) , op . i32_trunc_f64_s , ... op . local_set ( 2 ) , ... op . i32_const ( - 1 ) , ... op . local_get ( 2 ) , ... op . i32_const ( 8 ) , op . i32_mul , ... op . local_get ( 2 ) , ... op . i32_const ( 0 ) , op . i32_lt_s , ... op . local_get ( 2 ) , ... op . i32_const ( BUFFER_SIZE - 1 ) , op . i32_gt_s , op . i32_or , op . select , ] , } , } ;