Implement scatter-gather float
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 5 Nov 2022 01:18:50 +0000 (21:18 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 5 Nov 2022 01:18:50 +0000 (21:18 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/trace.h
src/test.c
src/tracer.c

index 8600a360d27c245d7aaabe9a3f177be0691a548e..5b755680c6a00d6a833084b213c1ece009d1a6c9 100644 (file)
@@ -93,6 +93,7 @@ enum side_type_label {
        /* Scatter-gather types */
        SIDE_TYPE_SG_UNSIGNED_INT,
        SIDE_TYPE_SG_SIGNED_INT,
+       SIDE_TYPE_SG_FLOAT,
        SIDE_TYPE_SG_STRUCT,
 
        /* Dynamic types */
@@ -313,6 +314,7 @@ struct side_type_sg {
                        struct side_type_integer type;
                        uint16_t offset_bits;           /* bits */
                } SIDE_PACKED side_integer;
+               struct side_type_float side_float;
                const struct side_type_struct *side_struct;
        } SIDE_PACKED u;
 } SIDE_PACKED;
@@ -407,6 +409,7 @@ struct side_arg_static {
 
        /* Scatter-gather */
        void *side_integer_sg_ptr;
+       void *side_float_sg_ptr;
        void *side_struct_sg_ptr;
 } SIDE_PACKED;
 
@@ -824,11 +827,67 @@ struct side_tracer_dynamic_vla_visitor_ctx {
        _side_type_sg_integer(SIDE_TYPE_SG_SIGNED_INT, true, SIDE_TYPE_BYTE_ORDER_HOST, \
                        _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
 
+#define side_type_sg_unsigned_integer_le(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_type_sg_integer(SIDE_TYPE_SG_UNSIGNED_INT, false,  SIDE_TYPE_BYTE_ORDER_LE, \
+                       _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
+#define side_type_sg_signed_integer_le(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_type_sg_integer(SIDE_TYPE_SG_SIGNED_INT, true, SIDE_TYPE_BYTE_ORDER_LE, \
+                       _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
+
+#define side_type_sg_unsigned_integer_be(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_type_sg_integer(SIDE_TYPE_SG_UNSIGNED_INT, false,  SIDE_TYPE_BYTE_ORDER_BE, \
+                       _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
+#define side_type_sg_signed_integer_be(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_type_sg_integer(SIDE_TYPE_SG_SIGNED_INT, true, SIDE_TYPE_BYTE_ORDER_BE, \
+                       _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
+
 #define side_field_sg_unsigned_integer(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
        _side_field(_name, side_type_sg_unsigned_integer(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
 #define side_field_sg_signed_integer(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
        _side_field(_name, side_type_sg_signed_integer(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
 
+#define side_field_sg_unsigned_integer_le(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_field(_name, side_type_sg_unsigned_integer_le(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
+#define side_field_sg_signed_integer_le(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_field(_name, side_type_sg_signed_integer_le(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
+
+#define side_field_sg_unsigned_integer_be(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_field(_name, side_type_sg_unsigned_integer_be(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
+#define side_field_sg_signed_integer_be(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+       _side_field(_name, side_type_sg_signed_integer_be(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr)))
+
+#define _side_type_sg_float(_byte_order, _offset, _float_size_bits, _attr) \
+       { \
+               .type = SIDE_TYPE_SG_FLOAT, \
+               .u = { \
+                       .side_sg = { \
+                               .offset = _offset, \
+                               .u = { \
+                                       .side_float = { \
+                                               .attr = _attr, \
+                                               .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
+                                               .float_size_bits = _float_size_bits, \
+                                               .byte_order = _byte_order, \
+                                       }, \
+                               }, \
+                       }, \
+               }, \
+       }
+
+#define side_type_sg_float(_offset, _float_size_bits, _attr) \
+       _side_type_sg_float(SIDE_TYPE_FLOAT_WORD_ORDER_HOST, _offset, _float_size_bits, _attr)
+#define side_type_sg_float_le(_offset, _float_size_bits, _attr) \
+       _side_type_sg_float(SIDE_TYPE_BYTE_ORDER_LE, _offset, _float_size_bits, _attr)
+#define side_type_sg_float_be(_offset, _float_size_bits, _attr) \
+       _side_type_sg_float(SIDE_TYPE_BYTE_ORDER_BE, _offset, _float_size_bits, _attr)
+
+#define side_field_sg_float(_name, _offset, _float_size_bits, _attr) \
+       _side_field(_name, side_type_sg_float(_offset, _float_size_bits, _attr))
+#define side_field_sg_float_le(_name, _offset, _float_size_bits, _attr) \
+       _side_field(_name, side_type_sg_float_le(_offset, _float_size_bits, _attr))
+#define side_field_sg_float_be(_name, _offset, _float_size_bits, _attr) \
+       _side_field(_name, side_type_sg_float_be(_offset, _float_size_bits, _attr))
+
 #define side_type_struct_sg(_struct_sg, _offset) \
        { \
                .type = SIDE_TYPE_SG_STRUCT, \
index b51bff921861ee983e9cac5fcc6c853ef5ba4857..3940f33a7177612b648e59c8fd8e2ca8ae89792c 100644 (file)
@@ -1619,6 +1619,77 @@ void test_struct_sg_nest(void)
        }
 }
 
+struct testfloat {
+#if __HAVE_FLOAT16
+       _Float16 f16;
+#endif
+#if __HAVE_FLOAT32
+       _Float32 f32;
+#endif
+#if __HAVE_FLOAT64
+       _Float64 f64;
+#endif
+#if __HAVE_FLOAT128
+       _Float128 f128;
+#endif
+};
+
+static side_define_struct(mystructsgfloat,
+       side_field_list(
+#if __HAVE_FLOAT16
+               side_field_sg_float("f16", offsetof(struct testfloat, f16), 16,
+                       side_attr_list()),
+#endif
+#if __HAVE_FLOAT32
+               side_field_sg_float("f32", offsetof(struct testfloat, f32), 32,
+                       side_attr_list()),
+#endif
+#if __HAVE_FLOAT64
+               side_field_sg_float("f64", offsetof(struct testfloat, f64), 64,
+                       side_attr_list()),
+#endif
+#if __HAVE_FLOAT128
+               side_field_sg_float("f128", offsetof(struct testfloat, f128), 128,
+                       side_attr_list()),
+#endif
+       ),
+       side_attr_list()
+);
+
+side_static_event(my_provider_event_structsgfloat,
+       "myprovider", "myeventstructsgfloat", SIDE_LOGLEVEL_DEBUG,
+       side_field_list(
+               side_field_struct_sg("structsgfloat", &mystructsgfloat, 0),
+       ),
+       side_attr_list()
+);
+
+static
+void test_struct_sg_float(void)
+{
+       side_event_cond(my_provider_event_structsgfloat) {
+               struct testfloat mystruct = {
+#if __HAVE_FLOAT16
+                       .f16 = 1.1,
+#endif
+#if __HAVE_FLOAT32
+                       .f32 = 2.2,
+#endif
+#if __HAVE_FLOAT64
+                       .f64 = 3.3,
+#endif
+#if __HAVE_FLOAT128
+                       .f128 = 4.4,
+#endif
+               };
+               side_event_call(my_provider_event_structsgfloat,
+                       side_arg_list(
+                               side_arg_struct_sg(&mystruct),
+                       )
+               );
+       }
+}
+
 int main()
 {
        test_fields();
@@ -1661,5 +1732,6 @@ int main()
        test_base();
        test_struct_sg();
        test_struct_sg_nest();
+       test_struct_sg_float();
        return 0;
 }
index 722f36c49c653f584bd2cc5f5b5715047c87efc8..42d1edd6ba1b795f190ed9daebb8800e7a605640 100644 (file)
@@ -28,6 +28,8 @@ void tracer_print_sg_struct(const struct side_type_sg *type_sg, const void *_ptr
 static
 void tracer_print_sg_integer_type(const struct side_type_sg *type_sg, const void *_ptr);
 static
+void tracer_print_sg_float_type(const struct side_type_sg *type_sg, const void *_ptr);
+static
 void tracer_print_array(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec);
 static
 void tracer_print_vla(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec);
@@ -907,6 +909,9 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        case SIDE_TYPE_SG_SIGNED_INT:
                tracer_print_sg_integer_type(&type_desc->u.side_sg, item->u.side_static.side_integer_sg_ptr);
                break;
+       case SIDE_TYPE_SG_FLOAT:
+               tracer_print_sg_float_type(&type_desc->u.side_sg, item->u.side_static.side_float_sg_ptr);
+               break;
        case SIDE_TYPE_ARRAY:
                tracer_print_array(type_desc, item->u.side_static.side_array);
                break;
@@ -1023,6 +1028,25 @@ void tracer_print_sg_integer_type(const struct side_type_sg *type_sg, const void
                        type_sg->u.side_integer.offset_bits, TRACER_DISPLAY_BASE_10);
 }
 
+static
+void tracer_print_sg_float_type(const struct side_type_sg *type_sg, const void *_ptr)
+{
+       const char *ptr = (const char *) _ptr;
+       union side_float_value value;
+
+       switch (type_sg->u.side_float.float_size_bits) {
+       case 16:
+       case 32:
+       case 64:
+       case 128:
+               break;
+       default:
+               abort();
+       }
+       memcpy(&value, ptr + type_sg->offset, type_sg->u.side_float.float_size_bits >> 3);
+       tracer_print_type_float(":", &type_sg->u.side_float, &value);
+}
+
 static
 void tracer_print_sg_type(const struct side_type *type_desc, void *ptr)
 {
@@ -1032,6 +1056,9 @@ void tracer_print_sg_type(const struct side_type *type_desc, void *ptr)
        case SIDE_TYPE_SG_SIGNED_INT:
                tracer_print_sg_integer_type(&type_desc->u.side_sg, ptr);
                break;
+       case SIDE_TYPE_SG_FLOAT:
+               tracer_print_sg_float_type(&type_desc->u.side_sg, ptr);
+               break;
        case SIDE_TYPE_SG_STRUCT:
                tracer_print_sg_struct(&type_desc->u.side_sg, ptr);
                break;
This page took 0.028556 seconds and 4 git commands to generate.