/* Scatter-gather types */
SIDE_TYPE_SG_UNSIGNED_INT,
SIDE_TYPE_SG_SIGNED_INT,
+ SIDE_TYPE_SG_FLOAT,
SIDE_TYPE_SG_STRUCT,
/* Dynamic types */
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;
/* Scatter-gather */
void *side_integer_sg_ptr;
+ void *side_float_sg_ptr;
void *side_struct_sg_ptr;
} SIDE_PACKED;
_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, \
}
}
+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();
test_base();
test_struct_sg();
test_struct_sg_nest();
+ test_struct_sg_float();
return 0;
}
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);
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;
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)
{
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;