class ("b", "f", etc.) and a numerical bit count. */
/* _b8 _b16 _b32 _b64. */
-#define TYPES_all_pred(S, D) \
+#define TYPES_all_pred(S, D, T) \
S (b8), S (b16), S (b32), S (b64)
/* _c8 _c16 _c32 _c64. */
-#define TYPES_all_count(S, D) \
+#define TYPES_all_count(S, D, T) \
S (c8), S (c16), S (c32), S (c64)
/* _b8 _b16 _b32 _b64
_c8 _c16 _c32 _c64. */
-#define TYPES_all_pred_count(S, D) \
- TYPES_all_pred (S, D), \
- TYPES_all_count (S, D)
+#define TYPES_all_pred_count(S, D, T) \
+ TYPES_all_pred (S, D, T), \
+ TYPES_all_count (S, D, T)
/* _f16 _f32 _f64. */
-#define TYPES_all_float(S, D) \
+#define TYPES_all_float(S, D, T) \
S (f16), S (f32), S (f64)
/* _s8 _s16 _s32 _s64. */
-#define TYPES_all_signed(S, D) \
+#define TYPES_all_signed(S, D, T) \
S (s8), S (s16), S (s32), S (s64)
/* _f16 _f32 _f64
_s8 _s16 _s32 _s64. */
-#define TYPES_all_float_and_signed(S, D) \
- TYPES_all_float (S, D), TYPES_all_signed (S, D)
+#define TYPES_all_float_and_signed(S, D, T) \
+ TYPES_all_float (S, D, T), TYPES_all_signed (S, D, T)
/* _u8 _u16 _u32 _u64. */
-#define TYPES_all_unsigned(S, D) \
+#define TYPES_all_unsigned(S, D, T) \
S (u8), S (u16), S (u32), S (u64)
/* _s8 _s16 _s32 _s64
_u8 _u16 _u32 _u64. */
-#define TYPES_all_integer(S, D) \
- TYPES_all_signed (S, D), TYPES_all_unsigned (S, D)
+#define TYPES_all_integer(S, D, T) \
+ TYPES_all_signed (S, D, T), TYPES_all_unsigned (S, D, T)
/* _f16 _f32 _f64
_s8 _s16 _s32 _s64
_u8 _u16 _u32 _u64. */
-#define TYPES_all_arith(S, D) \
- TYPES_all_float (S, D), TYPES_all_integer (S, D)
+#define TYPES_all_arith(S, D, T) \
+ TYPES_all_float (S, D, T), TYPES_all_integer (S, D, T)
-#define TYPES_all_data(S, D) \
- TYPES_b_data (S, D), \
- TYPES_h_data (S, D), \
- TYPES_s_data (S, D), \
- TYPES_d_data (S, D)
+#define TYPES_all_data(S, D, T) \
+ TYPES_b_data (S, D, T), \
+ TYPES_h_data (S, D, T), \
+ TYPES_s_data (S, D, T), \
+ TYPES_d_data (S, D, T)
/* _b only. */
-#define TYPES_b(S, D) \
+#define TYPES_b(S, D, T) \
S (b)
/* _c only. */
-#define TYPES_c(S, D) \
+#define TYPES_c(S, D, T) \
S (c)
/* _u8. */
-#define TYPES_b_unsigned(S, D) \
+#define TYPES_b_unsigned(S, D, T) \
S (u8)
/* _s8
_u8. */
-#define TYPES_b_integer(S, D) \
- S (s8), TYPES_b_unsigned (S, D)
+#define TYPES_b_integer(S, D, T) \
+ S (s8), TYPES_b_unsigned (S, D, T)
/* _mf8
_s8
_u8. */
-#define TYPES_b_data(S, D) \
- S (mf8), TYPES_b_integer (S, D)
+#define TYPES_b_data(S, D, T) \
+ S (mf8), TYPES_b_integer (S, D, T)
/* _s8 _s16
_u8 _u16. */
-#define TYPES_bh_integer(S, D) \
+#define TYPES_bh_integer(S, D, T) \
S (s8), S (s16), S (u8), S (u16)
/* _u8 _u32. */
-#define TYPES_bs_unsigned(S, D) \
+#define TYPES_bs_unsigned(S, D, T) \
S (u8), S (u32)
/* _s8 _s16 _s32. */
-#define TYPES_bhs_signed(S, D) \
+#define TYPES_bhs_signed(S, D, T) \
S (s8), S (s16), S (s32)
/* _u8 _u16 _u32. */
-#define TYPES_bhs_unsigned(S, D) \
+#define TYPES_bhs_unsigned(S, D, T) \
S (u8), S (u16), S (u32)
/* _s8 _s16 _s32
_u8 _u16 _u32. */
-#define TYPES_bhs_integer(S, D) \
- TYPES_bhs_signed (S, D), TYPES_bhs_unsigned (S, D)
+#define TYPES_bhs_integer(S, D, T) \
+ TYPES_bhs_signed (S, D, T), TYPES_bhs_unsigned (S, D, T)
-#define TYPES_bh_data(S, D) \
- TYPES_b_data (S, D), \
- TYPES_h_data (S, D)
+#define TYPES_bh_data(S, D, T) \
+ TYPES_b_data (S, D, T), \
+ TYPES_h_data (S, D, T)
-#define TYPES_bhs_data(S, D) \
- TYPES_b_data (S, D), \
- TYPES_h_data (S, D), \
- TYPES_s_data (S, D)
+#define TYPES_bhs_data(S, D, T) \
+ TYPES_b_data (S, D, T), \
+ TYPES_h_data (S, D, T), \
+ TYPES_s_data (S, D, T)
/* _s16_s8 _s32_s16 _s64_s32
_u16_u8 _u32_u16 _u64_u32. */
-#define TYPES_bhs_widen(S, D) \
+#define TYPES_bhs_widen(S, D, T) \
D (s16, s8), D (s32, s16), D (s64, s32), \
D (u16, u8), D (u32, u16), D (u64, u32)
/* _bf16. */
-#define TYPES_h_bfloat(S, D) \
+#define TYPES_h_bfloat(S, D, T) \
S (bf16)
/* _f16. */
-#define TYPES_h_float(S, D) \
+#define TYPES_h_float(S, D, T) \
S (f16)
/* _s16
_u16. */
-#define TYPES_h_integer(S, D) \
+#define TYPES_h_integer(S, D, T) \
S (s16), S (u16)
/* _bf16
_f16
_s16
_u16. */
-#define TYPES_h_data(S, D) \
- S (bf16), S (f16), TYPES_h_integer (S, D)
+#define TYPES_h_data(S, D, T) \
+ S (bf16), S (f16), TYPES_h_integer (S, D, T)
/* _s16 _s32. */
-#define TYPES_hs_signed(S, D) \
+#define TYPES_hs_signed(S, D, T) \
S (s16), S (s32)
/* _s16 _s32
_u16 _u32. */
-#define TYPES_hs_integer(S, D) \
- TYPES_hs_signed (S, D), S (u16), S (u32)
+#define TYPES_hs_integer(S, D, T) \
+ TYPES_hs_signed (S, D, T), S (u16), S (u32)
/* _f16 _f32. */
-#define TYPES_hs_float(S, D) \
+#define TYPES_hs_float(S, D, T) \
S (f16), S (f32)
-#define TYPES_hs_data(S, D) \
- TYPES_h_data (S, D), \
- TYPES_s_data (S, D)
+#define TYPES_hs_data(S, D, T) \
+ TYPES_h_data (S, D, T), \
+ TYPES_s_data (S, D, T)
/* _u16 _u64. */
-#define TYPES_hd_unsigned(S, D) \
+#define TYPES_hd_unsigned(S, D, T) \
S (u16), S (u64)
/* _s16 _s32 _s64. */
-#define TYPES_hsd_signed(S, D) \
+#define TYPES_hsd_signed(S, D, T) \
S (s16), S (s32), S (s64)
/* _s16 _s32 _s64
_u16 _u32 _u64. */
-#define TYPES_hsd_integer(S, D) \
- TYPES_hsd_signed (S, D), S (u16), S (u32), S (u64)
+#define TYPES_hsd_integer(S, D, T) \
+ TYPES_hsd_signed (S, D, T), S (u16), S (u32), S (u64)
-#define TYPES_hsd_data(S, D) \
- TYPES_h_data (S, D), \
- TYPES_s_data (S, D), \
- TYPES_d_data (S, D)
+#define TYPES_hsd_data(S, D, T) \
+ TYPES_h_data (S, D, T), \
+ TYPES_s_data (S, D, T), \
+ TYPES_d_data (S, D, T)
/* _f16_mf8. */
-#define TYPES_h_float_mf8(S, D) \
+#define TYPES_h_float_mf8(S, D, T) \
D (f16, mf8)
/* _f32. */
-#define TYPES_s_float(S, D) \
+#define TYPES_s_float(S, D, T) \
S (f32)
/* _f32_mf8. */
-#define TYPES_s_float_mf8(S, D) \
+#define TYPES_s_float_mf8(S, D, T) \
D (f32, mf8)
/* _f32
_s16 _s32 _s64
_u16 _u32 _u64. */
-#define TYPES_s_float_hsd_integer(S, D) \
- TYPES_s_float (S, D), TYPES_hsd_integer (S, D)
+#define TYPES_s_float_hsd_integer(S, D, T) \
+ TYPES_s_float (S, D, T), TYPES_hsd_integer (S, D, T)
/* _f32
_s32 _s64
_u32 _u64. */
-#define TYPES_s_float_sd_integer(S, D) \
- TYPES_s_float (S, D), TYPES_sd_integer (S, D)
+#define TYPES_s_float_sd_integer(S, D, T) \
+ TYPES_s_float (S, D, T), TYPES_sd_integer (S, D, T)
/* _s32. */
-#define TYPES_s_signed(S, D) \
+#define TYPES_s_signed(S, D, T) \
S (s32)
/* _u32. */
-#define TYPES_s_unsigned(S, D) \
+#define TYPES_s_unsigned(S, D, T) \
S (u32)
/* _s32
_u32. */
-#define TYPES_s_integer(S, D) \
- TYPES_s_signed (S, D), TYPES_s_unsigned (S, D)
+#define TYPES_s_integer(S, D, T) \
+ TYPES_s_signed (S, D, T), TYPES_s_unsigned (S, D, T)
/* _f32
_s32
_u32. */
-#define TYPES_s_data(S, D) \
- TYPES_s_float (S, D), TYPES_s_integer (S, D)
+#define TYPES_s_data(S, D, T) \
+ TYPES_s_float (S, D, T), TYPES_s_integer (S, D, T)
/* _s32 _s64. */
-#define TYPES_sd_signed(S, D) \
+#define TYPES_sd_signed(S, D, T) \
S (s32), S (s64)
/* _u32 _u64. */
-#define TYPES_sd_unsigned(S, D) \
+#define TYPES_sd_unsigned(S, D, T) \
S (u32), S (u64)
/* _s32 _s64
_u32 _u64. */
-#define TYPES_sd_integer(S, D) \
- TYPES_sd_signed (S, D), TYPES_sd_unsigned (S, D)
+#define TYPES_sd_integer(S, D, T) \
+ TYPES_sd_signed (S, D, T), TYPES_sd_unsigned (S, D, T)
-#define TYPES_sd_data(S, D) \
- TYPES_s_data (S, D), \
- TYPES_d_data (S, D)
+#define TYPES_sd_data(S, D, T) \
+ TYPES_s_data (S, D, T), \
+ TYPES_d_data (S, D, T)
/* _f16 _f32 _f64
_s32 _s64
_u32 _u64. */
-#define TYPES_all_float_and_sd_integer(S, D) \
- TYPES_all_float (S, D), TYPES_sd_integer (S, D)
+#define TYPES_all_float_and_sd_integer(S, D, T) \
+ TYPES_all_float (S, D, T), TYPES_sd_integer (S, D, T)
/* _f64. */
-#define TYPES_d_float(S, D) \
+#define TYPES_d_float(S, D, T) \
S (f64)
/* _u64. */
-#define TYPES_d_unsigned(S, D) \
+#define TYPES_d_unsigned(S, D, T) \
S (u64)
/* _s64
_u64. */
-#define TYPES_d_integer(S, D) \
- S (s64), TYPES_d_unsigned (S, D)
+#define TYPES_d_integer(S, D, T) \
+ S (s64), TYPES_d_unsigned (S, D, T)
/* _f64
_s64
_u64. */
-#define TYPES_d_data(S, D) \
- TYPES_d_float (S, D), TYPES_d_integer (S, D)
+#define TYPES_d_data(S, D, T) \
+ TYPES_d_float (S, D, T), TYPES_d_integer (S, D, T)
/* All the type combinations allowed by svcvt. */
-#define TYPES_cvt(S, D) \
+#define TYPES_cvt(S, D, T) \
D (f16, f32), D (f16, f64), \
D (f16, s16), D (f16, s32), D (f16, s64), \
D (f16, u16), D (f16, u32), D (f16, u64), \
D (u64, f16), D (u64, f32), D (u64, f64)
/* _bf16_f32. */
-#define TYPES_cvt_bfloat(S, D) \
+#define TYPES_cvt_bfloat(S, D, T) \
D (bf16, f32)
/* { _bf16 _f16 } x _f32. */
-#define TYPES_cvt_h_s_float(S, D) \
+#define TYPES_cvt_h_s_float(S, D, T) \
D (bf16, f32), D (f16, f32)
/* _f32_f16. */
-#define TYPES_cvt_f32_f16(S, D) \
+#define TYPES_cvt_f32_f16(S, D, T) \
D (f32, f16)
/* _f32_f16
_f64_f32. */
-#define TYPES_cvt_long(S, D) \
+#define TYPES_cvt_long(S, D, T) \
D (f32, f16), D (f64, f32)
/* _f16_f32. */
-#define TYPES_cvt_narrow_s(S, D) \
+#define TYPES_cvt_narrow_s(S, D, T) \
D (f32, f64)
/* _f16_f32
_f32_f64. */
-#define TYPES_cvt_narrow(S, D) \
- D (f16, f32), TYPES_cvt_narrow_s (S, D)
+#define TYPES_cvt_narrow(S, D, T) \
+ D (f16, f32), TYPES_cvt_narrow_s (S, D, T)
/* { _s32 _u32 } x _f32
_f32 x { _s32 _u32 }. */
-#define TYPES_cvt_s_s(S, D) \
+#define TYPES_cvt_s_s(S, D, T) \
D (s32, f32), \
D (u32, f32), \
D (f32, s32), \
/* _f16_mf8
_bf16_mf8. */
-#define TYPES_cvt_mf8(S, D) \
+#define TYPES_cvt_mf8(S, D, T) \
D (f16, mf8), D (bf16, mf8)
/* _mf8_f16
_mf8_bf16. */
-#define TYPES_cvtn_mf8(S, D) \
+#define TYPES_cvtn_mf8(S, D, T) \
D (mf8, f16), D (mf8, bf16)
/* _mf8_f32. */
-#define TYPES_cvtnx_mf8(S, D) \
+#define TYPES_cvtnx_mf8(S, D, T) \
D (mf8, f32)
/* { _s32 _s64 } x { _b8 _b16 _b32 _b64 }
{ _u32 _u64 }. */
#define TYPES_inc_dec_n1(D, A) \
D (A, b8), D (A, b16), D (A, b32), D (A, b64)
-#define TYPES_inc_dec_n(S, D) \
+#define TYPES_inc_dec_n(S, D, T) \
TYPES_inc_dec_n1 (D, s32), \
TYPES_inc_dec_n1 (D, s64), \
TYPES_inc_dec_n1 (D, u32), \
/* { _s16 _u16 } x _s32
{ _u16 } x _u32. */
-#define TYPES_qcvt_x2(S, D) \
+#define TYPES_qcvt_x2(S, D, T) \
D (s16, s32), \
D (u16, u32), \
D (u16, s32)
{ _s16 _u16 } x _s64
{ _u16 } x _u64. */
-#define TYPES_qcvt_x4(S, D) \
+#define TYPES_qcvt_x4(S, D, T) \
D (s8, s32), \
D (u8, u32), \
D (u8, s32), \
/* _s16_s32
_u16_u32. */
-#define TYPES_qrshr_x2(S, D) \
+#define TYPES_qrshr_x2(S, D, T) \
D (s16, s32), \
D (u16, u32)
/* _u16_s32. */
-#define TYPES_qrshru_x2(S, D) \
+#define TYPES_qrshru_x2(S, D, T) \
D (u16, s32)
/* _s8_s32
_s16_s64
_u8_u32
_u16_u64. */
-#define TYPES_qrshr_x4(S, D) \
+#define TYPES_qrshr_x4(S, D, T) \
D (s8, s32), \
D (s16, s64), \
D (u8, u32), \
/* _u8_s32
_u16_s64. */
-#define TYPES_qrshru_x4(S, D) \
+#define TYPES_qrshru_x4(S, D, T) \
D (u8, s32), \
D (u16, s64)
D (A, f16), D (A, f32), D (A, f64), \
D (A, s8), D (A, s16), D (A, s32), D (A, s64), \
D (A, u8), D (A, u16), D (A, u32), D (A, u64)
-#define TYPES_reinterpret(S, D) \
+#define TYPES_reinterpret(S, D, T) \
TYPES_reinterpret1 (D, mf8), \
TYPES_reinterpret1 (D, bf16), \
TYPES_reinterpret1 (D, f16), \
/* _b_c
_c_b. */
-#define TYPES_reinterpret_b(S, D) \
+#define TYPES_reinterpret_b(S, D, T) \
D (b, c), \
D (c, b)
{ _u32 _u64 } */
#define TYPES_while1(D, bn) \
D (bn, s32), D (bn, s64), D (bn, u32), D (bn, u64)
-#define TYPES_while(S, D) \
+#define TYPES_while(S, D, T) \
TYPES_while1 (D, b8), \
TYPES_while1 (D, b16), \
TYPES_while1 (D, b32), \
/* { _b8 _b16 _b32 _b64 } x { _s64 }
{ _u64 } */
-#define TYPES_while_x(S, D) \
+#define TYPES_while_x(S, D, T) \
D (b8, s64), D (b8, u64), \
D (b16, s64), D (b16, u64), \
D (b32, s64), D (b32, u64), \
/* { _c8 _c16 _c32 _c64 } x { _s64 }
{ _u64 } */
-#define TYPES_while_x_c(S, D) \
+#define TYPES_while_x_c(S, D, T) \
D (c8, s64), D (c8, u64), \
D (c16, s64), D (c16, u64), \
D (c32, s64), D (c32, u64), \
/* _f32_f16
_s32_s16
_u32_u16. */
-#define TYPES_s_narrow_fsu(S, D) \
+#define TYPES_s_narrow_fsu(S, D, T) \
D (f32, f16), D (s32, s16), D (u32, u16)
/* _za8 _za16 _za32 _za64 _za128. */
-#define TYPES_all_za(S, D) \
+#define TYPES_all_za(S, D, T) \
S (za8), S (za16), S (za32), S (za64), S (za128)
/* _za64. */
-#define TYPES_d_za(S, D) \
+#define TYPES_d_za(S, D, T) \
S (za64)
/* { _za8 } x { _mf8 _s8 _u8 }
{ _za32 } x { _f32 _s32 _u32 }
{ _za64 } x { _f64 _s64 _u64 }. */
-#define TYPES_za_bhsd_data(S, D) \
+#define TYPES_za_bhsd_data(S, D, T) \
D (za8, mf8), D (za8, s8), D (za8, u8), \
D (za16, bf16), D (za16, f16), D (za16, s16), D (za16, u16), \
D (za32, f32), D (za32, s32), D (za32, u32), \
{ _s8 _s16 _s32 _s64 }
{ _u8 _u16 _u32 _u64 }. */
-#define TYPES_za_all_data(S, D) \
- TYPES_za_bhsd_data (S, D), \
+#define TYPES_za_all_data(S, D, T) \
+ TYPES_za_bhsd_data (S, D, T), \
TYPES_reinterpret1 (D, za128)
/* _za16_mf8. */
-#define TYPES_za_h_mf8(S, D) \
+#define TYPES_za_h_mf8(S, D, T) \
D (za16, mf8)
-/* _za32_mf8. */
-#define TYPES_za_s_mf8(S, D) \
- D (za32, mf8)
-
/* { _za_16 _za_32 } x _mf8. */
-#define TYPES_za_hs_mf8(S, D) \
+#define TYPES_za_hs_mf8(S, D, T) \
D (za16, mf8), D (za32, mf8)
/* _za16_bf16. */
-#define TYPES_za_h_bfloat(S, D) \
+#define TYPES_za_h_bfloat(S, D, T) \
D (za16, bf16)
/* _za16_f16. */
-#define TYPES_za_h_float(S, D) \
+#define TYPES_za_h_float(S, D, T) \
D (za16, f16)
/* _za32_s8. */
-#define TYPES_za_s_b_signed(S, D) \
+#define TYPES_za_s_b_signed(S, D, T) \
D (za32, s8)
/* _za32_u8. */
-#define TYPES_za_s_b_unsigned(S, D) \
+#define TYPES_za_s_b_unsigned(S, D, T) \
D (za32, u8)
/* _za32 x { _s8 _u8 }. */
-#define TYPES_za_s_b_integer(S, D) \
+#define TYPES_za_s_b_integer(S, D, T) \
D (za32, s8), D (za32, u8)
/* _za32 x { _s16 _u16 }. */
-#define TYPES_za_s_h_integer(S, D) \
+#define TYPES_za_s_h_integer(S, D, T) \
D (za32, s16), D (za32, u16)
/* _za32 x { _bf16 _f16 _s16 _u16 }. */
-#define TYPES_za_s_h_data(S, D) \
+#define TYPES_za_s_h_data(S, D, T) \
D (za32, bf16), D (za32, f16), D (za32, s16), D (za32, u16)
/* _za32_u32. */
-#define TYPES_za_s_unsigned(S, D) \
+#define TYPES_za_s_unsigned(S, D, T) \
D (za32, u32)
/* _za32 x { _s32 _u32 }. */
-#define TYPES_za_s_integer(S, D) \
+#define TYPES_za_s_integer(S, D, T) \
D (za32, s32), D (za32, u32)
/* _za32_mf8. */
-#define TYPES_za_s_mf8(S, D) \
+#define TYPES_za_s_mf8(S, D, T) \
D (za32, mf8)
/* _za32_f32. */
-#define TYPES_za_s_float(S, D) \
+#define TYPES_za_s_float(S, D, T) \
D (za32, f32)
/* _za32 x { _f32 _s32 _u32 }. */
-#define TYPES_za_s_data(S, D) \
+#define TYPES_za_s_data(S, D, T) \
D (za32, f32), D (za32, s32), D (za32, u32)
/* _za64 x { _s16 _u16 }. */
-#define TYPES_za_d_h_integer(S, D) \
+#define TYPES_za_d_h_integer(S, D, T) \
D (za64, s16), D (za64, u16)
/* _za64_f64. */
-#define TYPES_za_d_float(S, D) \
+#define TYPES_za_d_float(S, D, T) \
D (za64, f64)
/* _za64 x { _s64 _u64 }. */
-#define TYPES_za_d_integer(S, D) \
+#define TYPES_za_d_integer(S, D, T) \
D (za64, s64), D (za64, u64)
/* _za32 x { _s8 _u8 _bf16 _f16 _f32 }. */
-#define TYPES_mop_base(S, D) \
+#define TYPES_mop_base(S, D, T) \
D (za32, s8), D (za32, u8), D (za32, bf16), D (za32, f16), D (za32, f32)
/* _za32_s8. */
-#define TYPES_mop_base_signed(S, D) \
+#define TYPES_mop_base_signed(S, D, T) \
D (za32, s8)
/* _za32_u8. */
-#define TYPES_mop_base_unsigned(S, D) \
+#define TYPES_mop_base_unsigned(S, D, T) \
D (za32, u8)
/* _za64 x { _s16 _u16 }. */
-#define TYPES_mop_i16i64(S, D) \
+#define TYPES_mop_i16i64(S, D, T) \
D (za64, s16), D (za64, u16)
/* _za64_s16. */
-#define TYPES_mop_i16i64_signed(S, D) \
+#define TYPES_mop_i16i64_signed(S, D, T) \
D (za64, s16)
/* _za64_u16. */
-#define TYPES_mop_i16i64_unsigned(S, D) \
+#define TYPES_mop_i16i64_unsigned(S, D, T) \
D (za64, u16)
/* _za. */
-#define TYPES_za(S, D) \
+#define TYPES_za(S, D, T) \
S (za)
-/* Describe a pair of type suffixes in which only the first is used. */
-#define DEF_VECTOR_TYPE(X) { TYPE_SUFFIX_ ## X, NUM_TYPE_SUFFIXES }
+/* Describe a tuple of type suffixes in which only the first is used. */
+#define DEF_VECTOR_TYPE(X) \
+ { TYPE_SUFFIX_ ## X, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES }
+
+/* Describe a tuple of type suffixes in which only the first two are used. */
+#define DEF_DOUBLE_TYPE(X, Y) \
+ { TYPE_SUFFIX_ ## X, TYPE_SUFFIX_ ## Y, NUM_TYPE_SUFFIXES }
-/* Describe a pair of type suffixes in which both are used. */
-#define DEF_DOUBLE_TYPE(X, Y) { TYPE_SUFFIX_ ## X, TYPE_SUFFIX_ ## Y }
+/* Describe a tuple of type suffixes in which three elements are used. */
+#define DEF_TRIPLE_TYPE(X, Y, Z) \
+ { TYPE_SUFFIX_ ## X, TYPE_SUFFIX_ ## Y, TYPE_SUFFIX_ ## Z }
/* Create an array that can be used in aarch64-sve-builtins.def to
select the type suffixes in TYPES_<NAME>. */
#define DEF_SVE_TYPES_ARRAY(NAME) \
- static const type_suffix_pair types_##NAME[] = { \
- TYPES_##NAME (DEF_VECTOR_TYPE, DEF_DOUBLE_TYPE), \
- { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES } \
+ static const type_suffix_triple types_##NAME[] = { \
+ TYPES_##NAME (DEF_VECTOR_TYPE, DEF_DOUBLE_TYPE, DEF_TRIPLE_TYPE), \
+ { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES } \
}
/* For functions that don't take any type suffixes. */
-static const type_suffix_pair types_none[] = {
- { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES },
- { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES }
+static const type_suffix_triple types_none[] = {
+ { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES },
+ { NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES }
};
/* Create an array for each TYPES_<combination> macro above. */
h.add_int (mode_suffix_id);
h.add_int (type_suffix_ids[0]);
h.add_int (type_suffix_ids[1]);
+ h.add_int (type_suffix_ids[2]);
h.add_int (group_suffix_id);
h.add_int (pred);
h.add_int (fpm_mode);
}
else
append_name (instance.mode_suffix ().string);
- for (unsigned int i = 0; i < 2; ++i)
+ for (unsigned int i = 0; i < 3; ++i)
if (!overloaded_p || instance.shape->explicit_type_suffix_p (i))
append_name (instance.type_suffix (i).string);
if (!overloaded_p || instance.shape->explicit_group_suffix_p ())
{
bool explicit_type0 = (*group.shape)->explicit_type_suffix_p (0);
bool explicit_type1 = (*group.shape)->explicit_type_suffix_p (1);
+ bool explicit_type2 = (*group.shape)->explicit_type_suffix_p (2);
bool explicit_group = (*group.shape)->explicit_group_suffix_p ();
- auto add_function = [&](const type_suffix_pair &types,
+ auto add_function = [&](const type_suffix_triple &types,
group_suffix_index group_suffix_id,
unsigned int pi)
{
{
/* Stub out the types that are determined by overload
resolution. */
- type_suffix_pair types = {
+ type_suffix_triple types = {
explicit_type0 ? group.types[ti][0] : NUM_TYPE_SUFFIXES,
- explicit_type1 ? group.types[ti][1] : NUM_TYPE_SUFFIXES
+ explicit_type1 ? group.types[ti][1] : NUM_TYPE_SUFFIXES,
+ explicit_type2 ? group.types[ti][2] : NUM_TYPE_SUFFIXES
};
add_function (types, group_suffix_id, pi);
}
function_resolver::lookup_form (mode_suffix_index mode,
type_suffix_index type0,
type_suffix_index type1,
+ type_suffix_index type2,
group_suffix_index group)
{
- type_suffix_pair types = { type0, type1 };
+ type_suffix_triple types = { type0, type1, type2 };
function_instance instance (base_name, base, shape, mode, types, group, pred,
fpm_mode);
registered_function *rfn
{
type_suffix_index type0 = type_suffix_ids[0];
type_suffix_index type1 = type_suffix_ids[1];
+ type_suffix_index type2 = type_suffix_ids[2];
(type0 == NUM_TYPE_SUFFIXES ? type0 : type1) = type.type;
group_suffix_index group = group_suffix_id;
if (group == GROUP_none && type.num_vectors != vectors_per_tuple ())
group = num_vectors_to_group (type.num_vectors);
- return lookup_form (mode, type0, type1, group);
+ return lookup_form (mode, type0, type1, type2, group);
}
/* Resolve the function to one with the mode suffix given by MODE, the
function_resolver::resolve_to (mode_suffix_index mode,
type_suffix_index type0,
type_suffix_index type1,
+ type_suffix_index type2,
group_suffix_index group)
{
- tree res = lookup_form (mode, type0, type1, group);
+ tree res = lookup_form (mode, type0, type1, type2, group);
if (!res)
{
if (type1 == NUM_TYPE_SUFFIXES)
explicit. */
if (type_suffix_ids[0] != NUM_TYPE_SUFFIXES)
return resolve_to (mode_suffix_id, type_suffix_ids[0], type,
- group_suffix_id);
+ NUM_TYPE_SUFFIXES, group_suffix_id);
return resolve_to (mode_suffix_id, type);
}