From 9eefa2006eccdf942c01fc1421784edea78c5591 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 4 Jun 2025 22:00:02 +0200 Subject: [PATCH] encoding/cbor: support simd vectors --- core/encoding/cbor/marshal.odin | 18 ++++++++++++++++++ core/encoding/cbor/unmarshal.odin | 12 ++++++++++++ tests/core/encoding/cbor/test_core_cbor.odin | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index ec597c8a9..b23087c90 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -630,6 +630,24 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er _marshal_into_encoder(e, any{rawptr(data), info.elem.id}, elem_ti) or_return } return + + case runtime.Type_Info_Simd_Vector: + err_conv(_encode_u64(e, u64(info.count), .Array)) or_return + + if impl, ok := _tag_implementations_type[info.elem.id]; ok { + for i in 0..marshal(e, any{rawptr(data), info.elem.id}) or_return + } + return + } + + elem_ti := runtime.type_info_core(type_info_of(info.elem.id)) + for i in 0.. t.count { + return _unsupported(v, hdr) + } + + da := mem.Raw_Dynamic_Array{rawptr(v.data), 0, length, allocator } + + out_of_space := assign_array(d, &da, t.elem, length, growable=false) or_return + if out_of_space { return _unsupported(v, hdr) } + return + case: return _unsupported(v, hdr) } } diff --git a/tests/core/encoding/cbor/test_core_cbor.odin b/tests/core/encoding/cbor/test_core_cbor.odin index a76d690be..7bea69d2e 100644 --- a/tests/core/encoding/cbor/test_core_cbor.odin +++ b/tests/core/encoding/cbor/test_core_cbor.odin @@ -44,6 +44,7 @@ Foo :: struct { smallest: big.Int, ignore_this: ^Foo `cbor:"-"`, mat: matrix[4, 4]f32, + vec: #simd [4]f64, } FooBar :: enum { @@ -97,6 +98,7 @@ test_marshalling :: proc(t: ^testing.T) { small_onetwenty = -i128(max(u64)), ignore_this = &Foo{}, mat = 1, + vec = 2, } big.atoi(&f.biggest, "1234567891011121314151617181920") @@ -145,6 +147,12 @@ test_marshalling :: proc(t: ^testing.T) { "now": 1(1701117968), "pos": 1212, "str": "Hellope", + "vec": [ + 2.0000, + 2.0000, + 2.0000, + 2.0000 + ], "yes": true, "comp": [ 32.0000,