Skip to content

Commit b07cb1c

Browse files
authored
Merge pull request #13 from whirlicote/rounding-variant-dependecies
Rounding variant feature implementation for reference interpreter
2 parents 18b7a91 + 4282db6 commit b07cb1c

File tree

12 files changed

+768
-8
lines changed

12 files changed

+768
-8
lines changed

interpreter/binary/decode.ml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,69 @@ let rec instr s =
507507
| 0x10l -> table_size (at var s)
508508
| 0x11l -> table_fill (at var s)
509509

510+
| 0x80l -> f32_sqrt_ceil
511+
| 0x81l -> f32_add_ceil
512+
| 0x82l -> f32_sub_ceil
513+
| 0x83l -> f32_mul_ceil
514+
| 0x84l -> f32_div_ceil
515+
| 0x85l -> f64_sqrt_ceil
516+
| 0x86l -> f64_add_ceil
517+
| 0x87l -> f64_sub_ceil
518+
| 0x88l -> f64_mul_ceil
519+
| 0x89l -> f64_div_ceil
520+
| 0x8al -> f32_convert_ceil_i32_s
521+
| 0x8bl -> f32_convert_ceil_i32_u
522+
| 0x8cl -> f32_convert_ceil_i64_s
523+
| 0x8dl -> f32_convert_ceil_i64_u
524+
| 0x8el -> f32_demote_ceil_f64
525+
| 0x8fl -> f64_convert_ceil_i32_s
526+
| 0x90l -> f64_convert_ceil_i32_u
527+
| 0x91l -> f64_convert_ceil_i64_s
528+
| 0x92l -> f64_convert_ceil_i64_u
529+
| 0x93l -> f64_promote_ceil_f32
530+
531+
| 0x94l -> f32_sqrt_floor
532+
| 0x95l -> f32_add_floor
533+
| 0x96l -> f32_sub_floor
534+
| 0x97l -> f32_mul_floor
535+
| 0x98l -> f32_div_floor
536+
| 0x99l -> f64_sqrt_floor
537+
| 0x9al -> f64_add_floor
538+
| 0x9bl -> f64_sub_floor
539+
| 0x9cl -> f64_mul_floor
540+
| 0x9dl -> f64_div_floor
541+
| 0x9el -> f32_convert_floor_i32_s
542+
| 0x9fl -> f32_convert_floor_i32_u
543+
| 0xa0l -> f32_convert_floor_i64_s
544+
| 0xa1l -> f32_convert_floor_i64_u
545+
| 0xa2l -> f32_demote_floor_f64
546+
| 0xa3l -> f64_convert_floor_i32_s
547+
| 0xa4l -> f64_convert_floor_i32_u
548+
| 0xa5l -> f64_convert_floor_i64_s
549+
| 0xa6l -> f64_convert_floor_i64_u
550+
| 0xa7l -> f64_promote_floor_f32
551+
552+
| 0xa8l -> f32_sqrt_trunc
553+
| 0xa9l -> f32_add_trunc
554+
| 0xaal -> f32_sub_trunc
555+
| 0xabl -> f32_mul_trunc
556+
| 0xacl -> f32_div_trunc
557+
| 0xadl -> f64_sqrt_trunc
558+
| 0xael -> f64_add_trunc
559+
| 0xafl -> f64_sub_trunc
560+
| 0xb0l -> f64_mul_trunc
561+
| 0xb1l -> f64_div_trunc
562+
| 0xb2l -> f32_convert_trunc_i32_s
563+
| 0xb3l -> f32_convert_trunc_i32_u
564+
| 0xb4l -> f32_convert_trunc_i64_s
565+
| 0xb5l -> f32_convert_trunc_i64_u
566+
| 0xb6l -> f32_demote_trunc_f64
567+
| 0xb7l -> f64_convert_trunc_i32_s
568+
| 0xb8l -> f64_convert_trunc_i32_u
569+
| 0xb9l -> f64_convert_trunc_i64_s
570+
| 0xbal -> f64_convert_trunc_i64_u
571+
| 0xbbl -> f64_promote_trunc_f32
572+
510573
| n -> illegal2 s pos b n
511574
)
512575

interpreter/binary/encode.ml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,76 @@ struct
468468
| Convert (F64 F64Op.ConvertUI32) -> op 0xb8
469469
| Convert (F64 F64Op.ConvertSI64) -> op 0xb9
470470
| Convert (F64 F64Op.ConvertUI64) -> op 0xba
471+
472+
| Unary (F32 F32Op.SqrtCeil) -> op 0xfc; u32 0x80l
473+
| Binary (F32 F32Op.AddCeil) -> op 0xfc; u32 0x81l
474+
| Binary (F32 F32Op.SubCeil) -> op 0xfc; u32 0x82l
475+
| Binary (F32 F32Op.MulCeil) -> op 0xfc; u32 0x83l
476+
| Binary (F32 F32Op.DivCeil) -> op 0xfc; u32 0x84l
477+
| Unary (F64 F64Op.SqrtCeil) -> op 0xfc; u32 0x85l
478+
| Binary (F64 F64Op.AddCeil) -> op 0xfc; u32 0x86l
479+
| Binary (F64 F64Op.SubCeil) -> op 0xfc; u32 0x87l
480+
| Binary (F64 F64Op.MulCeil) -> op 0xfc; u32 0x88l
481+
| Binary (F64 F64Op.DivCeil) -> op 0xfc; u32 0x89l
482+
| Convert (F32 F32Op.ConvertCeilSI32) -> op 0xfc; u32 0x8al
483+
| Convert (F32 F32Op.ConvertCeilUI32) -> op 0xfc; u32 0x8bl
484+
| Convert (F32 F32Op.ConvertCeilSI64) -> op 0xfc; u32 0x8cl
485+
| Convert (F32 F32Op.ConvertCeilUI64) -> op 0xfc; u32 0x8dl
486+
| Convert (F32 F32Op.DemoteCeilF64) -> op 0xfc; u32 0x8el
487+
| Convert (F64 F64Op.ConvertCeilSI32) -> op 0xfc; u32 0x8fl
488+
| Convert (F64 F64Op.ConvertCeilUI32) -> op 0xfc; u32 0x90l
489+
| Convert (F64 F64Op.ConvertCeilSI64) -> op 0xfc; u32 0x91l
490+
| Convert (F64 F64Op.ConvertCeilUI64) -> op 0xfc; u32 0x92l
491+
| Convert (F64 F64Op.PromoteCeilF32) -> op 0xfc; u32 0x93l
492+
| Convert (F32 F32Op.PromoteCeilF32) -> error e.at "illegal instruction f32.promote_ceil_f32"
493+
| Convert (F64 F64Op.DemoteCeilF64) -> error e.at "illegal instruction f64.demote_ceil_f64"
494+
495+
| Unary (F32 F32Op.SqrtFloor) -> op 0xfc; u32 0x94l
496+
| Binary (F32 F32Op.AddFloor) -> op 0xfc; u32 0x95l
497+
| Binary (F32 F32Op.SubFloor) -> op 0xfc; u32 0x96l
498+
| Binary (F32 F32Op.MulFloor) -> op 0xfc; u32 0x97l
499+
| Binary (F32 F32Op.DivFloor) -> op 0xfc; u32 0x98l
500+
| Unary (F64 F64Op.SqrtFloor) -> op 0xfc; u32 0x99l
501+
| Binary (F64 F64Op.AddFloor) -> op 0xfc; u32 0x9al
502+
| Binary (F64 F64Op.SubFloor) -> op 0xfc; u32 0x9bl
503+
| Binary (F64 F64Op.MulFloor) -> op 0xfc; u32 0x9cl
504+
| Binary (F64 F64Op.DivFloor) -> op 0xfc; u32 0x9dl
505+
| Convert (F32 F32Op.ConvertFloorSI32) -> op 0xFc; u32 0x9el
506+
| Convert (F32 F32Op.ConvertFloorUI32) -> op 0xFc; u32 0x9Fl
507+
| Convert (F32 F32Op.ConvertFloorSI64) -> op 0xFc; u32 0xa0l
508+
| Convert (F32 F32Op.ConvertFloorUI64) -> op 0xFc; u32 0xa1l
509+
| Convert (F32 F32Op.DemoteFloorF64) -> op 0xFc; u32 0xa2l
510+
| Convert (F64 F64Op.ConvertFloorSI32) -> op 0xFc; u32 0xa3l
511+
| Convert (F64 F64Op.ConvertFloorUI32) -> op 0xFc; u32 0xa4l
512+
| Convert (F64 F64Op.ConvertFloorSI64) -> op 0xFc; u32 0xa5l
513+
| Convert (F64 F64Op.ConvertFloorUI64) -> op 0xFc; u32 0xa6l
514+
| Convert (F64 F64Op.PromoteFloorF32) -> op 0xFc; u32 0xa7l
515+
| Convert (F32 F32Op.PromoteFloorF32) -> error e.at "illegal instruction f32.promote_ceil_f32"
516+
| Convert (F64 F64Op.DemoteFloorF64) -> error e.at "illegal instruction f64.demote_ceil_f64"
517+
518+
| Unary (F32 F32Op.SqrtTrunc) -> op 0xfc; u32 0xa8l
519+
| Binary (F32 F32Op.AddTrunc) -> op 0xfc; u32 0xa9l
520+
| Binary (F32 F32Op.SubTrunc) -> op 0xfc; u32 0xaal
521+
| Binary (F32 F32Op.MulTrunc) -> op 0xfc; u32 0xabl
522+
| Binary (F32 F32Op.DivTrunc) -> op 0xfc; u32 0xacl
523+
| Unary (F64 F64Op.SqrtTrunc) -> op 0xfc; u32 0xadl
524+
| Binary (F64 F64Op.AddTrunc) -> op 0xfc; u32 0xael
525+
| Binary (F64 F64Op.SubTrunc) -> op 0xfc; u32 0xafl
526+
| Binary (F64 F64Op.MulTrunc) -> op 0xfc; u32 0xb0l
527+
| Binary (F64 F64Op.DivTrunc) -> op 0xfc; u32 0xb1l
528+
| Convert (F32 F32Op.ConvertTruncSI32) -> op 0xfc; u32 0xb2l
529+
| Convert (F32 F32Op.ConvertTruncUI32) -> op 0xfc; u32 0xb3l
530+
| Convert (F32 F32Op.ConvertTruncSI64) -> op 0xfc; u32 0xb4l
531+
| Convert (F32 F32Op.ConvertTruncUI64) -> op 0xfc; u32 0xb5l
532+
| Convert (F32 F32Op.DemoteTruncF64) -> op 0xfc; u32 0xb6l
533+
| Convert (F64 F64Op.ConvertTruncSI32) -> op 0xfc; u32 0xb7l
534+
| Convert (F64 F64Op.ConvertTruncUI32) -> op 0xfc; u32 0xb8l
535+
| Convert (F64 F64Op.ConvertTruncSI64) -> op 0xfc; u32 0xb9l
536+
| Convert (F64 F64Op.ConvertTruncUI64) -> op 0xfc; u32 0xbal
537+
| Convert (F64 F64Op.PromoteTruncF32) -> op 0xfc; u32 0xbbl
538+
| Convert (F32 F32Op.PromoteTruncF32) -> error e.at "illegal instruction f32.promote_trunc_f32"
539+
| Convert (F64 F64Op.DemoteTruncF64) -> error e.at "illegal instruction f64.demote_trunc_f64"
540+
471541
| Convert (F64 F64Op.PromoteF32) -> op 0xbb
472542
| Convert (F64 F64Op.DemoteF64) ->
473543
error e.at "illegal instruction f64.demote_f64"

interpreter/dune

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
(library
44
(public_name wasm)
5+
(libraries mopsa.mopsa_utils)
56
; The 'wasm' module shall not be part of the library, as it would start the
67
; Wasm REPL every time in all the dependencies.
78
; We exclude the 'wast' module as it is only used for the JS build.

0 commit comments

Comments
 (0)