Skip to content

Commit 2f1d16a

Browse files
vouillonhhugo
authored andcommitted
Bigarrays: do not read/write floats as integers
This makes the WASI implementation simpler
1 parent ec88ac1 commit 2f1d16a

File tree

1 file changed

+108
-56
lines changed

1 file changed

+108
-56
lines changed

runtime/wasm/bigarray.wat

Lines changed: 108 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -456,36 +456,63 @@
456456
(block $int8
457457
(block $int16
458458
(block $int32
459-
(block $complex32
460-
(block $int
461-
(block $int64
462-
(block $complex64
463-
(br_table $int32 $int64 $int8 $int8 $int16 $int16
464-
$int32 $int64 $int $int
465-
$complex32 $complex64 $int8 $int16
466-
(struct.get $bigarray $ba_kind (local.get $b))))
467-
;; complex64
459+
(block $int
460+
(block $int64
461+
(block $float32
462+
(block $complex32
463+
(block $float64
464+
(block $complex64
465+
(br_table $float32 $float64 $int8 $int8 $int16 $int16
466+
$int32 $int64 $int $int
467+
$complex32 $complex64 $int8 $int16
468+
(struct.get $bigarray $ba_kind (local.get $b))))
469+
;; complex64
470+
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
471+
;; fallthrough
472+
;; float64
473+
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
474+
(loop $loop
475+
(if (i32.lt_u (local.get $i) (local.get $len))
476+
(then
477+
(call $caml_serialize_int_8 (local.get $s)
478+
(i64.reinterpret_f64
479+
(call $dv_get_f64 (local.get $view)
480+
(local.get $i)
481+
(global.get $littleEndian))))
482+
(local.set $i (i32.add (local.get $i) (i32.const 8)))
483+
(br $loop))))
484+
(br $done))
485+
;; complex32
468486
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
469487
;; fallthrough
470-
;; int64 / float64
471-
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
488+
;; float32
489+
(local.set $len (i32.shl (local.get $len) (i32.const 2)))
472490
(loop $loop
473491
(if (i32.lt_u (local.get $i) (local.get $len))
474492
(then
475-
(call $caml_serialize_int_8 (local.get $s)
476-
(call $dv_get_i64 (local.get $view)
477-
(local.get $i)
478-
(global.get $littleEndian)))
479-
(local.set $i (i32.add (local.get $i) (i32.const 8)))
493+
(call $caml_serialize_int_4 (local.get $s)
494+
(i32.reinterpret_f32
495+
(call $dv_get_f32 (local.get $view) (local.get $i)
496+
(global.get $littleEndian))))
497+
(local.set $i (i32.add (local.get $i) (i32.const 4)))
480498
(br $loop))))
481499
(br $done))
482-
;; int
483-
(call $caml_serialize_int_1 (local.get $s) (i32.const 0))
484-
(br $int32))
485-
;; complex32
486-
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
500+
;; int64
501+
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
502+
(loop $loop
503+
(if (i32.lt_u (local.get $i) (local.get $len))
504+
(then
505+
(call $caml_serialize_int_8 (local.get $s)
506+
(call $dv_get_i64 (local.get $view)
507+
(local.get $i)
508+
(global.get $littleEndian)))
509+
(local.set $i (i32.add (local.get $i) (i32.const 8)))
510+
(br $loop))))
511+
(br $done))
512+
;; int
513+
(call $caml_serialize_int_1 (local.get $s) (i32.const 0)))
487514
;; fallthrough
488-
;; int32 / float32
515+
;; int32
489516
(local.set $len (i32.shl (local.get $len) (i32.const 2)))
490517
(loop $loop
491518
(if (i32.lt_u (local.get $i) (local.get $len))
@@ -496,26 +523,25 @@
496523
(local.set $i (i32.add (local.get $i) (i32.const 4)))
497524
(br $loop))))
498525
(br $done))
499-
;; int16 / uint16 / float16
500-
(local.set $len (i32.shl (local.get $len) (i32.const 1)))
501-
(loop $loop
502-
(if (i32.lt_u (local.get $i) (local.get $len))
503-
(then
504-
(call $caml_serialize_int_2 (local.get $s)
505-
(call $dv_get_i16 (local.get $view) (local.get $i)
506-
(global.get $littleEndian)))
507-
(local.set $i (i32.add (local.get $i) (i32.const 2)))
508-
(br $loop))))
509-
(br $done))
526+
;; int16 / uint16 / float16
527+
(local.set $len (i32.shl (local.get $len) (i32.const 1)))
528+
(loop $loop
529+
(if (i32.lt_u (local.get $i) (local.get $len))
530+
(then
531+
(call $caml_serialize_int_2 (local.get $s)
532+
(call $dv_get_i16 (local.get $view) (local.get $i)
533+
(global.get $littleEndian)))
534+
(local.set $i (i32.add (local.get $i) (i32.const 2)))
535+
(br $loop))))
536+
(br $done))
510537
;; int8 / uint8
511538
(loop $loop
512539
(if (i32.lt_u (local.get $i) (local.get $len))
513540
(then
514541
(call $caml_serialize_int_1 (local.get $s)
515542
(call $dv_get_i8 (local.get $view) (local.get $i)))
516543
(local.set $i (i32.add (local.get $i) (i32.const 1)))
517-
(br $loop))))
518-
(br $done))
544+
(br $loop)))))
519545
(tuple.make 2
520546
(i32.mul (i32.add (i32.const 4) (local.get $num_dims)) (i32.const 4))
521547
(i32.mul (i32.add (i32.const 4) (local.get $num_dims)) (i32.const 8))))
@@ -569,36 +595,62 @@
569595
(block $int8
570596
(block $int16
571597
(block $int32
572-
(block $complex32
573-
(block $int
574-
(block $int64
575-
(block $complex64
576-
(br_table $int32 $int64 $int8 $int8 $int16 $int16
577-
$int32 $int64 $int $int
578-
$complex32 $complex64 $int8 $int16
579-
(struct.get $bigarray $ba_kind (local.get $b))))
580-
;; complex64
598+
(block $int
599+
(block $int64
600+
(block $float32
601+
(block $complex32
602+
(block $float64
603+
(block $complex64
604+
(br_table $float32 $float64 $int8 $int8 $int16 $int16
605+
$int32 $int64 $int $int
606+
$complex32 $complex64 $int8 $int16
607+
(struct.get $bigarray $ba_kind (local.get $b))))
608+
;; complex64
609+
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
610+
;; fallthrough
611+
;; float64
612+
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
613+
(loop $loop
614+
(if (i32.lt_u (local.get $i) (local.get $len))
615+
(then
616+
(call $dv_set_f64 (local.get $view) (local.get $i)
617+
(f64.reinterpret_i64
618+
(call $caml_deserialize_int_8 (local.get $s)))
619+
(global.get $littleEndian))
620+
(local.set $i (i32.add (local.get $i) (i32.const 8)))
621+
(br $loop))))
622+
(br $done))
623+
;; complex32
581624
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
582625
;; fallthrough
583-
;; int64
584-
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
626+
;; float32
627+
(local.set $len (i32.shl (local.get $len) (i32.const 2)))
585628
(loop $loop
586629
(if (i32.lt_u (local.get $i) (local.get $len))
587630
(then
588-
(call $dv_set_i64 (local.get $view) (local.get $i)
589-
(call $caml_deserialize_int_8 (local.get $s))
631+
(call $dv_set_f32 (local.get $view) (local.get $i)
632+
(f32.reinterpret_i32
633+
(call $caml_deserialize_int_4 (local.get $s)))
590634
(global.get $littleEndian))
591-
(local.set $i (i32.add (local.get $i) (i32.const 8)))
635+
(local.set $i (i32.add (local.get $i) (i32.const 4)))
592636
(br $loop))))
593637
(br $done))
594-
;; int
595-
(if (call $caml_deserialize_uint_1 (local.get $s))
596-
(then (call $caml_failwith (global.get $intern_overflow))))
597-
(br $int32))
598-
;; complex32
599-
(local.set $len (i32.shl (local.get $len) (i32.const 1))))
638+
;; int64
639+
(local.set $len (i32.shl (local.get $len) (i32.const 3)))
640+
(loop $loop
641+
(if (i32.lt_u (local.get $i) (local.get $len))
642+
(then
643+
(call $dv_set_i64 (local.get $view) (local.get $i)
644+
(call $caml_deserialize_int_8 (local.get $s))
645+
(global.get $littleEndian))
646+
(local.set $i (i32.add (local.get $i) (i32.const 8)))
647+
(br $loop))))
648+
(br $done))
649+
;; int
650+
(if (call $caml_deserialize_uint_1 (local.get $s))
651+
(then (call $caml_failwith (global.get $intern_overflow)))))
600652
;; fallthrough
601-
;; int32 / float32
653+
;; int32
602654
(local.set $len (i32.shl (local.get $len) (i32.const 2)))
603655
(loop $loop
604656
(if (i32.lt_u (local.get $i) (local.get $len))

0 commit comments

Comments
 (0)