+struct bifrost_fma_icmp16 {
+ unsigned src0 : 3;
+ unsigned src1 : 3;
+ unsigned unk : 5; /* 11010 */
+ enum bifrost_icmp_cond cond : 3;
+ unsigned op : 9;
+} __attribute__((packed));
+
+#define BIFROST_ADD_OP_ICMP_32 (0x0f600 >> 8)
+#define BIFROST_ADD_OP_ICMP_16 (0x0f000 >> 11)
+
+struct bifrost_add_icmp {
+ unsigned src0 : 3;
+ unsigned src1 : 3;
+ enum bifrost_icmp_cond cond : 3;
+ unsigned sz : 1; /* 1 for 32, 0 for 8 */
+ unsigned d3d : 1; /* if set, true is ~0. otherwise, true is 1 */
+ unsigned op : 9;
+} __attribute__((packed));
+
+struct bifrost_add_icmp16 {
+ unsigned src0 : 3;
+ unsigned src1 : 3;
+ unsigned src0_swizzle : 2;
+ unsigned src1_swizzle : 2;
+ unsigned d3d : 1; /* if set, true is ~0. otherwise, true is 1 */
+ enum bifrost_icmp_cond cond : 3;
+ unsigned op : 6;
+} __attribute__((packed));
+
+/* Two sources for vectorization */
+#define BIFROST_FMA_FLOAT32_TO_16 (0xdd000 >> 3)
+#define BIFROST_ADD_FLOAT32_TO_16 (0x0EC00 >> 3)
+
+enum bifrost_convert_mode {
+ BIFROST_CONV_UNK0 = 0,
+ BIFROST_CONV_F32_TO_I32 = 1,
+ BIFROST_CONV_F16_TO_I16 = 2,
+ BIFROST_CONV_I32_TO_F32 = 3,
+ BIFROST_CONV_I16_TO_X32 = 4,
+ BIFROST_CONV_F16_TO_F32 = 5,
+ BIFROST_CONV_I16_TO_F16 = 6,
+ BIFROST_CONV_UNK7 = 7
+};
+
+/* i16 to x32 */
+#define BIFROST_CONVERT_4(is_unsigned, component, to_float) \
+ ((is_unsigned & 1) | ((component & 1) << 1) | ((to_float & 1) << 2) | \
+ ((0x3) << 3) | ((4) << 5) | 0x100)
+
+/* f16 to f32 */
+#define BIFROST_CONVERT_5(component) \
+ ((component & 1) | ((1) << 1) | ((5) << 5) | 0x100)
+
+/* Other conversions */
+#define BIFROST_CONVERT(is_unsigned, roundmode, swizzle, mode) \
+ ((is_unsigned & 1) | ((roundmode & 3) << 1) | ((swizzle & 3) << 3) | ((mode & 7) << 5))
+
+#define BIFROST_FMA_CONVERT (0xe0000)
+#define BIFROST_ADD_CONVERT (0x07800)
+