Add automatic-verification for MIPS MSA intrinsics
This commit is contained in:
parent
438d260bc2
commit
9fecf396ac
4 changed files with 1054 additions and 1 deletions
|
|
@ -89,7 +89,7 @@ matrix:
|
|||
- name: "Documentation"
|
||||
install: true
|
||||
script: ci/dox.sh
|
||||
- name: "Automatic verification: x86 and x86_64"
|
||||
- name: "Automatic verification: x86 / x86_64 / arm / aarch64 / mips*"
|
||||
script: cargo test --manifest-path crates/stdsimd-verify/Cargo.toml
|
||||
install: true
|
||||
- name: "rustfmt"
|
||||
|
|
|
|||
707
library/stdarch/crates/stdsimd-verify/mips-msa.h
Normal file
707
library/stdarch/crates/stdsimd-verify/mips-msa.h
Normal file
|
|
@ -0,0 +1,707 @@
|
|||
v16i8 __builtin_msa_add_a_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_add_a_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_add_a_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_add_a_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_adds_a_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_adds_a_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_adds_a_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_adds_a_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_adds_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_adds_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_adds_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_adds_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_adds_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_adds_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_adds_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_adds_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_addv_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_addv_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_addv_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_addv_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_addvi_b (v16i8, imm0_31);
|
||||
v8i16 __builtin_msa_addvi_h (v8i16, imm0_31);
|
||||
v4i32 __builtin_msa_addvi_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_addvi_d (v2i64, imm0_31);
|
||||
|
||||
v16u8 __builtin_msa_and_v (v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_andi_b (v16u8, imm0_255);
|
||||
|
||||
v16i8 __builtin_msa_asub_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_asub_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_asub_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_asub_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_asub_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_asub_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_asub_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_asub_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_ave_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ave_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ave_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ave_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_ave_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_ave_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_ave_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_ave_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_aver_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_aver_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_aver_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_aver_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_aver_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_aver_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_aver_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_aver_u_d (v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_bclr_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_bclr_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_bclr_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_bclr_d (v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_bclri_b (v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_bclri_h (v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_bclri_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_bclri_d (v2u64, imm0_63);
|
||||
|
||||
v16u8 __builtin_msa_binsl_b (v16u8, v16u8, v16u8);
|
||||
v8u16 __builtin_msa_binsl_h (v8u16, v8u16, v8u16);
|
||||
v4u32 __builtin_msa_binsl_w (v4u32, v4u32, v4u32);
|
||||
v2u64 __builtin_msa_binsl_d (v2u64, v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_binsli_b (v16u8, v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_binsli_h (v8u16, v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_binsli_w (v4u32, v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_binsli_d (v2u64, v2u64, imm0_63);
|
||||
|
||||
v16u8 __builtin_msa_binsr_b (v16u8, v16u8, v16u8);
|
||||
v8u16 __builtin_msa_binsr_h (v8u16, v8u16, v8u16);
|
||||
v4u32 __builtin_msa_binsr_w (v4u32, v4u32, v4u32);
|
||||
v2u64 __builtin_msa_binsr_d (v2u64, v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_binsri_b (v16u8, v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_binsri_h (v8u16, v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_binsri_w (v4u32, v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_binsri_d (v2u64, v2u64, imm0_63);
|
||||
|
||||
v16u8 __builtin_msa_bmnz_v (v16u8, v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_bmnzi_b (v16u8, v16u8, imm0_255);
|
||||
|
||||
v16u8 __builtin_msa_bmz_v (v16u8, v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_bmzi_b (v16u8, v16u8, imm0_255);
|
||||
|
||||
v16u8 __builtin_msa_bneg_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_bneg_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_bneg_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_bneg_d (v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_bnegi_b (v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_bnegi_h (v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_bnegi_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_bnegi_d (v2u64, imm0_63);
|
||||
|
||||
i32 __builtin_msa_bnz_b (v16u8);
|
||||
i32 __builtin_msa_bnz_h (v8u16);
|
||||
i32 __builtin_msa_bnz_w (v4u32);
|
||||
i32 __builtin_msa_bnz_d (v2u64);
|
||||
|
||||
i32 __builtin_msa_bnz_v (v16u8);
|
||||
|
||||
v16u8 __builtin_msa_bsel_v (v16u8, v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_bseli_b (v16u8, v16u8, imm0_255);
|
||||
|
||||
v16u8 __builtin_msa_bset_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_bset_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_bset_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_bset_d (v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_bseti_b (v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_bseti_h (v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_bseti_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_bseti_d (v2u64, imm0_63);
|
||||
|
||||
i32 __builtin_msa_bz_b (v16u8);
|
||||
i32 __builtin_msa_bz_h (v8u16);
|
||||
i32 __builtin_msa_bz_w (v4u32);
|
||||
i32 __builtin_msa_bz_d (v2u64);
|
||||
|
||||
i32 __builtin_msa_bz_v (v16u8);
|
||||
|
||||
v16i8 __builtin_msa_ceq_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ceq_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ceq_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ceq_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_ceqi_b (v16i8, imm_n16_15);
|
||||
v8i16 __builtin_msa_ceqi_h (v8i16, imm_n16_15);
|
||||
v4i32 __builtin_msa_ceqi_w (v4i32, imm_n16_15);
|
||||
v2i64 __builtin_msa_ceqi_d (v2i64, imm_n16_15);
|
||||
|
||||
i32 __builtin_msa_cfcmsa (imm0_31);
|
||||
|
||||
v16i8 __builtin_msa_cle_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_cle_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_cle_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_cle_s_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_cle_u_b (v16u8, v16u8);
|
||||
v8i16 __builtin_msa_cle_u_h (v8u16, v8u16);
|
||||
v4i32 __builtin_msa_cle_u_w (v4u32, v4u32);
|
||||
v2i64 __builtin_msa_cle_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_clei_s_b (v16i8, imm_n16_15);
|
||||
v8i16 __builtin_msa_clei_s_h (v8i16, imm_n16_15);
|
||||
v4i32 __builtin_msa_clei_s_w (v4i32, imm_n16_15);
|
||||
v2i64 __builtin_msa_clei_s_d (v2i64, imm_n16_15);
|
||||
|
||||
v16i8 __builtin_msa_clei_u_b (v16u8, imm0_31);
|
||||
v8i16 __builtin_msa_clei_u_h (v8u16, imm0_31);
|
||||
v4i32 __builtin_msa_clei_u_w (v4u32, imm0_31);
|
||||
v2i64 __builtin_msa_clei_u_d (v2u64, imm0_31);
|
||||
|
||||
v16i8 __builtin_msa_clt_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_clt_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_clt_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_clt_s_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_clt_u_b (v16u8, v16u8);
|
||||
v8i16 __builtin_msa_clt_u_h (v8u16, v8u16);
|
||||
v4i32 __builtin_msa_clt_u_w (v4u32, v4u32);
|
||||
v2i64 __builtin_msa_clt_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_clti_s_b (v16i8, imm_n16_15);
|
||||
v8i16 __builtin_msa_clti_s_h (v8i16, imm_n16_15);
|
||||
v4i32 __builtin_msa_clti_s_w (v4i32, imm_n16_15);
|
||||
v2i64 __builtin_msa_clti_s_d (v2i64, imm_n16_15);
|
||||
|
||||
v16i8 __builtin_msa_clti_u_b (v16u8, imm0_31);
|
||||
v8i16 __builtin_msa_clti_u_h (v8u16, imm0_31);
|
||||
v4i32 __builtin_msa_clti_u_w (v4u32, imm0_31);
|
||||
v2i64 __builtin_msa_clti_u_d (v2u64, imm0_31);
|
||||
|
||||
i32 __builtin_msa_copy_s_b (v16i8, imm0_15);
|
||||
i32 __builtin_msa_copy_s_h (v8i16, imm0_7);
|
||||
i32 __builtin_msa_copy_s_w (v4i32, imm0_3);
|
||||
i64 __builtin_msa_copy_s_d (v2i64, imm0_1);
|
||||
|
||||
u32 __builtin_msa_copy_u_b (v16i8, imm0_15);
|
||||
u32 __builtin_msa_copy_u_h (v8i16, imm0_7);
|
||||
u32 __builtin_msa_copy_u_w (v4i32, imm0_3);
|
||||
u64 __builtin_msa_copy_u_d (v2i64, imm0_1);
|
||||
|
||||
void __builtin_msa_ctcmsa (imm0_31, i32);
|
||||
|
||||
v16i8 __builtin_msa_div_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_div_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_div_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_div_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_div_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_div_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_div_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_div_u_d (v2u64, v2u64);
|
||||
|
||||
v8i16 __builtin_msa_dotp_s_h (v16i8, v16i8);
|
||||
v4i32 __builtin_msa_dotp_s_w (v8i16, v8i16);
|
||||
v2i64 __builtin_msa_dotp_s_d (v4i32, v4i32);
|
||||
|
||||
v8u16 __builtin_msa_dotp_u_h (v16u8, v16u8);
|
||||
v4u32 __builtin_msa_dotp_u_w (v8u16, v8u16);
|
||||
v2u64 __builtin_msa_dotp_u_d (v4u32, v4u32);
|
||||
|
||||
v8i16 __builtin_msa_dpadd_s_h (v8i16, v16i8, v16i8);
|
||||
v4i32 __builtin_msa_dpadd_s_w (v4i32, v8i16, v8i16);
|
||||
v2i64 __builtin_msa_dpadd_s_d (v2i64, v4i32, v4i32);
|
||||
|
||||
v8u16 __builtin_msa_dpadd_u_h (v8u16, v16u8, v16u8);
|
||||
v4u32 __builtin_msa_dpadd_u_w (v4u32, v8u16, v8u16);
|
||||
v2u64 __builtin_msa_dpadd_u_d (v2u64, v4u32, v4u32);
|
||||
|
||||
v8i16 __builtin_msa_dpsub_s_h (v8i16, v16i8, v16i8);
|
||||
v4i32 __builtin_msa_dpsub_s_w (v4i32, v8i16, v8i16);
|
||||
v2i64 __builtin_msa_dpsub_s_d (v2i64, v4i32, v4i32);
|
||||
|
||||
v8i16 __builtin_msa_dpsub_u_h (v8i16, v16u8, v16u8);
|
||||
v4i32 __builtin_msa_dpsub_u_w (v4i32, v8u16, v8u16);
|
||||
v2i64 __builtin_msa_dpsub_u_d (v2i64, v4u32, v4u32);
|
||||
|
||||
v4f32 __builtin_msa_fadd_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fadd_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcaf_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcaf_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fceq_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fceq_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fclass_w (v4f32);
|
||||
v2i64 __builtin_msa_fclass_d (v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcle_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcle_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fclt_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fclt_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcne_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcne_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcor_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcor_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcueq_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcueq_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcule_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcule_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcult_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcult_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcun_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcun_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fcune_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fcune_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fdiv_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fdiv_d (v2f64, v2f64);
|
||||
|
||||
v8i16 __builtin_msa_fexdo_h (v4f32, v4f32);
|
||||
v4f32 __builtin_msa_fexdo_w (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fexp2_w (v4f32, v4i32);
|
||||
v2f64 __builtin_msa_fexp2_d (v2f64, v2i64);
|
||||
|
||||
v4f32 __builtin_msa_fexupl_w (v8i16);
|
||||
v2f64 __builtin_msa_fexupl_d (v4f32);
|
||||
|
||||
v4f32 __builtin_msa_fexupr_w (v8i16);
|
||||
v2f64 __builtin_msa_fexupr_d (v4f32);
|
||||
|
||||
v4f32 __builtin_msa_ffint_s_w (v4i32);
|
||||
v2f64 __builtin_msa_ffint_s_d (v2i64);
|
||||
|
||||
v4f32 __builtin_msa_ffint_u_w (v4u32);
|
||||
v2f64 __builtin_msa_ffint_u_d (v2u64);
|
||||
|
||||
v4f32 __builtin_msa_ffql_w (v8i16);
|
||||
v2f64 __builtin_msa_ffql_d (v4i32);
|
||||
|
||||
v4f32 __builtin_msa_ffqr_w (v8i16);
|
||||
v2f64 __builtin_msa_ffqr_d (v4i32);
|
||||
|
||||
v16i8 __builtin_msa_fill_b (i32);
|
||||
v8i16 __builtin_msa_fill_h (i32);
|
||||
v4i32 __builtin_msa_fill_w (i32);
|
||||
v2i64 __builtin_msa_fill_d (i64);
|
||||
|
||||
v4f32 __builtin_msa_flog2_w (v4f32);
|
||||
v2f64 __builtin_msa_flog2_d (v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmadd_w (v4f32, v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmadd_d (v2f64, v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmax_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmax_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmax_a_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmax_a_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmin_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmin_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmin_a_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmin_a_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmsub_w (v4f32, v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmsub_d (v2f64, v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fmul_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fmul_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_frint_w (v4f32);
|
||||
v2f64 __builtin_msa_frint_d (v2f64);
|
||||
|
||||
v4f32 __builtin_msa_frcp_w (v4f32);
|
||||
v2f64 __builtin_msa_frcp_d (v2f64);
|
||||
|
||||
v4f32 __builtin_msa_frsqrt_w (v4f32);
|
||||
v2f64 __builtin_msa_frsqrt_d (v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsaf_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsaf_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fseq_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fseq_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsle_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsle_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fslt_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fslt_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsne_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsne_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsor_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsor_d (v2f64, v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fsqrt_w (v4f32);
|
||||
v2f64 __builtin_msa_fsqrt_d (v2f64);
|
||||
|
||||
v4f32 __builtin_msa_fsub_w (v4f32, v4f32);
|
||||
v2f64 __builtin_msa_fsub_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsueq_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsueq_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsule_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsule_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsult_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsult_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsun_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsun_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_fsune_w (v4f32, v4f32);
|
||||
v2i64 __builtin_msa_fsune_d (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_ftint_s_w (v4f32);
|
||||
v2i64 __builtin_msa_ftint_s_d (v2f64);
|
||||
|
||||
v4u32 __builtin_msa_ftint_u_w (v4f32);
|
||||
v2u64 __builtin_msa_ftint_u_d (v2f64);
|
||||
|
||||
v8i16 __builtin_msa_ftq_h (v4f32, v4f32);
|
||||
v4i32 __builtin_msa_ftq_w (v2f64, v2f64);
|
||||
|
||||
v4i32 __builtin_msa_ftrunc_s_w (v4f32);
|
||||
v2i64 __builtin_msa_ftrunc_s_d (v2f64);
|
||||
|
||||
v4u32 __builtin_msa_ftrunc_u_w (v4f32);
|
||||
v2u64 __builtin_msa_ftrunc_u_d (v2f64);
|
||||
|
||||
v8i16 __builtin_msa_hadd_s_h (v16i8, v16i8);
|
||||
v4i32 __builtin_msa_hadd_s_w (v8i16, v8i16);
|
||||
v2i64 __builtin_msa_hadd_s_d (v4i32, v4i32);
|
||||
|
||||
v8u16 __builtin_msa_hadd_u_h (v16u8, v16u8);
|
||||
v4u32 __builtin_msa_hadd_u_w (v8u16, v8u16);
|
||||
v2u64 __builtin_msa_hadd_u_d (v4u32, v4u32);
|
||||
|
||||
v8i16 __builtin_msa_hsub_s_h (v16i8, v16i8);
|
||||
v4i32 __builtin_msa_hsub_s_w (v8i16, v8i16);
|
||||
v2i64 __builtin_msa_hsub_s_d (v4i32, v4i32);
|
||||
|
||||
v8i16 __builtin_msa_hsub_u_h (v16u8, v16u8);
|
||||
v4i32 __builtin_msa_hsub_u_w (v8u16, v8u16);
|
||||
v2i64 __builtin_msa_hsub_u_d (v4u32, v4u32);
|
||||
|
||||
v16i8 __builtin_msa_ilvev_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ilvev_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ilvev_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ilvev_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_ilvl_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ilvl_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ilvl_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ilvl_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_ilvod_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ilvod_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ilvod_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ilvod_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_ilvr_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_ilvr_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_ilvr_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_ilvr_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_insert_b (v16i8, imm0_15, i32);
|
||||
v8i16 __builtin_msa_insert_h (v8i16, imm0_7, i32);
|
||||
v4i32 __builtin_msa_insert_w (v4i32, imm0_3, i32);
|
||||
v2i64 __builtin_msa_insert_d (v2i64, imm0_1, i64);
|
||||
|
||||
v16i8 __builtin_msa_insve_b (v16i8, imm0_15, v16i8);
|
||||
v8i16 __builtin_msa_insve_h (v8i16, imm0_7, v8i16);
|
||||
v4i32 __builtin_msa_insve_w (v4i32, imm0_3, v4i32);
|
||||
v2i64 __builtin_msa_insve_d (v2i64, imm0_1, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_ld_b (void *, imm_n512_511);
|
||||
v8i16 __builtin_msa_ld_h (void *, imm_n1024_1022);
|
||||
v4i32 __builtin_msa_ld_w (void *, imm_n2048_2044);
|
||||
v2i64 __builtin_msa_ld_d (void *, imm_n4096_4088);
|
||||
|
||||
v16i8 __builtin_msa_ldi_b (imm_n512_511);
|
||||
v8i16 __builtin_msa_ldi_h (imm_n512_511);
|
||||
v4i32 __builtin_msa_ldi_w (imm_n512_511);
|
||||
v2i64 __builtin_msa_ldi_d (imm_n512_511);
|
||||
|
||||
v8i16 __builtin_msa_madd_q_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_madd_q_w (v4i32, v4i32, v4i32);
|
||||
|
||||
v8i16 __builtin_msa_maddr_q_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_maddr_q_w (v4i32, v4i32, v4i32);
|
||||
|
||||
v16i8 __builtin_msa_maddv_b (v16i8, v16i8, v16i8);
|
||||
v8i16 __builtin_msa_maddv_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_maddv_w (v4i32, v4i32, v4i32);
|
||||
v2i64 __builtin_msa_maddv_d (v2i64, v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_max_a_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_max_a_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_max_a_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_max_a_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_max_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_max_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_max_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_max_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_max_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_max_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_max_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_max_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_maxi_s_b (v16i8, imm_n16_15);
|
||||
v8i16 __builtin_msa_maxi_s_h (v8i16, imm_n16_15);
|
||||
v4i32 __builtin_msa_maxi_s_w (v4i32, imm_n16_15);
|
||||
v2i64 __builtin_msa_maxi_s_d (v2i64, imm_n16_15);
|
||||
|
||||
v16u8 __builtin_msa_maxi_u_b (v16u8, imm0_31);
|
||||
v8u16 __builtin_msa_maxi_u_h (v8u16, imm0_31);
|
||||
v4u32 __builtin_msa_maxi_u_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_maxi_u_d (v2u64, imm0_31);
|
||||
|
||||
v16i8 __builtin_msa_min_a_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_min_a_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_min_a_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_min_a_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_min_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_min_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_min_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_min_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_min_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_min_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_min_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_min_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_mini_s_b (v16i8, imm_n16_15);
|
||||
v8i16 __builtin_msa_mini_s_h (v8i16, imm_n16_15);
|
||||
v4i32 __builtin_msa_mini_s_w (v4i32, imm_n16_15);
|
||||
v2i64 __builtin_msa_mini_s_d (v2i64, imm_n16_15);
|
||||
|
||||
v16u8 __builtin_msa_mini_u_b (v16u8, imm0_31);
|
||||
v8u16 __builtin_msa_mini_u_h (v8u16, imm0_31);
|
||||
v4u32 __builtin_msa_mini_u_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_mini_u_d (v2u64, imm0_31);
|
||||
|
||||
v16i8 __builtin_msa_mod_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_mod_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_mod_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_mod_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_mod_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_mod_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_mod_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_mod_u_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_move_v (v16i8);
|
||||
|
||||
v8i16 __builtin_msa_msub_q_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_msub_q_w (v4i32, v4i32, v4i32);
|
||||
|
||||
v8i16 __builtin_msa_msubr_q_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_msubr_q_w (v4i32, v4i32, v4i32);
|
||||
|
||||
v16i8 __builtin_msa_msubv_b (v16i8, v16i8, v16i8);
|
||||
v8i16 __builtin_msa_msubv_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_msubv_w (v4i32, v4i32, v4i32);
|
||||
v2i64 __builtin_msa_msubv_d (v2i64, v2i64, v2i64);
|
||||
|
||||
v8i16 __builtin_msa_mul_q_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_mul_q_w (v4i32, v4i32);
|
||||
|
||||
v8i16 __builtin_msa_mulr_q_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_mulr_q_w (v4i32, v4i32);
|
||||
|
||||
v16i8 __builtin_msa_mulv_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_mulv_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_mulv_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_mulv_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_nloc_b (v16i8);
|
||||
v8i16 __builtin_msa_nloc_h (v8i16);
|
||||
v4i32 __builtin_msa_nloc_w (v4i32);
|
||||
v2i64 __builtin_msa_nloc_d (v2i64);
|
||||
|
||||
v16i8 __builtin_msa_nlzc_b (v16i8);
|
||||
v8i16 __builtin_msa_nlzc_h (v8i16);
|
||||
v4i32 __builtin_msa_nlzc_w (v4i32);
|
||||
v2i64 __builtin_msa_nlzc_d (v2i64);
|
||||
|
||||
v16u8 __builtin_msa_nor_v (v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_nori_b (v16u8, imm0_255);
|
||||
|
||||
v16u8 __builtin_msa_or_v (v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_ori_b (v16u8, imm0_255);
|
||||
|
||||
v16i8 __builtin_msa_pckev_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_pckev_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_pckev_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_pckev_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_pckod_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_pckod_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_pckod_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_pckod_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_pcnt_b (v16i8);
|
||||
v8i16 __builtin_msa_pcnt_h (v8i16);
|
||||
v4i32 __builtin_msa_pcnt_w (v4i32);
|
||||
v2i64 __builtin_msa_pcnt_d (v2i64);
|
||||
|
||||
v16i8 __builtin_msa_sat_s_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_sat_s_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_sat_s_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_sat_s_d (v2i64, imm0_63);
|
||||
|
||||
v16u8 __builtin_msa_sat_u_b (v16u8, imm0_7);
|
||||
v8u16 __builtin_msa_sat_u_h (v8u16, imm0_15);
|
||||
v4u32 __builtin_msa_sat_u_w (v4u32, imm0_31);
|
||||
v2u64 __builtin_msa_sat_u_d (v2u64, imm0_63);
|
||||
|
||||
v16i8 __builtin_msa_shf_b (v16i8, imm0_255);
|
||||
v8i16 __builtin_msa_shf_h (v8i16, imm0_255);
|
||||
v4i32 __builtin_msa_shf_w (v4i32, imm0_255);
|
||||
|
||||
v16i8 __builtin_msa_sld_b (v16i8, v16i8, i32);
|
||||
v8i16 __builtin_msa_sld_h (v8i16, v8i16, i32);
|
||||
v4i32 __builtin_msa_sld_w (v4i32, v4i32, i32);
|
||||
v2i64 __builtin_msa_sld_d (v2i64, v2i64, i32);
|
||||
|
||||
v16i8 __builtin_msa_sldi_b (v16i8, v16i8, imm0_15);
|
||||
v8i16 __builtin_msa_sldi_h (v8i16, v8i16, imm0_7);
|
||||
v4i32 __builtin_msa_sldi_w (v4i32, v4i32, imm0_3);
|
||||
v2i64 __builtin_msa_sldi_d (v2i64, v2i64, imm0_1);
|
||||
|
||||
v16i8 __builtin_msa_sll_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_sll_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_sll_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_sll_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_slli_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_slli_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_slli_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_slli_d (v2i64, imm0_63);
|
||||
|
||||
v16i8 __builtin_msa_splat_b (v16i8, i32);
|
||||
v8i16 __builtin_msa_splat_h (v8i16, i32);
|
||||
v4i32 __builtin_msa_splat_w (v4i32, i32);
|
||||
v2i64 __builtin_msa_splat_d (v2i64, i32);
|
||||
|
||||
v16i8 __builtin_msa_splati_b (v16i8, imm0_15);
|
||||
v8i16 __builtin_msa_splati_h (v8i16, imm0_7);
|
||||
v4i32 __builtin_msa_splati_w (v4i32, imm0_3);
|
||||
v2i64 __builtin_msa_splati_d (v2i64, imm0_1);
|
||||
|
||||
v16i8 __builtin_msa_sra_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_sra_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_sra_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_sra_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_srai_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_srai_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_srai_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_srai_d (v2i64, imm0_63);
|
||||
|
||||
v16i8 __builtin_msa_srar_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_srar_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_srar_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_srar_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_srari_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_srari_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_srari_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_srari_d (v2i64, imm0_63);
|
||||
|
||||
v16i8 __builtin_msa_srl_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_srl_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_srl_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_srl_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_srli_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_srli_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_srli_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_srli_d (v2i64, imm0_63);
|
||||
|
||||
v16i8 __builtin_msa_srlr_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_srlr_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_srlr_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_srlr_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_srlri_b (v16i8, imm0_7);
|
||||
v8i16 __builtin_msa_srlri_h (v8i16, imm0_15);
|
||||
v4i32 __builtin_msa_srlri_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_srlri_d (v2i64, imm0_63);
|
||||
|
||||
void __builtin_msa_st_b (v16i8, void *, imm_n512_511);
|
||||
void __builtin_msa_st_h (v8i16, void *, imm_n1024_1022);
|
||||
void __builtin_msa_st_w (v4i32, void *, imm_n2048_2044);
|
||||
void __builtin_msa_st_d (v2i64, void *, imm_n4096_4088);
|
||||
|
||||
v16i8 __builtin_msa_subs_s_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_subs_s_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_subs_s_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_subs_s_d (v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_subs_u_b (v16u8, v16u8);
|
||||
v8u16 __builtin_msa_subs_u_h (v8u16, v8u16);
|
||||
v4u32 __builtin_msa_subs_u_w (v4u32, v4u32);
|
||||
v2u64 __builtin_msa_subs_u_d (v2u64, v2u64);
|
||||
|
||||
v16u8 __builtin_msa_subsus_u_b (v16u8, v16i8);
|
||||
v8u16 __builtin_msa_subsus_u_h (v8u16, v8i16);
|
||||
v4u32 __builtin_msa_subsus_u_w (v4u32, v4i32);
|
||||
v2u64 __builtin_msa_subsus_u_d (v2u64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_subsuu_s_b (v16u8, v16u8);
|
||||
v8i16 __builtin_msa_subsuu_s_h (v8u16, v8u16);
|
||||
v4i32 __builtin_msa_subsuu_s_w (v4u32, v4u32);
|
||||
v2i64 __builtin_msa_subsuu_s_d (v2u64, v2u64);
|
||||
|
||||
v16i8 __builtin_msa_subv_b (v16i8, v16i8);
|
||||
v8i16 __builtin_msa_subv_h (v8i16, v8i16);
|
||||
v4i32 __builtin_msa_subv_w (v4i32, v4i32);
|
||||
v2i64 __builtin_msa_subv_d (v2i64, v2i64);
|
||||
|
||||
v16i8 __builtin_msa_subvi_b (v16i8, imm0_31);
|
||||
v8i16 __builtin_msa_subvi_h (v8i16, imm0_31);
|
||||
v4i32 __builtin_msa_subvi_w (v4i32, imm0_31);
|
||||
v2i64 __builtin_msa_subvi_d (v2i64, imm0_31);
|
||||
|
||||
v16i8 __builtin_msa_vshf_b (v16i8, v16i8, v16i8);
|
||||
v8i16 __builtin_msa_vshf_h (v8i16, v8i16, v8i16);
|
||||
v4i32 __builtin_msa_vshf_w (v4i32, v4i32, v4i32);
|
||||
v2i64 __builtin_msa_vshf_d (v2i64, v2i64, v2i64);
|
||||
|
||||
v16u8 __builtin_msa_xor_v (v16u8, v16u8);
|
||||
|
||||
v16u8 __builtin_msa_xori_b (v16u8, imm0_255);
|
||||
|
|
@ -21,6 +21,11 @@ pub fn arm_functions(input: TokenStream) -> TokenStream {
|
|||
functions(input, &["core_arch/src/arm", "core_arch/src/aarch64"])
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn mips_functions(input: TokenStream) -> TokenStream {
|
||||
functions(input, &["core_arch/src/mips"])
|
||||
}
|
||||
|
||||
fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
|
||||
let dir = Path::new(env!("CARGO_MANIFEST_DIR"));
|
||||
let root = dir.parent().expect("root-dir not found");
|
||||
|
|
@ -177,6 +182,18 @@ fn to_type(t: &syn::Type) -> proc_macro2::TokenStream {
|
|||
"poly16x4_t" => quote! { &POLY16X4 },
|
||||
"poly16x8_t" => quote! { &POLY16X8 },
|
||||
|
||||
"v16i8" => quote! { &v16i8 },
|
||||
"v8i16" => quote! { &v8i16 },
|
||||
"v4i32" => quote! { &v4i32 },
|
||||
"v2i64" => quote! { &v2i64 },
|
||||
"v16u8" => quote! { &v16u8 },
|
||||
"v8u16" => quote! { &v8u16 },
|
||||
"v4u32" => quote! { &v4u32 },
|
||||
"v2u64" => quote! { &v2u64 },
|
||||
"v8f16" => quote! { &v8f16 },
|
||||
"v4f32" => quote! { &v4f32 },
|
||||
"v2f64" => quote! { &v2f64 },
|
||||
|
||||
s => panic!("unspported type: \"{}\"", s),
|
||||
},
|
||||
syn::Type::Ptr(syn::TypePtr { ref elem, .. })
|
||||
|
|
|
|||
329
library/stdarch/crates/stdsimd-verify/tests/mips.rs
Normal file
329
library/stdarch/crates/stdsimd-verify/tests/mips.rs
Normal file
|
|
@ -0,0 +1,329 @@
|
|||
//! Verification of MIPS MSA intrinsics
|
||||
#![feature(try_trait)]
|
||||
#![allow(bad_style, unused)]
|
||||
|
||||
// This file is obtained from
|
||||
// https://gcc.gnu.org/onlinedocs//gcc/MIPS-SIMD-Architecture-Built-in-Functions.html
|
||||
static HEADER: &str = include_str!("../mips-msa.h");
|
||||
|
||||
stdsimd_verify::mips_functions!(static FUNCTIONS);
|
||||
|
||||
struct Function {
|
||||
name: &'static str,
|
||||
arguments: &'static [&'static Type],
|
||||
ret: Option<&'static Type>,
|
||||
target_feature: Option<&'static str>,
|
||||
instrs: &'static [&'static str],
|
||||
file: &'static str,
|
||||
required_const: &'static [usize],
|
||||
}
|
||||
|
||||
static F16: Type = Type::PrimFloat(16);
|
||||
static F32: Type = Type::PrimFloat(32);
|
||||
static F64: Type = Type::PrimFloat(64);
|
||||
static I8: Type = Type::PrimSigned(8);
|
||||
static I16: Type = Type::PrimSigned(16);
|
||||
static I32: Type = Type::PrimSigned(32);
|
||||
static I64: Type = Type::PrimSigned(64);
|
||||
static U8: Type = Type::PrimUnsigned(8);
|
||||
static U16: Type = Type::PrimUnsigned(16);
|
||||
static U32: Type = Type::PrimUnsigned(32);
|
||||
static U64: Type = Type::PrimUnsigned(64);
|
||||
static NEVER: Type = Type::Never;
|
||||
static TUPLE: Type = Type::Tuple;
|
||||
static v16i8: Type = Type::I(8, 16, 1);
|
||||
static v8i16: Type = Type::I(16, 8, 1);
|
||||
static v4i32: Type = Type::I(32, 4, 1);
|
||||
static v2i64: Type = Type::I(64, 2, 1);
|
||||
static v16u8: Type = Type::U(8, 16, 1);
|
||||
static v8u16: Type = Type::U(16, 8, 1);
|
||||
static v4u32: Type = Type::U(32, 4, 1);
|
||||
static v2u64: Type = Type::U(64, 2, 1);
|
||||
static v8f16: Type = Type::F(16, 8, 1);
|
||||
static v4f32: Type = Type::F(32, 4, 1);
|
||||
static v2f64: Type = Type::F(64, 2, 1);
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||
enum Type {
|
||||
PrimFloat(u8),
|
||||
PrimSigned(u8),
|
||||
PrimUnsigned(u8),
|
||||
PrimPoly(u8),
|
||||
MutPtr(&'static Type),
|
||||
ConstPtr(&'static Type),
|
||||
Ptr(&'static Type),
|
||||
Tuple,
|
||||
I(u8, u8, u8),
|
||||
U(u8, u8, u8),
|
||||
P(u8, u8, u8),
|
||||
F(u8, u8, u8),
|
||||
Never,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
#[allow(non_camel_case_types)]
|
||||
enum MsaTy {
|
||||
v16i8,
|
||||
v8i16,
|
||||
v4i32,
|
||||
v2i64,
|
||||
v16u8,
|
||||
v8u16,
|
||||
v4u32,
|
||||
v2u64,
|
||||
v8f16,
|
||||
v4f32,
|
||||
v2f64,
|
||||
imm0_1,
|
||||
imm0_3,
|
||||
imm0_7,
|
||||
imm0_15,
|
||||
imm0_31,
|
||||
imm0_63,
|
||||
imm0_255,
|
||||
imm_n16_15,
|
||||
imm_n512_511,
|
||||
imm_n1024_1022,
|
||||
imm_n2048_2044,
|
||||
imm_n4096_4088,
|
||||
i32,
|
||||
u32,
|
||||
i64,
|
||||
u64,
|
||||
Void,
|
||||
VoidPtr,
|
||||
}
|
||||
|
||||
impl<'a> From<&'a str> for MsaTy {
|
||||
fn from(s: &'a str) -> MsaTy {
|
||||
match s {
|
||||
"v16i8" => MsaTy::v16i8,
|
||||
"v8i16" => MsaTy::v8i16,
|
||||
"v4i32" => MsaTy::v4i32,
|
||||
"v2i64" => MsaTy::v2i64,
|
||||
"v16u8" => MsaTy::v16u8,
|
||||
"v8u16" => MsaTy::v8u16,
|
||||
"v4u32" => MsaTy::v4u32,
|
||||
"v2u64" => MsaTy::v2u64,
|
||||
"v8f16" => MsaTy::v8f16,
|
||||
"v4f32" => MsaTy::v4f32,
|
||||
"v2f64" => MsaTy::v2f64,
|
||||
"imm0_1" => MsaTy::imm0_1,
|
||||
"imm0_3" => MsaTy::imm0_3,
|
||||
"imm0_7" => MsaTy::imm0_7,
|
||||
"imm0_15" => MsaTy::imm0_15,
|
||||
"imm0_31" => MsaTy::imm0_31,
|
||||
"imm0_63" => MsaTy::imm0_63,
|
||||
"imm0_255" => MsaTy::imm0_255,
|
||||
"imm_n16_15" => MsaTy::imm_n16_15,
|
||||
"imm_n512_511" => MsaTy::imm_n512_511,
|
||||
"imm_n1024_1022" => MsaTy::imm_n1024_1022,
|
||||
"imm_n2048_2044" => MsaTy::imm_n2048_2044,
|
||||
"imm_n4096_4088" => MsaTy::imm_n4096_4088,
|
||||
"i32" => MsaTy::i32,
|
||||
"u32" => MsaTy::u32,
|
||||
"i64" => MsaTy::i64,
|
||||
"u64" => MsaTy::u64,
|
||||
"void" => MsaTy::Void,
|
||||
"void *" => MsaTy::VoidPtr,
|
||||
v => panic!("unknown ty: \"{}\"", v),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct MsaIntrinsic {
|
||||
id: String,
|
||||
arg_tys: Vec<MsaTy>,
|
||||
ret_ty: MsaTy,
|
||||
instruction: String,
|
||||
}
|
||||
|
||||
impl std::convert::TryFrom<&'static str> for MsaIntrinsic {
|
||||
// The intrinsics are just C function declarations of the form:
|
||||
// $ret_ty __builtin_${fn_id}($($arg_ty),*);
|
||||
type Error = std::option::NoneError;
|
||||
fn try_from(line: &'static str) -> Result<Self, Self::Error> {
|
||||
let first_whitespace = line.find(char::is_whitespace)?;
|
||||
let ret_ty = &line[0..first_whitespace];
|
||||
let ret_ty = MsaTy::from(ret_ty);
|
||||
|
||||
let first_parentheses = line.find('(')?;
|
||||
assert!(first_parentheses > first_whitespace);
|
||||
let id = &line[first_whitespace+1..first_parentheses].trim();
|
||||
assert!(id.starts_with("__builtin"));
|
||||
let mut id_str = "_".to_string();
|
||||
id_str += &id[9..];
|
||||
let id = id_str;
|
||||
|
||||
let mut arg_tys = Vec::new();
|
||||
|
||||
let last_parentheses = line.find(')')?;
|
||||
for arg in (&line[first_parentheses+1..last_parentheses]).split(',') {
|
||||
let arg = arg.trim();
|
||||
arg_tys.push(MsaTy::from(arg));
|
||||
}
|
||||
|
||||
// The instruction is the intrinsic name without the __msa_ prefix.
|
||||
let instruction = &id[6..];
|
||||
let mut instruction = instruction.to_string();
|
||||
// With all underscores but the first one replaced with a `.`
|
||||
if let Some(first_underscore) = instruction.find('_') {
|
||||
let postfix = instruction[first_underscore+1 ..].replace('_', ".");
|
||||
instruction = instruction[0..=first_underscore].to_string();
|
||||
instruction += &postfix;
|
||||
}
|
||||
|
||||
Ok(
|
||||
MsaIntrinsic {
|
||||
id,
|
||||
ret_ty,
|
||||
arg_tys,
|
||||
instruction,
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn verify_all_signatures() {
|
||||
// Parse the C intrinsic header file:
|
||||
let mut intrinsics = std::collections::HashMap::<String, MsaIntrinsic>::new();
|
||||
for line in HEADER.lines() {
|
||||
if line.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
use std::convert::TryFrom;
|
||||
let intrinsic: MsaIntrinsic = TryFrom::try_from(line).expect(
|
||||
&format!("failed to parse line: \"{}\"", line)
|
||||
);
|
||||
assert!(!intrinsics.contains_key(&intrinsic.id));
|
||||
intrinsics.insert(intrinsic.id.clone(), intrinsic);
|
||||
}
|
||||
|
||||
let mut all_valid = true;
|
||||
for rust in FUNCTIONS {
|
||||
// Skip some intrinsics that aren't part of MSA
|
||||
match rust.name {
|
||||
"break_" => continue,
|
||||
_ => {}
|
||||
}
|
||||
let mips = match intrinsics.get(rust.name) {
|
||||
Some(i) => i,
|
||||
None => {
|
||||
eprintln!(
|
||||
"missing mips definition for {:?} in {}",
|
||||
rust.name, rust.file
|
||||
);
|
||||
all_valid = false;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(e) = matches(rust, mips) {
|
||||
println!("failed to verify `{}`", rust.name);
|
||||
println!(" * {}", e);
|
||||
all_valid = false;
|
||||
}
|
||||
}
|
||||
assert!(all_valid);
|
||||
}
|
||||
|
||||
fn matches(rust: &Function, mips: &MsaIntrinsic) -> Result<(), String> {
|
||||
macro_rules! bail {
|
||||
($($t:tt)*) => (return Err(format!($($t)*)))
|
||||
}
|
||||
|
||||
if rust.ret.is_none() && mips.ret_ty != MsaTy::Void {
|
||||
bail!("mismatched return value")
|
||||
}
|
||||
|
||||
if rust.arguments.len() != mips.arg_tys.len() {
|
||||
bail!("mismatched argument lengths");
|
||||
}
|
||||
|
||||
let mut nconst = 0;
|
||||
for (i, (rust_arg, mips_arg))
|
||||
in rust.arguments.iter().zip(mips.arg_tys.iter()).enumerate() {
|
||||
match mips_arg {
|
||||
MsaTy::v16i8 if **rust_arg == v16i8 => (),
|
||||
MsaTy::v8i16 if **rust_arg == v8i16 => (),
|
||||
MsaTy::v4i32 if **rust_arg == v4i32 => (),
|
||||
MsaTy::v2i64 if **rust_arg == v2i64 => (),
|
||||
MsaTy::v16u8 if **rust_arg == v16u8 => (),
|
||||
MsaTy::v8u16 if **rust_arg == v8u16 => (),
|
||||
MsaTy::v4u32 if **rust_arg == v4u32 => (),
|
||||
MsaTy::v2u64 if **rust_arg == v2u64 => (),
|
||||
MsaTy::v4f32 if **rust_arg == v4f32 => (),
|
||||
MsaTy::v2f64 if **rust_arg == v2f64 => (),
|
||||
MsaTy::imm0_1 |
|
||||
MsaTy::imm0_3 |
|
||||
MsaTy::imm0_7 |
|
||||
MsaTy::imm0_15 |
|
||||
MsaTy::imm0_31 |
|
||||
MsaTy::imm0_63 |
|
||||
MsaTy::imm0_255 |
|
||||
MsaTy::imm_n16_15 |
|
||||
MsaTy::imm_n512_511 |
|
||||
MsaTy::imm_n1024_1022 |
|
||||
MsaTy::imm_n2048_2044 |
|
||||
MsaTy::imm_n4096_4088
|
||||
if **rust_arg == I32 => (),
|
||||
MsaTy::i32 if **rust_arg == I32 => (),
|
||||
MsaTy::i64 if **rust_arg == I64 => (),
|
||||
MsaTy::u32 if **rust_arg == U32 => (),
|
||||
MsaTy::u64 if **rust_arg == U64 => (),
|
||||
MsaTy::VoidPtr if **rust_arg == Type::Ptr(&U8) => (),
|
||||
m => {
|
||||
bail!(
|
||||
"mismatched argument \"{}\"= \"{:?}\" != \"{:?}\"",
|
||||
i, m, *rust_arg
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
let is_const = match mips_arg {
|
||||
MsaTy::imm0_1 |
|
||||
MsaTy::imm0_3 |
|
||||
MsaTy::imm0_7 |
|
||||
MsaTy::imm0_15 |
|
||||
MsaTy::imm0_31 |
|
||||
MsaTy::imm0_63 |
|
||||
MsaTy::imm0_255 |
|
||||
MsaTy::imm_n16_15 |
|
||||
MsaTy::imm_n512_511 |
|
||||
MsaTy::imm_n1024_1022 |
|
||||
MsaTy::imm_n2048_2044 |
|
||||
MsaTy::imm_n4096_4088 => true,
|
||||
_ => false,
|
||||
};
|
||||
if is_const {
|
||||
nconst += 1;
|
||||
if !rust.required_const.contains(&i) {
|
||||
bail!("argument const mismatch");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if nconst != rust.required_const.len() {
|
||||
bail!("wrong number of const arguments");
|
||||
}
|
||||
|
||||
if rust.target_feature != Some("msa") {
|
||||
bail!("wrong target_feature");
|
||||
}
|
||||
|
||||
/* FIXME:
|
||||
if !rust.instrs.is_empty() {
|
||||
if rust.instrs[0] != mips.instruction {
|
||||
bail!("wrong instruction: \"{}\" != \"{}\"", rust.instrs[0], mips.instruction);
|
||||
}
|
||||
} else {
|
||||
bail!(
|
||||
"missing assert_instr for \"{}\" (should be \"{}\")",
|
||||
mips.id, mips.instruction);
|
||||
}*/
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue