Commit 6cf538da by Robert Suchanek Committed by Robert Suchanek

Add support for MIPS SIMD Architecture (MSA).

gcc/
	* config.gcc: Add MSA header file for mips*-*-* target.
	* config/mips/constraints.md (YI, YC, YZ, Unv5, Uuv5, Usv5, Uuv6)
	(Ubv8i, Urv8):	New constraints.
	* config/mips/mips-ftypes.def: Add function types for MSA
	builtins.
	* config/mips/mips-modes.def (V16QI, V8HI, V4SI, V2DI, V4SF)
	(V2DF, V32QI, V16HI, V8SI, V4DI, V8SF, V4DF): New modes.
	* config/mips/mips-msa.md: New file.
	* config/mips/mips-protos.h
	(mips_split_128bit_const_insns): New prototype.
	(mips_msa_idiv_insns): Likewise.
	(mips_split_128bit_move): Likewise.
	(mips_split_128bit_move_p): Likewise.
	(mips_split_msa_copy_d): Likewise.
	(mips_split_msa_insert_d): Likewise.
	(mips_split_msa_fill_d): Likewise.
	(mips_expand_msa_branch): Likewise.
	(mips_const_vector_same_val_p): Likewise.
	(mips_const_vector_same_bytes_p): Likewise.
	(mips_const_vector_same_int_p): Likewise.
	(mips_const_vector_shuffle_set_p): Likewise.
	(mips_const_vector_bitimm_set_p): Likewise.
	(mips_const_vector_bitimm_clr_p): Likewise.
	(mips_msa_vec_parallel_const_half): Likewise.
	(mips_msa_output_division): Likewise.
	(mips_ldst_scaled_shift): Likewise.
	(mips_expand_vec_cond_expr): Likewise.
	* config/mips/mips.c (enum mips_builtin_type): Add
	MIPS_BUILTIN_MSA_TEST_BRANCH.
	(mips_gen_const_int_vector_shuffle): New prototype.
	(mips_const_vector_bitimm_set_p): New function.
	(mips_const_vector_bitimm_clr_p): Likewise.
	(mips_const_vector_same_val_p): Likewise.
	(mips_const_vector_same_bytes_p): Likewise.
	(mips_const_vector_same_int_p): Likewise.
	(mips_const_vector_shuffle_set_p): Likewise.
	(mips_symbol_insns): Forbid loading symbols via immediate for
	MSA.
	(mips_valid_offset_p): Limit offset to 10-bit for MSA loads and
	stores.
	(mips_valid_lo_sum_p): Forbid loadings symbols via %lo(base) for
	MSA.
	(mips_lx_address_p): Add support load indexed address for MSA.
	(mips_address_insns): Add calculation of instructions needed for
	stores and loads for MSA.
	(mips_const_insns): Move CONST_DOUBLE below CONST_VECTOR.  Handle
	CONST_VECTOR for MSA and let it fall through.
	(mips_ldst_scaled_shift): New function.
	(mips_subword_at_byte): Likewise.
	(mips_msa_idiv_insns): Likewise.
	(mips_legitimize_move): Validate MSA moves.
	(mips_rtx_costs): Add UNGE, UNGT, UNLE, UNLT cases.  Add
	calculation of costs for MSA division.
	(mips_split_move_p): Check if MSA moves need splitting.
	(mips_split_move): Split MSA moves if necessary.
	(mips_split_128bit_move_p): New function.
	(mips_split_128bit_move): Likewise.
	(mips_split_msa_copy_d): Likewise.
	(mips_split_msa_insert_d): Likewise.
	(mips_split_msa_fill_d): Likewise.
	(mips_output_move): Handle MSA moves.
	(mips_expand_msa_branch): New function.
	(mips_print_operand): Add 'E', 'B', 'w', 'v' and 'V' modifiers.
	Reinstate 'y' modifier.
	(mips_file_start): Add MSA .gnu_attribute.
	(mips_hard_regno_mode_ok_p): Allow TImode and 128-bit vectors in
	FPRs.
	(mips_hard_regno_nregs): Always return 1 for MSA supported mode.
	(mips_class_max_nregs): Add register size for MSA supported mode.
	(mips_cannot_change_mode_class): Allow conversion between MSA
	vector modes and TImode.
	(mips_mode_ok_for_mov_fmt_p): Allow MSA to use move.v
	instruction.
	(mips_secondary_reload_class): Force MSA loads/stores via memory.
	(mips_preferred_simd_mode): Add preffered modes for MSA.
	(mips_vector_mode_supported_p): Add MSA supported modes.
	(mips_autovectorize_vector_sizes): New function.
	(mips_msa_output_division): Likewise.
	(MSA_BUILTIN, MIPS_BUILTIN_DIRECT_NO_TARGET)
	(MSA_NO_TARGET_BUILTIN, MSA_BUILTIN_TEST_BRANCH): New macros.
	(CODE_FOR_msa_adds_s_b, CODE_FOR_msa_adds_s_h)
	(CODE_FOR_msa_adds_s_w, CODE_FOR_msa_adds_s_d)
	(CODE_FOR_msa_adds_u_b, CODE_FOR_msa_adds_u_h)
	(CODE_FOR_msa_adds_u_w, CODE_FOR_msa_adds_u_du
	(CODE_FOR_msa_addv_b, CODE_FOR_msa_addv_h, CODE_FOR_msa_addv_w)
	(CODE_FOR_msa_addv_d, CODE_FOR_msa_and_v, CODE_FOR_msa_bmnz_v)
	(CODE_FOR_msa_bmnzi_b, CODE_FOR_msa_bmz_v, CODE_FOR_msa_bmzi_b)
	(CODE_FOR_msa_bnz_v, CODE_FOR_msa_bz_v, CODE_FOR_msa_bsel_v)
	(CODE_FOR_msa_bseli_b, CODE_FOR_msa_ceqi_h, CODE_FOR_msa_ceqi_w)
	(CODE_FOR_msa_ceqi_d, CODE_FOR_msa_clti_s_b)
	(CODE_FOR_msa_clti_s_h, CODE_FOR_msa_clti_s_w)
	(CODE_FOR_msa_clti_s_d, CODE_FOR_msa_clti_u_b)
	(CODE_FOR_msa_clti_u_h, CODE_FOR_msa_clti_u_w)
	(CODE_FOR_msa_clti_u_d, CODE_FOR_msa_clei_s_b)
	(CODE_FOR_msa_clei_s_h, CODE_FOR_msa_clei_s_w)
	(CODE_FOR_msa_clei_s_d, CODE_FOR_msa_clei_u_b)
	(CODE_FOR_msa_clei_u_h, CODE_FOR_msa_clei_u_w)
	(CODE_FOR_msa_clei_u_d, CODE_FOR_msa_div_s_b)
	(CODE_FOR_msa_div_s_h, CODE_FOR_msa_div_s_w)
	(CODE_FOR_msa_div_s_d, CODE_FOR_msa_div_u_b)
	(CODE_FOR_msa_div_u_h, CODE_FOR_msa_div_u_w)
	(CODE_FOR_msa_div_u_d, CODE_FOR_msa_fadd_w, CODE_FOR_msa_fadd_d)
	(CODE_FOR_msa_fexdo_w, CODE_FOR_msa_ftrunc_s_w)
	(CODE_FOR_msa_ftrunc_s_d, CODE_FOR_msa_ftrunc_u_w)
	(CODE_FOR_msa_ftrunc_u_d, CODE_FOR_msa_ffint_s_w)
	(CODE_FOR_msa_ffint_s_d, CODE_FOR_msa_ffint_u_w)
	(CODE_FOR_msa_ffint_u_d, CODE_FOR_msa_fsub_w)
	(CODE_FOR_msa_fsub_d, CODE_FOR_msa_fmsub_d, CODE_FOR_msa_fmadd_w)
	(CODE_FOR_msa_fmadd_d, CODE_FOR_msa_fmsub_w, CODE_FOR_msa_fmul_w)
	(CODE_FOR_msa_fmul_d, CODE_FOR_msa_fdiv_w, CODE_FOR_msa_fdiv_d)
	(CODE_FOR_msa_fmax_w, CODE_FOR_msa_fmax_d, CODE_FOR_msa_fmax_a_w)
	(CODE_FOR_msa_fmax_a_d, CODE_FOR_msa_fmin_w, CODE_FOR_msa_fmin_d)
	(CODE_FOR_msa_fmin_a_w, CODE_FOR_msa_fmin_a_d)
	(CODE_FOR_msa_fsqrt_w, CODE_FOR_msa_fsqrt_d)
	(CODE_FOR_msa_max_s_b, CODE_FOR_msa_max_s_h)
	(CODE_FOR_msa_max_s_w, CODE_FOR_msa_max_s_d)
	(CODE_FOR_msa_max_u_b, CODE_FOR_msa_max_u_h)
	(CODE_FOR_msa_max_u_w, CODE_FOR_msa_max_u_d)
	(CODE_FOR_msa_min_s_b, CODE_FOR_msa_min_s_h)
	(CODE_FOR_msa_min_s_w, CODE_FOR_msa_min_s_d)
	(CODE_FOR_msa_min_u_b, CODE_FOR_msa_min_u_h)
	(CODE_FOR_msa_min_u_w, CODE_FOR_msa_min_u_d)
	(CODE_FOR_msa_mod_s_b, CODE_FOR_msa_mod_s_h)
	(CODE_FOR_msa_mod_s_w, CODE_FOR_msa_mod_s_d)
	(CODE_FOR_msa_mod_u_b, CODE_FOR_msa_mod_u_h)
	(CODE_FOR_msa_mod_u_w, CODE_FOR_msa_mod_u_d)
	(CODE_FOR_msa_mod_s_b, CODE_FOR_msa_mod_s_h)
	(CODE_FOR_msa_mod_s_w, CODE_FOR_msa_mod_s_d)
	(CODE_FOR_msa_mod_u_b, CODE_FOR_msa_mod_u_h)
	(CODE_FOR_msa_mod_u_w, CODE_FOR_msa_mod_u_d)
	(CODE_FOR_msa_mulv_b, CODE_FOR_msa_mulv_h, CODE_FOR_msa_mulv_w)
	(CODE_FOR_msa_mulv_d, CODE_FOR_msa_nlzc_b, CODE_FOR_msa_nlzc_h)
	(CODE_FOR_msa_nlzc_w, CODE_FOR_msa_nlzc_d, CODE_FOR_msa_nor_v)
	(CODE_FOR_msa_or_v, CODE_FOR_msa_ori_b, CODE_FOR_msa_nori_b)
	(CODE_FOR_msa_pcnt_b, CODE_FOR_msa_pcnt_h, CODE_FOR_msa_pcnt_w)
	(CODE_FOR_msa_pcnt_d, CODE_FOR_msa_xor_v, CODE_FOR_msa_xori_b)
	(CODE_FOR_msa_sll_b, CODE_FOR_msa_sll_h, CODE_FOR_msa_sll_w)
	(CODE_FOR_msa_sll_d, CODE_FOR_msa_slli_b, CODE_FOR_msa_slli_h)
	(CODE_FOR_msa_slli_w, CODE_FOR_msa_slli_d, CODE_FOR_msa_sra_b)
	(CODE_FOR_msa_sra_h, CODE_FOR_msa_sra_w, CODE_FOR_msa_sra_d)
	(CODE_FOR_msa_srai_b, CODE_FOR_msa_srai_h, CODE_FOR_msa_srai_w)
	(CODE_FOR_msa_srai_d, CODE_FOR_msa_srl_b, CODE_FOR_msa_srl_h)
	(CODE_FOR_msa_srl_w, CODE_FOR_msa_srl_d, CODE_FOR_msa_srli_b)
	(CODE_FOR_msa_srli_h, CODE_FOR_msa_srli_w, CODE_FOR_msa_srli_d)
	(CODE_FOR_msa_subv_b, CODE_FOR_msa_subv_h, CODE_FOR_msa_subv_w)
	(CODE_FOR_msa_subv_d, CODE_FOR_msa_subvi_b, CODE_FOR_msa_subvi_h)
	(CODE_FOR_msa_subvi_w, CODE_FOR_msa_subvi_d, CODE_FOR_msa_move_v)
	(CODE_FOR_msa_vshf_b, CODE_FOR_msa_vshf_h, CODE_FOR_msa_vshf_w)
	(CODE_FOR_msa_vshf_d, CODE_FOR_msa_ilvod_d, CODE_FOR_msa_ilvev_d)
	(CODE_FOR_msa_pckod_d, CODE_FOR_msa_pckdev_d, CODE_FOR_msa_ldi_b)
	(CODE_FOR_msa_ldi_hi, CODE_FOR_msa_ldi_w)
	(CODE_FOR_msa_ldi_d): New code_aliasing macros.
	(mips_builtins): Add MSA sll_b, sll_h, sll_w, sll_d, slli_b,
	slli_h,	slli_w, slli_d, sra_b, sra_h, sra_w, sra_d, srai_b,
	srai_h, srai_w,	srai_d, srar_b, srar_h, srar_w, srar_d, srari_b,
	srari_h, srari_w, srari_d, srl_b, srl_h, srl_w, srl_d, srli_b,
	srli_h, srli_w, srli_d, srlr_b, srlr_h, srlr_w, srlr_d, srlri_b,
	srlri_h, srlri_w, srlri_d, bclr_b, bclr_h, bclr_w, bclr_d,
	bclri_b, bclri_h, bclri_w, bclri_d, bset_b, bset_h, bset_w,
	bset_d, bseti_b, bseti_h, bseti_w, bseti_d, bneg_b, bneg_h,
	bneg_w, bneg_d, bnegi_b, bnegi_h, bnegi_w, bnegi_d, binsl_b,
	binsl_h, binsl_w, binsl_d, binsli_b, binsli_h, binsli_w,
	binsli_d, binsr_b, binsr_h, binsr_w, binsr_d, binsri_b, binsri_h,
	binsri_w, binsri_d, addv_b, addv_h, addv_w, addv_d, addvi_b,
	addvi_h, addvi_w, addvi_d, subv_b, subv_h, subv_w, subv_d,
	subvi_b, subvi_h, subvi_w, subvi_d, max_s_b, max_s_h, max_s_w,
	max_s_d, maxi_s_b, maxi_s_h, maxi_s_w, maxi_s_d, max_u_b,
	max_u_h, max_u_w, max_u_d, maxi_u_b, maxi_u_h, maxi_u_w,
	maxi_u_d, min_s_b, min_s_h, min_s_w, min_s_d, mini_s_b, mini_s_h,
	mini_s_w, mini_s_d, min_u_b, min_u_h, min_u_w, min_u_d, mini_u_b,
	mini_u_h, mini_u_w, mini_u_d, max_a_b, max_a_h, max_a_w, max_a_d,
	min_a_b, min_a_h, min_a_w, min_a_d, ceq_b, ceq_h, ceq_w, ceq_d,
	ceqi_b, ceqi_h, ceqi_w, ceqi_d, clt_s_b, clt_s_h, clt_s_w,
	clt_s_d, clti_s_b, clti_s_h, clti_s_w, clti_s_d, clt_u_b,
	clt_u_h, clt_u_w, clt_u_d, clti_u_b, clti_u_h, clti_u_w,
	clti_u_d, cle_s_b, cle_s_h, cle_s_w, cle_s_d, clei_s_b, clei_s_h,
	clei_s_w, clei_s_d, cle_u_b, cle_u_h, cle_u_w, cle_u_d, clei_u_b,
	clei_u_h, clei_u_w, clei_u_d, ld_b, ld_h, ld_w, ld_d, st_b, st_h,
	st_w, st_d, sat_s_b, sat_s_h, sat_s_w, sat_s_d, sat_u_b, sat_u_h,
	sat_u_w, sat_u_d, add_a_b, add_a_h, add_a_w, add_a_d, adds_a_b,
	adds_a_h, adds_a_w, adds_a_d, adds_s_b, adds_s_h, adds_s_w,
	adds_s_d, adds_u_b, adds_u_h, adds_u_w, adds_u_d, ave_s_b,
	ave_s_h, ave_s_w, ave_s_d, ave_u_b, ave_u_h, ave_u_w, ave_u_d,
	aver_s_b, aver_s_h, aver_s_w, aver_s_d, aver_u_b, aver_u_h,
	aver_u_w, aver_u_d, subs_s_b, subs_s_h, subs_s_w, subs_s_d,
	subs_u_b, subs_u_h, subs_u_w, subs_u_d, subsuu_s_b, subsuu_s_h,
	subsuu_s_w, subsuu_s_d, subsus_u_b, subsus_u_h, subsus_u_w,
	subsus_u_d, asub_s_b, asub_s_h, asub_s_w, asub_s_d, asub_u_b,
	asub_u_h, asub_u_w, asub_u_d, mulv_b, mulv_h, mulv_w, mulv_d,
	maddv_b, maddv_h, maddv_w, maddv_d, msubv_b, msubv_h, msubv_w,
	msubv_d, div_s_b, div_s_h, div_s_w, div_s_d, div_u_b, div_u_h,
	div_u_w, div_u_d, hadd_s_h, hadd_s_w, hadd_s_d, hadd_u_h,
	hadd_u_w, hadd_u_d, hsub_s_h, hsub_s_w, hsub_s_d, hsub_u_h,
	hsub_u_w, hsub_u_d, mod_s_b, mod_s_h, mod_s_w, mod_s_d, mod_u_b,
	mod_u_h, mod_u_w, mod_u_d, dotp_s_h, dotp_s_w, dotp_s_d,
	dotp_u_h, dotp_u_w, dotp_u_d, dpadd_s_h, dpadd_s_w, dpadd_s_d,
	dpadd_u_h, dpadd_u_w, dpadd_u_d, dpsub_s_h, dpsub_s_w, dpsub_s_d,
	dpsub_u_h, dpsub_u_w, dpsub_u_d, sld_b, sld_h, sld_w, sld_d,
	sldi_b, sldi_h, sldi_w, sldi_d, splat_b, splat_h, splat_w,
	splat_d, splati_b, splati_h, splati_w, splati_d, pckev_b,
	pckev_h, pckev_w, pckev_d, pckod_b, pckod_h, pckod_w, pckod_d,
	ilvl_b, ilvl_h, ilvl_w, ilvl_d, ilvr_b, ilvr_h, ilvr_w, ilvr_d,
	ilvev_b, ilvev_h, ilvev_w, ilvev_d, ilvod_b, ilvod_h, ilvod_w,
	ilvod_d, vshf_b, vshf_h, vshf_w, vshf_d, and_v, andi_b, or_v,
	ori_b, nor_v, nori_b, xor_v, xori_b, bmnz_v, bmnzi_b, bmz_v,
	bmzi_b, bsel_v, bseli_b, shf_b, shf_h, shf_w, bnz_v, bz_v,
	fill_b, fill_h, fill_w, fill_d, pcnt_b, pcnt_h, pcnt_w,
	pcnt_d, nloc_b, nloc_h, nloc_w, nloc_d, nlzc_b, nlzc_h, nlzc_w,
	nlzc_d, copy_s_b, copy_s_h, copy_s_w, copy_s_d, copy_u_b,
	copy_u_h, copy_u_w, copy_u_d, insert_b, insert_h, insert_w,
	insert_d, insve_b, insve_h, insve_w, insve_d, bnz_b, bnz_h,
	bnz_w, bnz_d, bz_b, bz_h, bz_w, bz_d, ldi_b, ldi_h, ldi_w, ldi_d,
	fcaf_w, fcaf_d, fcor_w, fcor_d, fcun_w, fcun_d, fcune_w, fcune_d,
	fcueq_w, fcueq_d, fceq_w, fceq_d, fcne_w, fcne_d, fclt_w, fclt_d,
	fcult_w, fcult_d, fcle_w, fcle_d, fcule_w, fcule_d, fsaf_w,
	fsaf_d, fsor_w, fsor_d, fsun_w, fsun_d, fsune_w, fsune_d,
	fsueq_w, fsueq_d, fseq_w, fseq_d, fsne_w, fsne_d, fslt_w,
	fslt_d, fsult_w, fsult_d, fsle_w, fsle_d, fsule_w, fsule_d,
	fadd_w,	fadd_d, fsub_w, fsub_d, fmul_w, fmul_d, fdiv_w, fdiv_d,
	fmadd_w, fmadd_d, fmsub_w, fmsub_d, fexp2_w, fexp2_d, fexdo_h,
	fexdo_w, ftq_h, ftq_w, fmin_w, fmin_d, fmin_a_w, fmin_a_d,
	fmax_w, fmax_d, fmax_a_w, fmax_a_d, mul_q_h, mul_q_w, mulr_q_h,
	mulr_q_w, madd_q_h, madd_q_w, maddr_q_h, maddr_q_w, msub_q_h,
	msub_q_w, msubr_q_h, msubr_q_w, fclass_w, fclass_d, fsqrt_w,
	fsqrt_d, frcp_w, frcp_d, frint_w, frint_d, frsqrt_w, frsqrt_d,
	flog2_w, flog2_d, fexupl_w, fexupl_d, fexupr_w, fexupr_d, ffql_w,
	ffql_d, ffqr_w, ffqr_d, ftint_s_w, ftint_s_d, ftint_u_w,
	ftint_u_d, ftrunc_s_w, ftrunc_s_d, ftrunc_u_w, ftrunc_u_d,
	ffint_s_w, ffint_s_d, ffint_u_w, ffint_u_d, ctcmsa, cfcmsa,
	move_v builtins.
	(mips_get_builtin_decl_index): New array.
	(MIPS_ATYPE_QI, MIPS_ATYPE_HI, MIPS_ATYPE_V2DI, MIPS_ATYPE_V4SI)
	(MIPS_ATYPE_V8HI, MIPS_ATYPE_V16QI, MIPS_ATYPE_V2DF)
	(MIPS_ATYPE_V4SF, MIPS_ATYPE_UV2DI, MIPS_ATYPE_UV4SI)
	(MIPS_ATYPE_UV8HI, MIPS_ATYPE_UV16QI): New.
	(mips_init_builtins): Initialize mips_get_builtin_decl_index
	array.
	(TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION): Define target
	hook.
	(mips_expand_builtin_insn): Prepare operands for
	CODE_FOR_msa_addvi_b, CODE_FOR_msa_addvi_h, CODE_FOR_msa_addvi_w,
	CODE_FOR_msa_addvi_d, CODE_FOR_msa_clti_u_b,
	CODE_FOR_msa_clti_u_h, CODE_FOR_msa_clti_u_w,
	CODE_FOR_msa_clti_u_d, CODE_FOR_msa_clei_u_b,
	CODE_FOR_msa_clei_u_h, CODE_FOR_msa_clei_u_w,
	CODE_FOR_msa_clei_u_d, CODE_FOR_msa_maxi_u_b,
	CODE_FOR_msa_maxi_u_h, CODE_FOR_msa_maxi_u_w,
	CODE_FOR_msa_maxi_u_d, CODE_FOR_msa_mini_u_b,
	CODE_FOR_msa_mini_u_h, CODE_FOR_msa_mini_u_w,
	CODE_FOR_msa_mini_u_d, CODE_FOR_msa_subvi_b,
	CODE_FOR_msa_subvi_h, CODE_FOR_msa_subvi_w, CODE_FOR_msa_subvi_d,
	CODE_FOR_msa_ceqi_b, CODE_FOR_msa_ceqi_h, CODE_FOR_msa_ceqi_w,
	CODE_FOR_msa_ceqi_d, CODE_FOR_msa_clti_s_b,
	CODE_FOR_msa_clti_s_h, CODE_FOR_msa_clti_s_w,
	CODE_FOR_msa_clti_s_d, CODE_FOR_msa_clei_s_b,
	CODE_FOR_msa_clei_s_h, CODE_FOR_msa_clei_s_w,
	CODE_FOR_msa_clei_s_d, CODE_FOR_msa_maxi_s_b,
	CODE_FOR_msa_maxi_s_h, CODE_FOR_msa_maxi_s_w,
	CODE_FOR_msa_maxi_s_d, CODE_FOR_msa_mini_s_b,
	CODE_FOR_msa_mini_s_h, CODE_FOR_msa_mini_s_w,
	CODE_FOR_msa_mini_s_d, CODE_FOR_msa_andi_b, CODE_FOR_msa_ori_b,
	CODE_FOR_msa_nori_b, CODE_FOR_msa_xori_b, CODE_FOR_msa_bmzi_b,
	CODE_FOR_msa_bmnzi_b, CODE_FOR_msa_bseli_b, CODE_FOR_msa_fill_b,
	CODE_FOR_msa_fill_h, CODE_FOR_msa_fill_w, CODE_FOR_msa_fill_d,
	CODE_FOR_msa_ilvl_b, CODE_FOR_msa_ilvl_h, CODE_FOR_msa_ilvl_w,
	CODE_FOR_msa_ilvl_d, CODE_FOR_msa_ilvr_b, CODE_FOR_msa_ilvr_h,
	CODE_FOR_msa_ilvr_w, CODE_FOR_msa_ilvr_d, CODE_FOR_msa_ilvev_b,
	CODE_FOR_msa_ilvev_h, CODE_FOR_msa_ilvev_w, CODE_FOR_msa_ilvod_b,
	CODE_FOR_msa_ilvod_h, CODE_FOR_msa_ilvod_w, CODE_FOR_msa_pckev_b,
	CODE_FOR_msa_pckev_h, CODE_FOR_msa_pckev_w, CODE_FOR_msa_pckod_b,
	CODE_FOR_msa_pckod_h, CODE_FOR_msa_pckod_w, CODE_FOR_msa_slli_b,
	CODE_FOR_msa_slli_h, CODE_FOR_msa_slli_w, CODE_FOR_msa_slli_d,
	CODE_FOR_msa_srai_b, CODE_FOR_msa_srai_h, CODE_FOR_msa_srai_w,
	CODE_FOR_msa_srai_d, CODE_FOR_msa_srli_b, CODE_FOR_msa_srli_h,
	CODE_FOR_msa_srli_w, CODE_FOR_msa_srli_d, CODE_FOR_msa_insert_b,
	CODE_FOR_msa_insert_h, CODE_FOR_msa_insert_w,
	CODE_FOR_msa_insert_d, CODE_FOR_msa_insve_b,
	CODE_FOR_msa_insve_h, CODE_FOR_msa_insve_w, CODE_FOR_msa_insve_d,
	CODE_FOR_msa_shf_b, CODE_FOR_msa_shf_h, CODE_FOR_msa_shf_w,
	CODE_FOR_msa_shf_w_f, CODE_FOR_msa_vshf_b, CODE_FOR_msa_vshf_h,
	CODE_FOR_msa_vshf_w, CODE_FOR_msa_vshf_d.
	(mips_expand_builtin): Add case for MIPS_BULTIN_MSA_TEST_BRANCH.
	(mips_set_compression_mode): Disallow MSA with MIPS16 code.
	(mips_option_override): -mmsa requires -mfp64 and -mhard-float.
	These are set implicitly and an error is reported if overridden.
	(mips_expand_builtin_msa_test_branch): New function.
	(mips_expand_msa_shuffle): Likewise.
	(MAX_VECT_LEN): Increase maximum length of a vector to 16 bytes.
	(TARGET_SCHED_REASSOCIATION_WIDTH): Define target hook.
	(TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Likewise.
	(mips_expand_vec_unpack): Add support for MSA.
	(mips_expand_vector_init): Likewise.
	(mips_expand_vi_constant): Use CONST0_RTX (element_mode)
	instead of const0_rtx.
	(mips_msa_vec_parallel_const_half): New function.
	(mips_gen_const_int_vector): Likewise.
	(mips_gen_const_int_vector_shuffle): Likewise.
	(mips_expand_msa_cmp): Likewise.
	(mips_expand_vec_cond_expr): Likewise.
	* config/mips/mips.h
	(TARGET_CPU_CPP_BUILTINS): Add __mips_msa and __mips_msa_width.
	(OPTION_DEFAULT_SPECS): Ignore --with-fp-32 if -mmsa is
	specified.
	(ASM_SPEC): Pass mmsa and mno-msa to the assembler.
	(ISA_HAS_MSA): New macro.
	(UNITS_PER_MSA_REG): Likewise.
	(BITS_PER_MSA_REG): Likewise.
	(BIGGEST_ALIGNMENT): Redefine using ISA_HAS_MSA.
	(MSA_REG_FIRST): New macro.
	(MSA_REG_LAST): Likewise.
	(MSA_REG_NUM): Likewise.
	(MSA_REG_P): Likewise.
	(MSA_REG_RTX_P): Likewise.
	(MSA_SUPPORTED_MODE_P): Likewise.
	(HARD_REGNO_CALL_PART_CLOBBERED): Redefine using TARGET_MSA.
	(ADDITIONAL_REGISTER_NAMES): Add named registers $w0-$w31.
	* config/mips/mips.md: Include mips-msa.md.
	(alu_type): Add simd_add.
	(mode): Add V2DI, V4SI, V8HI, V16QI, V2DF, V4SF.
	(type): Add simd_div, simd_fclass, simd_flog2, simd_fadd,
	simd_fcvt, simd_fmul, simd_fmadd, simd_fdiv, simd_bitins,
	simd_bitmov, simd_insert, simd_sld, simd_mul, simd_fcmp,
	simd_fexp2, simd_int_arith, simd_bit, simd_shift, simd_splat,
	simd_fill, simd_permute, simd_shf, simd_sat, simd_pcnt,
	simd_copy, simd_branch, simd_cmsa, simd_fminmax, simd_logic,
	simd_move, simd_load, simd_store.  Choose "multi" for moves
	for "qword_mode".
	(qword_mode): New attribute.
	(insn_count): Add instruction count for quad moves.
	Increase the count for MIPS SIMD division.
	(UNITMODE): Add UNITMODEs for vector types.
	(addsub): New code iterator.
	* config/mips/mips.opt (mmsa): New option.
	* config/mips/msa.h: New file.
	* config/mips/mti-elf.h: Don't infer -mfpxx if -mmsa is
	specified.
	* config/mips/mti-linux.h: Likewise.
	* config/mips/predicates.md
	(const_msa_branch_operand): New constraint.
	(const_uimm3_operand): Likewise.
	(const_uimm4_operand): Likewise.
	(const_uimm5_operand): Likewise.
	(const_uimm8_operand): Likewise.
	(const_imm5_operand): Likewise.
	(aq10b_operand): Likewise.
	(aq10h_operand): Likewise.
	(aq10w_operand): Likewise.
	(aq10d_operand): Likewise.
	(const_m1_operand): Likewise.
	(reg_or_m1_operand): Likewise.
	(const_exp_2_operand): Likewise.
	(const_exp_4_operand): Likewise.
	(const_exp_8_operand): Likewise.
	(const_exp_16_operand): Likewise.
	(const_vector_same_val_operand): Likewise.
	(const_vector_same_simm5_operand): Likewise.
	(const_vector_same_uimm5_operand): Likewise.
	(const_vector_same_uimm6_operand): Likewise.
	(const_vector_same_uimm8_operand): Likewise.
	(par_const_vector_shf_set_operand): Likewise.
	(reg_or_vector_same_val_operand): Likewise.
	(reg_or_vector_same_simm5_operand): Likewise.
	(reg_or_vector_same_uimm6_operand): Likewise.
	* doc/extend.texi (MIPS SIMD Architecture Functions): New
	section.
	* doc/invoke.texi (-mmsa): Document new option.

Co-Authored-By: Chao-ying Fu <chao-ying.fu@imgtec.com>
Co-Authored-By: Graham Stott <graham.stott@imgtec.com>
Co-Authored-By: Matthew Fortune <matthew.fortune@imgtec.com>
Co-Authored-By: Sameera Deshpande <sameera.deshpande@imgtec.com>

From-SVN: r236030
parent ad103b01
2016-05-09 Robert Suchanek <robert.suchanek@imgtec.com>
Sameera Deshpande <sameera.deshpande@imgtec.com>
Matthew Fortune <matthew.fortune@imgtec.com>
Graham Stott <graham.stott@imgtec.com>
Chao-ying Fu <chao-ying.fu@imgtec.com>
* config.gcc: Add MSA header file for mips*-*-* target.
* config/mips/constraints.md (YI, YC, YZ, Unv5, Uuv5, Usv5, Uuv6)
(Ubv8i, Urv8): New constraints.
* config/mips/mips-ftypes.def: Add function types for MSA
builtins.
* config/mips/mips-modes.def (V16QI, V8HI, V4SI, V2DI, V4SF)
(V2DF, V32QI, V16HI, V8SI, V4DI, V8SF, V4DF): New modes.
* config/mips/mips-msa.md: New file.
* config/mips/mips-protos.h
(mips_split_128bit_const_insns): New prototype.
(mips_msa_idiv_insns): Likewise.
(mips_split_128bit_move): Likewise.
(mips_split_128bit_move_p): Likewise.
(mips_split_msa_copy_d): Likewise.
(mips_split_msa_insert_d): Likewise.
(mips_split_msa_fill_d): Likewise.
(mips_expand_msa_branch): Likewise.
(mips_const_vector_same_val_p): Likewise.
(mips_const_vector_same_bytes_p): Likewise.
(mips_const_vector_same_int_p): Likewise.
(mips_const_vector_shuffle_set_p): Likewise.
(mips_const_vector_bitimm_set_p): Likewise.
(mips_const_vector_bitimm_clr_p): Likewise.
(mips_msa_vec_parallel_const_half): Likewise.
(mips_msa_output_division): Likewise.
(mips_ldst_scaled_shift): Likewise.
(mips_expand_vec_cond_expr): Likewise.
* config/mips/mips.c (enum mips_builtin_type): Add
MIPS_BUILTIN_MSA_TEST_BRANCH.
(mips_gen_const_int_vector_shuffle): New prototype.
(mips_const_vector_bitimm_set_p): New function.
(mips_const_vector_bitimm_clr_p): Likewise.
(mips_const_vector_same_val_p): Likewise.
(mips_const_vector_same_bytes_p): Likewise.
(mips_const_vector_same_int_p): Likewise.
(mips_const_vector_shuffle_set_p): Likewise.
(mips_symbol_insns): Forbid loading symbols via immediate for
MSA.
(mips_valid_offset_p): Limit offset to 10-bit for MSA loads and
stores.
(mips_valid_lo_sum_p): Forbid loadings symbols via %lo(base) for
MSA.
(mips_lx_address_p): Add support load indexed address for MSA.
(mips_address_insns): Add calculation of instructions needed for
stores and loads for MSA.
(mips_const_insns): Move CONST_DOUBLE below CONST_VECTOR. Handle
CONST_VECTOR for MSA and let it fall through.
(mips_ldst_scaled_shift): New function.
(mips_subword_at_byte): Likewise.
(mips_msa_idiv_insns): Likewise.
(mips_legitimize_move): Validate MSA moves.
(mips_rtx_costs): Add UNGE, UNGT, UNLE, UNLT cases. Add
calculation of costs for MSA division.
(mips_split_move_p): Check if MSA moves need splitting.
(mips_split_move): Split MSA moves if necessary.
(mips_split_128bit_move_p): New function.
(mips_split_128bit_move): Likewise.
(mips_split_msa_copy_d): Likewise.
(mips_split_msa_insert_d): Likewise.
(mips_split_msa_fill_d): Likewise.
(mips_output_move): Handle MSA moves.
(mips_expand_msa_branch): New function.
(mips_print_operand): Add 'E', 'B', 'w', 'v' and 'V' modifiers.
Reinstate 'y' modifier.
(mips_file_start): Add MSA .gnu_attribute.
(mips_hard_regno_mode_ok_p): Allow TImode and 128-bit vectors in
FPRs.
(mips_hard_regno_nregs): Always return 1 for MSA supported mode.
(mips_class_max_nregs): Add register size for MSA supported mode.
(mips_cannot_change_mode_class): Allow conversion between MSA
vector modes and TImode.
(mips_mode_ok_for_mov_fmt_p): Allow MSA to use move.v
instruction.
(mips_secondary_reload_class): Force MSA loads/stores via memory.
(mips_preferred_simd_mode): Add preffered modes for MSA.
(mips_vector_mode_supported_p): Add MSA supported modes.
(mips_autovectorize_vector_sizes): New function.
(mips_msa_output_division): Likewise.
(MSA_BUILTIN, MIPS_BUILTIN_DIRECT_NO_TARGET)
(MSA_NO_TARGET_BUILTIN, MSA_BUILTIN_TEST_BRANCH): New macros.
(CODE_FOR_msa_adds_s_b, CODE_FOR_msa_adds_s_h)
(CODE_FOR_msa_adds_s_w, CODE_FOR_msa_adds_s_d)
(CODE_FOR_msa_adds_u_b, CODE_FOR_msa_adds_u_h)
(CODE_FOR_msa_adds_u_w, CODE_FOR_msa_adds_u_du
(CODE_FOR_msa_addv_b, CODE_FOR_msa_addv_h, CODE_FOR_msa_addv_w)
(CODE_FOR_msa_addv_d, CODE_FOR_msa_and_v, CODE_FOR_msa_bmnz_v)
(CODE_FOR_msa_bmnzi_b, CODE_FOR_msa_bmz_v, CODE_FOR_msa_bmzi_b)
(CODE_FOR_msa_bnz_v, CODE_FOR_msa_bz_v, CODE_FOR_msa_bsel_v)
(CODE_FOR_msa_bseli_b, CODE_FOR_msa_ceqi_h, CODE_FOR_msa_ceqi_w)
(CODE_FOR_msa_ceqi_d, CODE_FOR_msa_clti_s_b)
(CODE_FOR_msa_clti_s_h, CODE_FOR_msa_clti_s_w)
(CODE_FOR_msa_clti_s_d, CODE_FOR_msa_clti_u_b)
(CODE_FOR_msa_clti_u_h, CODE_FOR_msa_clti_u_w)
(CODE_FOR_msa_clti_u_d, CODE_FOR_msa_clei_s_b)
(CODE_FOR_msa_clei_s_h, CODE_FOR_msa_clei_s_w)
(CODE_FOR_msa_clei_s_d, CODE_FOR_msa_clei_u_b)
(CODE_FOR_msa_clei_u_h, CODE_FOR_msa_clei_u_w)
(CODE_FOR_msa_clei_u_d, CODE_FOR_msa_div_s_b)
(CODE_FOR_msa_div_s_h, CODE_FOR_msa_div_s_w)
(CODE_FOR_msa_div_s_d, CODE_FOR_msa_div_u_b)
(CODE_FOR_msa_div_u_h, CODE_FOR_msa_div_u_w)
(CODE_FOR_msa_div_u_d, CODE_FOR_msa_fadd_w, CODE_FOR_msa_fadd_d)
(CODE_FOR_msa_fexdo_w, CODE_FOR_msa_ftrunc_s_w)
(CODE_FOR_msa_ftrunc_s_d, CODE_FOR_msa_ftrunc_u_w)
(CODE_FOR_msa_ftrunc_u_d, CODE_FOR_msa_ffint_s_w)
(CODE_FOR_msa_ffint_s_d, CODE_FOR_msa_ffint_u_w)
(CODE_FOR_msa_ffint_u_d, CODE_FOR_msa_fsub_w)
(CODE_FOR_msa_fsub_d, CODE_FOR_msa_fmsub_d, CODE_FOR_msa_fmadd_w)
(CODE_FOR_msa_fmadd_d, CODE_FOR_msa_fmsub_w, CODE_FOR_msa_fmul_w)
(CODE_FOR_msa_fmul_d, CODE_FOR_msa_fdiv_w, CODE_FOR_msa_fdiv_d)
(CODE_FOR_msa_fmax_w, CODE_FOR_msa_fmax_d, CODE_FOR_msa_fmax_a_w)
(CODE_FOR_msa_fmax_a_d, CODE_FOR_msa_fmin_w, CODE_FOR_msa_fmin_d)
(CODE_FOR_msa_fmin_a_w, CODE_FOR_msa_fmin_a_d)
(CODE_FOR_msa_fsqrt_w, CODE_FOR_msa_fsqrt_d)
(CODE_FOR_msa_max_s_b, CODE_FOR_msa_max_s_h)
(CODE_FOR_msa_max_s_w, CODE_FOR_msa_max_s_d)
(CODE_FOR_msa_max_u_b, CODE_FOR_msa_max_u_h)
(CODE_FOR_msa_max_u_w, CODE_FOR_msa_max_u_d)
(CODE_FOR_msa_min_s_b, CODE_FOR_msa_min_s_h)
(CODE_FOR_msa_min_s_w, CODE_FOR_msa_min_s_d)
(CODE_FOR_msa_min_u_b, CODE_FOR_msa_min_u_h)
(CODE_FOR_msa_min_u_w, CODE_FOR_msa_min_u_d)
(CODE_FOR_msa_mod_s_b, CODE_FOR_msa_mod_s_h)
(CODE_FOR_msa_mod_s_w, CODE_FOR_msa_mod_s_d)
(CODE_FOR_msa_mod_u_b, CODE_FOR_msa_mod_u_h)
(CODE_FOR_msa_mod_u_w, CODE_FOR_msa_mod_u_d)
(CODE_FOR_msa_mod_s_b, CODE_FOR_msa_mod_s_h)
(CODE_FOR_msa_mod_s_w, CODE_FOR_msa_mod_s_d)
(CODE_FOR_msa_mod_u_b, CODE_FOR_msa_mod_u_h)
(CODE_FOR_msa_mod_u_w, CODE_FOR_msa_mod_u_d)
(CODE_FOR_msa_mulv_b, CODE_FOR_msa_mulv_h, CODE_FOR_msa_mulv_w)
(CODE_FOR_msa_mulv_d, CODE_FOR_msa_nlzc_b, CODE_FOR_msa_nlzc_h)
(CODE_FOR_msa_nlzc_w, CODE_FOR_msa_nlzc_d, CODE_FOR_msa_nor_v)
(CODE_FOR_msa_or_v, CODE_FOR_msa_ori_b, CODE_FOR_msa_nori_b)
(CODE_FOR_msa_pcnt_b, CODE_FOR_msa_pcnt_h, CODE_FOR_msa_pcnt_w)
(CODE_FOR_msa_pcnt_d, CODE_FOR_msa_xor_v, CODE_FOR_msa_xori_b)
(CODE_FOR_msa_sll_b, CODE_FOR_msa_sll_h, CODE_FOR_msa_sll_w)
(CODE_FOR_msa_sll_d, CODE_FOR_msa_slli_b, CODE_FOR_msa_slli_h)
(CODE_FOR_msa_slli_w, CODE_FOR_msa_slli_d, CODE_FOR_msa_sra_b)
(CODE_FOR_msa_sra_h, CODE_FOR_msa_sra_w, CODE_FOR_msa_sra_d)
(CODE_FOR_msa_srai_b, CODE_FOR_msa_srai_h, CODE_FOR_msa_srai_w)
(CODE_FOR_msa_srai_d, CODE_FOR_msa_srl_b, CODE_FOR_msa_srl_h)
(CODE_FOR_msa_srl_w, CODE_FOR_msa_srl_d, CODE_FOR_msa_srli_b)
(CODE_FOR_msa_srli_h, CODE_FOR_msa_srli_w, CODE_FOR_msa_srli_d)
(CODE_FOR_msa_subv_b, CODE_FOR_msa_subv_h, CODE_FOR_msa_subv_w)
(CODE_FOR_msa_subv_d, CODE_FOR_msa_subvi_b, CODE_FOR_msa_subvi_h)
(CODE_FOR_msa_subvi_w, CODE_FOR_msa_subvi_d, CODE_FOR_msa_move_v)
(CODE_FOR_msa_vshf_b, CODE_FOR_msa_vshf_h, CODE_FOR_msa_vshf_w)
(CODE_FOR_msa_vshf_d, CODE_FOR_msa_ilvod_d, CODE_FOR_msa_ilvev_d)
(CODE_FOR_msa_pckod_d, CODE_FOR_msa_pckdev_d, CODE_FOR_msa_ldi_b)
(CODE_FOR_msa_ldi_hi, CODE_FOR_msa_ldi_w)
(CODE_FOR_msa_ldi_d): New code_aliasing macros.
(mips_builtins): Add MSA sll_b, sll_h, sll_w, sll_d, slli_b,
slli_h, slli_w, slli_d, sra_b, sra_h, sra_w, sra_d, srai_b,
srai_h, srai_w, srai_d, srar_b, srar_h, srar_w, srar_d, srari_b,
srari_h, srari_w, srari_d, srl_b, srl_h, srl_w, srl_d, srli_b,
srli_h, srli_w, srli_d, srlr_b, srlr_h, srlr_w, srlr_d, srlri_b,
srlri_h, srlri_w, srlri_d, bclr_b, bclr_h, bclr_w, bclr_d,
bclri_b, bclri_h, bclri_w, bclri_d, bset_b, bset_h, bset_w,
bset_d, bseti_b, bseti_h, bseti_w, bseti_d, bneg_b, bneg_h,
bneg_w, bneg_d, bnegi_b, bnegi_h, bnegi_w, bnegi_d, binsl_b,
binsl_h, binsl_w, binsl_d, binsli_b, binsli_h, binsli_w,
binsli_d, binsr_b, binsr_h, binsr_w, binsr_d, binsri_b, binsri_h,
binsri_w, binsri_d, addv_b, addv_h, addv_w, addv_d, addvi_b,
addvi_h, addvi_w, addvi_d, subv_b, subv_h, subv_w, subv_d,
subvi_b, subvi_h, subvi_w, subvi_d, max_s_b, max_s_h, max_s_w,
max_s_d, maxi_s_b, maxi_s_h, maxi_s_w, maxi_s_d, max_u_b,
max_u_h, max_u_w, max_u_d, maxi_u_b, maxi_u_h, maxi_u_w,
maxi_u_d, min_s_b, min_s_h, min_s_w, min_s_d, mini_s_b, mini_s_h,
mini_s_w, mini_s_d, min_u_b, min_u_h, min_u_w, min_u_d, mini_u_b,
mini_u_h, mini_u_w, mini_u_d, max_a_b, max_a_h, max_a_w, max_a_d,
min_a_b, min_a_h, min_a_w, min_a_d, ceq_b, ceq_h, ceq_w, ceq_d,
ceqi_b, ceqi_h, ceqi_w, ceqi_d, clt_s_b, clt_s_h, clt_s_w,
clt_s_d, clti_s_b, clti_s_h, clti_s_w, clti_s_d, clt_u_b,
clt_u_h, clt_u_w, clt_u_d, clti_u_b, clti_u_h, clti_u_w,
clti_u_d, cle_s_b, cle_s_h, cle_s_w, cle_s_d, clei_s_b, clei_s_h,
clei_s_w, clei_s_d, cle_u_b, cle_u_h, cle_u_w, cle_u_d, clei_u_b,
clei_u_h, clei_u_w, clei_u_d, ld_b, ld_h, ld_w, ld_d, st_b, st_h,
st_w, st_d, sat_s_b, sat_s_h, sat_s_w, sat_s_d, sat_u_b, sat_u_h,
sat_u_w, sat_u_d, add_a_b, add_a_h, add_a_w, add_a_d, adds_a_b,
adds_a_h, adds_a_w, adds_a_d, adds_s_b, adds_s_h, adds_s_w,
adds_s_d, adds_u_b, adds_u_h, adds_u_w, adds_u_d, ave_s_b,
ave_s_h, ave_s_w, ave_s_d, ave_u_b, ave_u_h, ave_u_w, ave_u_d,
aver_s_b, aver_s_h, aver_s_w, aver_s_d, aver_u_b, aver_u_h,
aver_u_w, aver_u_d, subs_s_b, subs_s_h, subs_s_w, subs_s_d,
subs_u_b, subs_u_h, subs_u_w, subs_u_d, subsuu_s_b, subsuu_s_h,
subsuu_s_w, subsuu_s_d, subsus_u_b, subsus_u_h, subsus_u_w,
subsus_u_d, asub_s_b, asub_s_h, asub_s_w, asub_s_d, asub_u_b,
asub_u_h, asub_u_w, asub_u_d, mulv_b, mulv_h, mulv_w, mulv_d,
maddv_b, maddv_h, maddv_w, maddv_d, msubv_b, msubv_h, msubv_w,
msubv_d, div_s_b, div_s_h, div_s_w, div_s_d, div_u_b, div_u_h,
div_u_w, div_u_d, hadd_s_h, hadd_s_w, hadd_s_d, hadd_u_h,
hadd_u_w, hadd_u_d, hsub_s_h, hsub_s_w, hsub_s_d, hsub_u_h,
hsub_u_w, hsub_u_d, mod_s_b, mod_s_h, mod_s_w, mod_s_d, mod_u_b,
mod_u_h, mod_u_w, mod_u_d, dotp_s_h, dotp_s_w, dotp_s_d,
dotp_u_h, dotp_u_w, dotp_u_d, dpadd_s_h, dpadd_s_w, dpadd_s_d,
dpadd_u_h, dpadd_u_w, dpadd_u_d, dpsub_s_h, dpsub_s_w, dpsub_s_d,
dpsub_u_h, dpsub_u_w, dpsub_u_d, sld_b, sld_h, sld_w, sld_d,
sldi_b, sldi_h, sldi_w, sldi_d, splat_b, splat_h, splat_w,
splat_d, splati_b, splati_h, splati_w, splati_d, pckev_b,
pckev_h, pckev_w, pckev_d, pckod_b, pckod_h, pckod_w, pckod_d,
ilvl_b, ilvl_h, ilvl_w, ilvl_d, ilvr_b, ilvr_h, ilvr_w, ilvr_d,
ilvev_b, ilvev_h, ilvev_w, ilvev_d, ilvod_b, ilvod_h, ilvod_w,
ilvod_d, vshf_b, vshf_h, vshf_w, vshf_d, and_v, andi_b, or_v,
ori_b, nor_v, nori_b, xor_v, xori_b, bmnz_v, bmnzi_b, bmz_v,
bmzi_b, bsel_v, bseli_b, shf_b, shf_h, shf_w, bnz_v, bz_v,
fill_b, fill_h, fill_w, fill_d, pcnt_b, pcnt_h, pcnt_w,
pcnt_d, nloc_b, nloc_h, nloc_w, nloc_d, nlzc_b, nlzc_h, nlzc_w,
nlzc_d, copy_s_b, copy_s_h, copy_s_w, copy_s_d, copy_u_b,
copy_u_h, copy_u_w, copy_u_d, insert_b, insert_h, insert_w,
insert_d, insve_b, insve_h, insve_w, insve_d, bnz_b, bnz_h,
bnz_w, bnz_d, bz_b, bz_h, bz_w, bz_d, ldi_b, ldi_h, ldi_w, ldi_d,
fcaf_w, fcaf_d, fcor_w, fcor_d, fcun_w, fcun_d, fcune_w, fcune_d,
fcueq_w, fcueq_d, fceq_w, fceq_d, fcne_w, fcne_d, fclt_w, fclt_d,
fcult_w, fcult_d, fcle_w, fcle_d, fcule_w, fcule_d, fsaf_w,
fsaf_d, fsor_w, fsor_d, fsun_w, fsun_d, fsune_w, fsune_d,
fsueq_w, fsueq_d, fseq_w, fseq_d, fsne_w, fsne_d, fslt_w,
fslt_d, fsult_w, fsult_d, fsle_w, fsle_d, fsule_w, fsule_d,
fadd_w, fadd_d, fsub_w, fsub_d, fmul_w, fmul_d, fdiv_w, fdiv_d,
fmadd_w, fmadd_d, fmsub_w, fmsub_d, fexp2_w, fexp2_d, fexdo_h,
fexdo_w, ftq_h, ftq_w, fmin_w, fmin_d, fmin_a_w, fmin_a_d,
fmax_w, fmax_d, fmax_a_w, fmax_a_d, mul_q_h, mul_q_w, mulr_q_h,
mulr_q_w, madd_q_h, madd_q_w, maddr_q_h, maddr_q_w, msub_q_h,
msub_q_w, msubr_q_h, msubr_q_w, fclass_w, fclass_d, fsqrt_w,
fsqrt_d, frcp_w, frcp_d, frint_w, frint_d, frsqrt_w, frsqrt_d,
flog2_w, flog2_d, fexupl_w, fexupl_d, fexupr_w, fexupr_d, ffql_w,
ffql_d, ffqr_w, ffqr_d, ftint_s_w, ftint_s_d, ftint_u_w,
ftint_u_d, ftrunc_s_w, ftrunc_s_d, ftrunc_u_w, ftrunc_u_d,
ffint_s_w, ffint_s_d, ffint_u_w, ffint_u_d, ctcmsa, cfcmsa,
move_v builtins.
(mips_get_builtin_decl_index): New array.
(MIPS_ATYPE_QI, MIPS_ATYPE_HI, MIPS_ATYPE_V2DI, MIPS_ATYPE_V4SI)
(MIPS_ATYPE_V8HI, MIPS_ATYPE_V16QI, MIPS_ATYPE_V2DF)
(MIPS_ATYPE_V4SF, MIPS_ATYPE_UV2DI, MIPS_ATYPE_UV4SI)
(MIPS_ATYPE_UV8HI, MIPS_ATYPE_UV16QI): New.
(mips_init_builtins): Initialize mips_get_builtin_decl_index
array.
(TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION): Define target
hook.
(mips_expand_builtin_insn): Prepare operands for
CODE_FOR_msa_addvi_b, CODE_FOR_msa_addvi_h, CODE_FOR_msa_addvi_w,
CODE_FOR_msa_addvi_d, CODE_FOR_msa_clti_u_b,
CODE_FOR_msa_clti_u_h, CODE_FOR_msa_clti_u_w,
CODE_FOR_msa_clti_u_d, CODE_FOR_msa_clei_u_b,
CODE_FOR_msa_clei_u_h, CODE_FOR_msa_clei_u_w,
CODE_FOR_msa_clei_u_d, CODE_FOR_msa_maxi_u_b,
CODE_FOR_msa_maxi_u_h, CODE_FOR_msa_maxi_u_w,
CODE_FOR_msa_maxi_u_d, CODE_FOR_msa_mini_u_b,
CODE_FOR_msa_mini_u_h, CODE_FOR_msa_mini_u_w,
CODE_FOR_msa_mini_u_d, CODE_FOR_msa_subvi_b,
CODE_FOR_msa_subvi_h, CODE_FOR_msa_subvi_w, CODE_FOR_msa_subvi_d,
CODE_FOR_msa_ceqi_b, CODE_FOR_msa_ceqi_h, CODE_FOR_msa_ceqi_w,
CODE_FOR_msa_ceqi_d, CODE_FOR_msa_clti_s_b,
CODE_FOR_msa_clti_s_h, CODE_FOR_msa_clti_s_w,
CODE_FOR_msa_clti_s_d, CODE_FOR_msa_clei_s_b,
CODE_FOR_msa_clei_s_h, CODE_FOR_msa_clei_s_w,
CODE_FOR_msa_clei_s_d, CODE_FOR_msa_maxi_s_b,
CODE_FOR_msa_maxi_s_h, CODE_FOR_msa_maxi_s_w,
CODE_FOR_msa_maxi_s_d, CODE_FOR_msa_mini_s_b,
CODE_FOR_msa_mini_s_h, CODE_FOR_msa_mini_s_w,
CODE_FOR_msa_mini_s_d, CODE_FOR_msa_andi_b, CODE_FOR_msa_ori_b,
CODE_FOR_msa_nori_b, CODE_FOR_msa_xori_b, CODE_FOR_msa_bmzi_b,
CODE_FOR_msa_bmnzi_b, CODE_FOR_msa_bseli_b, CODE_FOR_msa_fill_b,
CODE_FOR_msa_fill_h, CODE_FOR_msa_fill_w, CODE_FOR_msa_fill_d,
CODE_FOR_msa_ilvl_b, CODE_FOR_msa_ilvl_h, CODE_FOR_msa_ilvl_w,
CODE_FOR_msa_ilvl_d, CODE_FOR_msa_ilvr_b, CODE_FOR_msa_ilvr_h,
CODE_FOR_msa_ilvr_w, CODE_FOR_msa_ilvr_d, CODE_FOR_msa_ilvev_b,
CODE_FOR_msa_ilvev_h, CODE_FOR_msa_ilvev_w, CODE_FOR_msa_ilvod_b,
CODE_FOR_msa_ilvod_h, CODE_FOR_msa_ilvod_w, CODE_FOR_msa_pckev_b,
CODE_FOR_msa_pckev_h, CODE_FOR_msa_pckev_w, CODE_FOR_msa_pckod_b,
CODE_FOR_msa_pckod_h, CODE_FOR_msa_pckod_w, CODE_FOR_msa_slli_b,
CODE_FOR_msa_slli_h, CODE_FOR_msa_slli_w, CODE_FOR_msa_slli_d,
CODE_FOR_msa_srai_b, CODE_FOR_msa_srai_h, CODE_FOR_msa_srai_w,
CODE_FOR_msa_srai_d, CODE_FOR_msa_srli_b, CODE_FOR_msa_srli_h,
CODE_FOR_msa_srli_w, CODE_FOR_msa_srli_d, CODE_FOR_msa_insert_b,
CODE_FOR_msa_insert_h, CODE_FOR_msa_insert_w,
CODE_FOR_msa_insert_d, CODE_FOR_msa_insve_b,
CODE_FOR_msa_insve_h, CODE_FOR_msa_insve_w, CODE_FOR_msa_insve_d,
CODE_FOR_msa_shf_b, CODE_FOR_msa_shf_h, CODE_FOR_msa_shf_w,
CODE_FOR_msa_shf_w_f, CODE_FOR_msa_vshf_b, CODE_FOR_msa_vshf_h,
CODE_FOR_msa_vshf_w, CODE_FOR_msa_vshf_d.
(mips_expand_builtin): Add case for MIPS_BULTIN_MSA_TEST_BRANCH.
(mips_set_compression_mode): Disallow MSA with MIPS16 code.
(mips_option_override): -mmsa requires -mfp64 and -mhard-float.
These are set implicitly and an error is reported if overridden.
(mips_expand_builtin_msa_test_branch): New function.
(mips_expand_msa_shuffle): Likewise.
(MAX_VECT_LEN): Increase maximum length of a vector to 16 bytes.
(TARGET_SCHED_REASSOCIATION_WIDTH): Define target hook.
(TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Likewise.
(mips_expand_vec_unpack): Add support for MSA.
(mips_expand_vector_init): Likewise.
(mips_expand_vi_constant): Use CONST0_RTX (element_mode)
instead of const0_rtx.
(mips_msa_vec_parallel_const_half): New function.
(mips_gen_const_int_vector): Likewise.
(mips_gen_const_int_vector_shuffle): Likewise.
(mips_expand_msa_cmp): Likewise.
(mips_expand_vec_cond_expr): Likewise.
* config/mips/mips.h
(TARGET_CPU_CPP_BUILTINS): Add __mips_msa and __mips_msa_width.
(OPTION_DEFAULT_SPECS): Ignore --with-fp-32 if -mmsa is
specified.
(ASM_SPEC): Pass mmsa and mno-msa to the assembler.
(ISA_HAS_MSA): New macro.
(UNITS_PER_MSA_REG): Likewise.
(BITS_PER_MSA_REG): Likewise.
(BIGGEST_ALIGNMENT): Redefine using ISA_HAS_MSA.
(MSA_REG_FIRST): New macro.
(MSA_REG_LAST): Likewise.
(MSA_REG_NUM): Likewise.
(MSA_REG_P): Likewise.
(MSA_REG_RTX_P): Likewise.
(MSA_SUPPORTED_MODE_P): Likewise.
(HARD_REGNO_CALL_PART_CLOBBERED): Redefine using TARGET_MSA.
(ADDITIONAL_REGISTER_NAMES): Add named registers $w0-$w31.
* config/mips/mips.md: Include mips-msa.md.
(alu_type): Add simd_add.
(mode): Add V2DI, V4SI, V8HI, V16QI, V2DF, V4SF.
(type): Add simd_div, simd_fclass, simd_flog2, simd_fadd,
simd_fcvt, simd_fmul, simd_fmadd, simd_fdiv, simd_bitins,
simd_bitmov, simd_insert, simd_sld, simd_mul, simd_fcmp,
simd_fexp2, simd_int_arith, simd_bit, simd_shift, simd_splat,
simd_fill, simd_permute, simd_shf, simd_sat, simd_pcnt,
simd_copy, simd_branch, simd_cmsa, simd_fminmax, simd_logic,
simd_move, simd_load, simd_store. Choose "multi" for moves
for "qword_mode".
(qword_mode): New attribute.
(insn_count): Add instruction count for quad moves.
Increase the count for MIPS SIMD division.
(UNITMODE): Add UNITMODEs for vector types.
(addsub): New code iterator.
* config/mips/mips.opt (mmsa): New option.
* config/mips/msa.h: New file.
* config/mips/mti-elf.h: Don't infer -mfpxx if -mmsa is
specified.
* config/mips/mti-linux.h: Likewise.
* config/mips/predicates.md
(const_msa_branch_operand): New constraint.
(const_uimm3_operand): Likewise.
(const_uimm4_operand): Likewise.
(const_uimm5_operand): Likewise.
(const_uimm8_operand): Likewise.
(const_imm5_operand): Likewise.
(aq10b_operand): Likewise.
(aq10h_operand): Likewise.
(aq10w_operand): Likewise.
(aq10d_operand): Likewise.
(const_m1_operand): Likewise.
(reg_or_m1_operand): Likewise.
(const_exp_2_operand): Likewise.
(const_exp_4_operand): Likewise.
(const_exp_8_operand): Likewise.
(const_exp_16_operand): Likewise.
(const_vector_same_val_operand): Likewise.
(const_vector_same_simm5_operand): Likewise.
(const_vector_same_uimm5_operand): Likewise.
(const_vector_same_uimm6_operand): Likewise.
(const_vector_same_uimm8_operand): Likewise.
(par_const_vector_shf_set_operand): Likewise.
(reg_or_vector_same_val_operand): Likewise.
(reg_or_vector_same_simm5_operand): Likewise.
(reg_or_vector_same_uimm6_operand): Likewise.
* doc/extend.texi (MIPS SIMD Architecture Functions): New
section.
* doc/invoke.texi (-mmsa): Document new option.
2016-05-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2016-05-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* configure.ac (enable_vtable_verify): Handle --enable-vtable-verify. * configure.ac (enable_vtable_verify): Handle --enable-vtable-verify.
......
...@@ -427,7 +427,7 @@ microblaze*-*-*) ...@@ -427,7 +427,7 @@ microblaze*-*-*)
;; ;;
mips*-*-*) mips*-*-*)
cpu_type=mips cpu_type=mips
extra_headers="loongson.h" extra_headers="loongson.h msa.h"
extra_objs="frame-header-opt.o" extra_objs="frame-header-opt.o"
extra_options="${extra_options} g.opt fused-madd.opt mips/mips-tables.opt" extra_options="${extra_options} g.opt fused-madd.opt mips/mips-tables.opt"
;; ;;
......
...@@ -308,6 +308,61 @@ ...@@ -308,6 +308,61 @@
"@internal" "@internal"
(match_operand 0 "low_bitmask_operand")) (match_operand 0 "low_bitmask_operand"))
(define_constraint "YI"
"@internal
A replicated vector const in which the replicated value is in the range
[-512,511]."
(and (match_code "const_vector")
(match_test "mips_const_vector_same_int_p (op, mode, -512, 511)")))
(define_constraint "YC"
"@internal
A replicated vector const in which the replicated value has a single
bit set."
(and (match_code "const_vector")
(match_test "mips_const_vector_bitimm_set_p (op, mode)")))
(define_constraint "YZ"
"@internal
A replicated vector const in which the replicated value has a single
bit clear."
(and (match_code "const_vector")
(match_test "mips_const_vector_bitimm_clr_p (op, mode)")))
(define_constraint "Unv5"
"@internal
A replicated vector const in which the replicated value is in the range
[-31,0]."
(and (match_code "const_vector")
(match_test "mips_const_vector_same_int_p (op, mode, -31, 0)")))
(define_constraint "Uuv5"
"@internal
A replicated vector const in which the replicated value is in the range
[0,31]."
(and (match_code "const_vector")
(match_test "mips_const_vector_same_int_p (op, mode, 0, 31)")))
(define_constraint "Usv5"
"@internal
A replicated vector const in which the replicated value is in the range
[-16,15]."
(and (match_code "const_vector")
(match_test "mips_const_vector_same_int_p (op, mode, -16, 15)")))
(define_constraint "Uuv6"
"@internal
A replicated vector const in which the replicated value is in the range
[0,63]."
(and (match_code "const_vector")
(match_test "mips_const_vector_same_int_p (op, mode, 0, 63)")))
(define_constraint "Urv8"
"@internal
A replicated vector const with replicated byte values as well as elements"
(and (match_code "const_vector")
(match_test "mips_const_vector_same_bytes_p (op, mode)")))
(define_memory_constraint "ZC" (define_memory_constraint "ZC"
"A memory operand whose address is formed by a base register and offset "A memory operand whose address is formed by a base register and offset
that is suitable for use in instructions with the same addressing mode that is suitable for use in instructions with the same addressing mode
......
...@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see
Please keep this list lexicographically sorted by the LIST argument. */ Please keep this list lexicographically sorted by the LIST argument. */
DEF_MIPS_FTYPE (1, (DF, DF)) DEF_MIPS_FTYPE (1, (DF, DF))
DEF_MIPS_FTYPE (2, (DF, DF, DF)) DEF_MIPS_FTYPE (2, (DF, DF, DF))
DEF_MIPS_FTYPE (1, (DF, V2DF))
DEF_MIPS_FTYPE (2, (DI, DI, DI)) DEF_MIPS_FTYPE (2, (DI, DI, DI))
DEF_MIPS_FTYPE (2, (DI, DI, SI)) DEF_MIPS_FTYPE (2, (DI, DI, SI))
...@@ -45,6 +46,7 @@ DEF_MIPS_FTYPE (3, (DI, DI, V4QI, V4QI)) ...@@ -45,6 +46,7 @@ DEF_MIPS_FTYPE (3, (DI, DI, V4QI, V4QI))
DEF_MIPS_FTYPE (2, (DI, POINTER, SI)) DEF_MIPS_FTYPE (2, (DI, POINTER, SI))
DEF_MIPS_FTYPE (2, (DI, SI, SI)) DEF_MIPS_FTYPE (2, (DI, SI, SI))
DEF_MIPS_FTYPE (2, (DI, USI, USI)) DEF_MIPS_FTYPE (2, (DI, USI, USI))
DEF_MIPS_FTYPE (2, (DI, V2DI, UQI))
DEF_MIPS_FTYPE (2, (INT, DF, DF)) DEF_MIPS_FTYPE (2, (INT, DF, DF))
DEF_MIPS_FTYPE (2, (INT, SF, SF)) DEF_MIPS_FTYPE (2, (INT, SF, SF))
...@@ -54,23 +56,51 @@ DEF_MIPS_FTYPE (4, (INT, V2SF, V2SF, V2SF, V2SF)) ...@@ -54,23 +56,51 @@ DEF_MIPS_FTYPE (4, (INT, V2SF, V2SF, V2SF, V2SF))
DEF_MIPS_FTYPE (1, (SF, SF)) DEF_MIPS_FTYPE (1, (SF, SF))
DEF_MIPS_FTYPE (2, (SF, SF, SF)) DEF_MIPS_FTYPE (2, (SF, SF, SF))
DEF_MIPS_FTYPE (1, (SF, V2SF)) DEF_MIPS_FTYPE (1, (SF, V2SF))
DEF_MIPS_FTYPE (1, (SF, V4SF))
DEF_MIPS_FTYPE (2, (SI, DI, SI)) DEF_MIPS_FTYPE (2, (SI, DI, SI))
DEF_MIPS_FTYPE (2, (SI, POINTER, SI)) DEF_MIPS_FTYPE (2, (SI, POINTER, SI))
DEF_MIPS_FTYPE (1, (SI, SI)) DEF_MIPS_FTYPE (1, (SI, SI))
DEF_MIPS_FTYPE (2, (SI, SI, SI)) DEF_MIPS_FTYPE (2, (SI, SI, SI))
DEF_MIPS_FTYPE (3, (SI, SI, SI, SI)) DEF_MIPS_FTYPE (3, (SI, SI, SI, SI))
DEF_MIPS_FTYPE (1, (SI, UQI))
DEF_MIPS_FTYPE (1, (SI, UV16QI))
DEF_MIPS_FTYPE (1, (SI, UV2DI))
DEF_MIPS_FTYPE (1, (SI, UV4SI))
DEF_MIPS_FTYPE (1, (SI, UV8HI))
DEF_MIPS_FTYPE (2, (SI, V16QI, UQI))
DEF_MIPS_FTYPE (1, (SI, V2HI)) DEF_MIPS_FTYPE (1, (SI, V2HI))
DEF_MIPS_FTYPE (2, (SI, V2HI, V2HI)) DEF_MIPS_FTYPE (2, (SI, V2HI, V2HI))
DEF_MIPS_FTYPE (1, (SI, V4QI)) DEF_MIPS_FTYPE (1, (SI, V4QI))
DEF_MIPS_FTYPE (2, (SI, V4QI, V4QI)) DEF_MIPS_FTYPE (2, (SI, V4QI, V4QI))
DEF_MIPS_FTYPE (2, (SI, V4SI, UQI))
DEF_MIPS_FTYPE (2, (SI, V8HI, UQI))
DEF_MIPS_FTYPE (1, (SI, VOID)) DEF_MIPS_FTYPE (1, (SI, VOID))
DEF_MIPS_FTYPE (2, (UDI, UDI, UDI)) DEF_MIPS_FTYPE (2, (UDI, UDI, UDI))
DEF_MIPS_FTYPE (2, (UDI, UV2SI, UV2SI)) DEF_MIPS_FTYPE (2, (UDI, UV2SI, UV2SI))
DEF_MIPS_FTYPE (2, (UDI, V2DI, UQI))
DEF_MIPS_FTYPE (2, (USI, V16QI, UQI))
DEF_MIPS_FTYPE (2, (USI, V4SI, UQI))
DEF_MIPS_FTYPE (2, (USI, V8HI, UQI))
DEF_MIPS_FTYPE (1, (USI, VOID)) DEF_MIPS_FTYPE (1, (USI, VOID))
DEF_MIPS_FTYPE (2, (UV16QI, UV16QI, UQI))
DEF_MIPS_FTYPE (2, (UV16QI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (3, (UV16QI, UV16QI, UV16QI, UQI))
DEF_MIPS_FTYPE (3, (UV16QI, UV16QI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (2, (UV16QI, UV16QI, V16QI))
DEF_MIPS_FTYPE (2, (UV2DI, UV2DI, UQI))
DEF_MIPS_FTYPE (2, (UV2DI, UV2DI, UV2DI))
DEF_MIPS_FTYPE (3, (UV2DI, UV2DI, UV2DI, UQI))
DEF_MIPS_FTYPE (3, (UV2DI, UV2DI, UV2DI, UV2DI))
DEF_MIPS_FTYPE (3, (UV2DI, UV2DI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (2, (UV2DI, UV2DI, V2DI))
DEF_MIPS_FTYPE (2, (UV2DI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (1, (UV2DI, V2DF))
DEF_MIPS_FTYPE (2, (UV2SI, UV2SI, UQI)) DEF_MIPS_FTYPE (2, (UV2SI, UV2SI, UQI))
DEF_MIPS_FTYPE (2, (UV2SI, UV2SI, UV2SI)) DEF_MIPS_FTYPE (2, (UV2SI, UV2SI, UV2SI))
...@@ -82,10 +112,75 @@ DEF_MIPS_FTYPE (3, (UV4HI, UV4HI, UV4HI, USI)) ...@@ -82,10 +112,75 @@ DEF_MIPS_FTYPE (3, (UV4HI, UV4HI, UV4HI, USI))
DEF_MIPS_FTYPE (1, (UV4HI, UV8QI)) DEF_MIPS_FTYPE (1, (UV4HI, UV8QI))
DEF_MIPS_FTYPE (2, (UV4HI, UV8QI, UV8QI)) DEF_MIPS_FTYPE (2, (UV4HI, UV8QI, UV8QI))
DEF_MIPS_FTYPE (2, (UV4SI, UV4SI, UQI))
DEF_MIPS_FTYPE (2, (UV4SI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (3, (UV4SI, UV4SI, UV4SI, UQI))
DEF_MIPS_FTYPE (3, (UV4SI, UV4SI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (3, (UV4SI, UV4SI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (2, (UV4SI, UV4SI, V4SI))
DEF_MIPS_FTYPE (2, (UV4SI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (1, (UV4SI, V4SF))
DEF_MIPS_FTYPE (2, (UV8HI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (2, (UV8HI, UV8HI, UQI))
DEF_MIPS_FTYPE (3, (UV8HI, UV8HI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (2, (UV8HI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (3, (UV8HI, UV8HI, UV8HI, UQI))
DEF_MIPS_FTYPE (3, (UV8HI, UV8HI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (2, (UV8HI, UV8HI, V8HI))
DEF_MIPS_FTYPE (2, (UV8QI, UV4HI, UV4HI)) DEF_MIPS_FTYPE (2, (UV8QI, UV4HI, UV4HI))
DEF_MIPS_FTYPE (1, (UV8QI, UV8QI)) DEF_MIPS_FTYPE (1, (UV8QI, UV8QI))
DEF_MIPS_FTYPE (2, (UV8QI, UV8QI, UV8QI)) DEF_MIPS_FTYPE (2, (UV8QI, UV8QI, UV8QI))
DEF_MIPS_FTYPE (2, (V16QI, CVPOINTER, SI))
DEF_MIPS_FTYPE (1, (V16QI, HI))
DEF_MIPS_FTYPE (1, (V16QI, SI))
DEF_MIPS_FTYPE (2, (V16QI, UV16QI, UQI))
DEF_MIPS_FTYPE (2, (V16QI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (1, (V16QI, V16QI))
DEF_MIPS_FTYPE (2, (V16QI, V16QI, QI))
DEF_MIPS_FTYPE (2, (V16QI, V16QI, SI))
DEF_MIPS_FTYPE (2, (V16QI, V16QI, UQI))
DEF_MIPS_FTYPE (3, (V16QI, V16QI, UQI, SI))
DEF_MIPS_FTYPE (3, (V16QI, V16QI, UQI, V16QI))
DEF_MIPS_FTYPE (2, (V16QI, V16QI, V16QI))
DEF_MIPS_FTYPE (3, (V16QI, V16QI, V16QI, SI))
DEF_MIPS_FTYPE (3, (V16QI, V16QI, V16QI, UQI))
DEF_MIPS_FTYPE (3, (V16QI, V16QI, V16QI, V16QI))
DEF_MIPS_FTYPE (1, (V2DF, DF))
DEF_MIPS_FTYPE (1, (V2DF, UV2DI))
DEF_MIPS_FTYPE (1, (V2DF, V2DF))
DEF_MIPS_FTYPE (2, (V2DF, V2DF, V2DF))
DEF_MIPS_FTYPE (3, (V2DF, V2DF, V2DF, V2DF))
DEF_MIPS_FTYPE (2, (V2DF, V2DF, V2DI))
DEF_MIPS_FTYPE (1, (V2DF, V2DI))
DEF_MIPS_FTYPE (1, (V2DF, V4SF))
DEF_MIPS_FTYPE (1, (V2DF, V4SI))
DEF_MIPS_FTYPE (2, (V2DI, CVPOINTER, SI))
DEF_MIPS_FTYPE (1, (V2DI, DI))
DEF_MIPS_FTYPE (1, (V2DI, HI))
DEF_MIPS_FTYPE (2, (V2DI, UV2DI, UQI))
DEF_MIPS_FTYPE (2, (V2DI, UV2DI, UV2DI))
DEF_MIPS_FTYPE (2, (V2DI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (1, (V2DI, V2DF))
DEF_MIPS_FTYPE (2, (V2DI, V2DF, V2DF))
DEF_MIPS_FTYPE (1, (V2DI, V2DI))
DEF_MIPS_FTYPE (2, (V2DI, V2DI, QI))
DEF_MIPS_FTYPE (2, (V2DI, V2DI, SI))
DEF_MIPS_FTYPE (2, (V2DI, V2DI, UQI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, UQI, DI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, UQI, V2DI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (2, (V2DI, V2DI, V2DI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, V2DI, SI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, V2DI, UQI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, V2DI, V2DI))
DEF_MIPS_FTYPE (3, (V2DI, V2DI, V4SI, V4SI))
DEF_MIPS_FTYPE (2, (V2DI, V4SI, V4SI))
DEF_MIPS_FTYPE (1, (V2HI, SI)) DEF_MIPS_FTYPE (1, (V2HI, SI))
DEF_MIPS_FTYPE (2, (V2HI, SI, SI)) DEF_MIPS_FTYPE (2, (V2HI, SI, SI))
DEF_MIPS_FTYPE (3, (V2HI, SI, SI, SI)) DEF_MIPS_FTYPE (3, (V2HI, SI, SI, SI))
...@@ -118,12 +213,74 @@ DEF_MIPS_FTYPE (1, (V4QI, V4QI)) ...@@ -118,12 +213,74 @@ DEF_MIPS_FTYPE (1, (V4QI, V4QI))
DEF_MIPS_FTYPE (2, (V4QI, V4QI, SI)) DEF_MIPS_FTYPE (2, (V4QI, V4QI, SI))
DEF_MIPS_FTYPE (2, (V4QI, V4QI, V4QI)) DEF_MIPS_FTYPE (2, (V4QI, V4QI, V4QI))
DEF_MIPS_FTYPE (1, (V4SF, SF))
DEF_MIPS_FTYPE (1, (V4SF, UV4SI))
DEF_MIPS_FTYPE (2, (V4SF, V2DF, V2DF))
DEF_MIPS_FTYPE (1, (V4SF, V4SF))
DEF_MIPS_FTYPE (2, (V4SF, V4SF, V4SF))
DEF_MIPS_FTYPE (3, (V4SF, V4SF, V4SF, V4SF))
DEF_MIPS_FTYPE (2, (V4SF, V4SF, V4SI))
DEF_MIPS_FTYPE (1, (V4SF, V4SI))
DEF_MIPS_FTYPE (1, (V4SF, V8HI))
DEF_MIPS_FTYPE (2, (V4SI, CVPOINTER, SI))
DEF_MIPS_FTYPE (1, (V4SI, HI))
DEF_MIPS_FTYPE (1, (V4SI, SI))
DEF_MIPS_FTYPE (2, (V4SI, UV4SI, UQI))
DEF_MIPS_FTYPE (2, (V4SI, UV4SI, UV4SI))
DEF_MIPS_FTYPE (2, (V4SI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (2, (V4SI, V2DF, V2DF))
DEF_MIPS_FTYPE (1, (V4SI, V4SF))
DEF_MIPS_FTYPE (2, (V4SI, V4SF, V4SF))
DEF_MIPS_FTYPE (1, (V4SI, V4SI))
DEF_MIPS_FTYPE (2, (V4SI, V4SI, QI))
DEF_MIPS_FTYPE (2, (V4SI, V4SI, SI))
DEF_MIPS_FTYPE (2, (V4SI, V4SI, UQI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, UQI, SI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, UQI, V4SI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (2, (V4SI, V4SI, V4SI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, V4SI, SI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, V4SI, UQI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, V4SI, V4SI))
DEF_MIPS_FTYPE (3, (V4SI, V4SI, V8HI, V8HI))
DEF_MIPS_FTYPE (2, (V4SI, V8HI, V8HI))
DEF_MIPS_FTYPE (2, (V8HI, CVPOINTER, SI))
DEF_MIPS_FTYPE (1, (V8HI, HI))
DEF_MIPS_FTYPE (1, (V8HI, SI))
DEF_MIPS_FTYPE (2, (V8HI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (2, (V8HI, UV8HI, UQI))
DEF_MIPS_FTYPE (2, (V8HI, UV8HI, UV8HI))
DEF_MIPS_FTYPE (2, (V8HI, V16QI, V16QI))
DEF_MIPS_FTYPE (2, (V8HI, V4SF, V4SF))
DEF_MIPS_FTYPE (1, (V8HI, V8HI))
DEF_MIPS_FTYPE (2, (V8HI, V8HI, QI))
DEF_MIPS_FTYPE (2, (V8HI, V8HI, SI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, SI, UQI))
DEF_MIPS_FTYPE (2, (V8HI, V8HI, UQI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, UQI, SI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, UQI, V8HI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, UV16QI, UV16QI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, V16QI, V16QI))
DEF_MIPS_FTYPE (2, (V8HI, V8HI, V8HI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, V8HI, SI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, V8HI, UQI))
DEF_MIPS_FTYPE (3, (V8HI, V8HI, V8HI, V8HI))
DEF_MIPS_FTYPE (2, (V8QI, V4HI, V4HI)) DEF_MIPS_FTYPE (2, (V8QI, V4HI, V4HI))
DEF_MIPS_FTYPE (1, (V8QI, V8QI)) DEF_MIPS_FTYPE (1, (V8QI, V8QI))
DEF_MIPS_FTYPE (2, (V8QI, V8QI, V8QI)) DEF_MIPS_FTYPE (2, (V8QI, V8QI, V8QI))
DEF_MIPS_FTYPE (2, (VOID, SI, CVPOINTER)) DEF_MIPS_FTYPE (2, (VOID, SI, CVPOINTER))
DEF_MIPS_FTYPE (2, (VOID, SI, SI)) DEF_MIPS_FTYPE (2, (VOID, SI, SI))
DEF_MIPS_FTYPE (2, (VOID, UQI, SI))
DEF_MIPS_FTYPE (1, (VOID, USI)) DEF_MIPS_FTYPE (1, (VOID, USI))
DEF_MIPS_FTYPE (3, (VOID, V16QI, CVPOINTER, SI))
DEF_MIPS_FTYPE (3, (VOID, V2DF, POINTER, SI))
DEF_MIPS_FTYPE (3, (VOID, V2DI, CVPOINTER, SI))
DEF_MIPS_FTYPE (2, (VOID, V2HI, V2HI)) DEF_MIPS_FTYPE (2, (VOID, V2HI, V2HI))
DEF_MIPS_FTYPE (2, (VOID, V4QI, V4QI)) DEF_MIPS_FTYPE (2, (VOID, V4QI, V4QI))
DEF_MIPS_FTYPE (3, (VOID, V4SF, POINTER, SI))
DEF_MIPS_FTYPE (3, (VOID, V4SI, CVPOINTER, SI))
DEF_MIPS_FTYPE (3, (VOID, V8HI, CVPOINTER, SI))
...@@ -24,11 +24,17 @@ VECTOR_MODES (INT, 4); /* V4QI V2HI */ ...@@ -24,11 +24,17 @@ VECTOR_MODES (INT, 4); /* V4QI V2HI */
VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI */ VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI */
VECTOR_MODES (FLOAT, 8); /* V4HF V2SF */ VECTOR_MODES (FLOAT, 8); /* V4HF V2SF */
/* For MIPS MSA 128 bits. */
VECTOR_MODES (INT, 16); /* V16QI V8HI V4SI V2DI */
VECTOR_MODES (FLOAT, 16); /* V4SF V2DF */
/* Double-sized vector modes for vec_concat. */ /* Double-sized vector modes for vec_concat. */
VECTOR_MODE (INT, QI, 16); /* V16QI */ VECTOR_MODE (INT, QI, 32); /* V32QI */
VECTOR_MODE (INT, HI, 8); /* V8HI */ VECTOR_MODE (INT, HI, 16); /* V16HI */
VECTOR_MODE (INT, SI, 4); /* V4SI */ VECTOR_MODE (INT, SI, 8); /* V8SI */
VECTOR_MODE (FLOAT, SF, 4); /* V4SF */ VECTOR_MODE (INT, DI, 4); /* V4DI */
VECTOR_MODE (FLOAT, SF, 8); /* V8SF */
VECTOR_MODE (FLOAT, DF, 4); /* V4DF */
VECTOR_MODES (FRACT, 4); /* V4QQ V2HQ */ VECTOR_MODES (FRACT, 4); /* V4QQ V2HQ */
VECTOR_MODES (UFRACT, 4); /* V4UQQ V2UHQ */ VECTOR_MODES (UFRACT, 4); /* V4UQQ V2UHQ */
......
;; Machine Description for MIPS MSA ASE
;; Based on the MIPS MSA spec Revision 1.11 8/4/2014
;;
;; Copyright (C) 2015 Free Software Foundation, Inc.
;;
;; This file is part of GCC.
;;
;; GCC is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;;
;; GCC is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GCC; see the file COPYING3. If not see
;; <http://www.gnu.org/licenses/>.
;;
(define_c_enum "unspec" [
UNSPEC_MSA_ASUB_S
UNSPEC_MSA_ASUB_U
UNSPEC_MSA_AVE_S
UNSPEC_MSA_AVE_U
UNSPEC_MSA_AVER_S
UNSPEC_MSA_AVER_U
UNSPEC_MSA_BCLR
UNSPEC_MSA_BCLRI
UNSPEC_MSA_BINSL
UNSPEC_MSA_BINSLI
UNSPEC_MSA_BINSR
UNSPEC_MSA_BINSRI
UNSPEC_MSA_BNEG
UNSPEC_MSA_BNEGI
UNSPEC_MSA_BSET
UNSPEC_MSA_BSETI
UNSPEC_MSA_BRANCH_V
UNSPEC_MSA_BRANCH
UNSPEC_MSA_CFCMSA
UNSPEC_MSA_CTCMSA
UNSPEC_MSA_FCAF
UNSPEC_MSA_FCLASS
UNSPEC_MSA_FCUNE
UNSPEC_MSA_FEXDO
UNSPEC_MSA_FEXP2
UNSPEC_MSA_FEXUPL
UNSPEC_MSA_FEXUPR
UNSPEC_MSA_FFQL
UNSPEC_MSA_FFQR
UNSPEC_MSA_FLOG2
UNSPEC_MSA_FRCP
UNSPEC_MSA_FRINT
UNSPEC_MSA_FRSQRT
UNSPEC_MSA_FSAF
UNSPEC_MSA_FSEQ
UNSPEC_MSA_FSLE
UNSPEC_MSA_FSLT
UNSPEC_MSA_FSNE
UNSPEC_MSA_FSOR
UNSPEC_MSA_FSUEQ
UNSPEC_MSA_FSULE
UNSPEC_MSA_FSULT
UNSPEC_MSA_FSUN
UNSPEC_MSA_FSUNE
UNSPEC_MSA_FTINT_S
UNSPEC_MSA_FTINT_U
UNSPEC_MSA_FTQ
UNSPEC_MSA_MADD_Q
UNSPEC_MSA_MADDR_Q
UNSPEC_MSA_MSUB_Q
UNSPEC_MSA_MSUBR_Q
UNSPEC_MSA_MUL_Q
UNSPEC_MSA_MULR_Q
UNSPEC_MSA_NLOC
UNSPEC_MSA_SAT_S
UNSPEC_MSA_SAT_U
UNSPEC_MSA_SLD
UNSPEC_MSA_SLDI
UNSPEC_MSA_SPLAT
UNSPEC_MSA_SPLATI
UNSPEC_MSA_SRAR
UNSPEC_MSA_SRARI
UNSPEC_MSA_SRLR
UNSPEC_MSA_SRLRI
UNSPEC_MSA_SUBS_S
UNSPEC_MSA_SUBS_U
UNSPEC_MSA_SUBSUU_S
UNSPEC_MSA_SUBSUS_U
UNSPEC_MSA_VSHF
])
;; All vector modes with 128 bits.
(define_mode_iterator MSA [V2DF V4SF V2DI V4SI V8HI V16QI])
;; Same as MSA. Used by vcond to iterate two modes.
(define_mode_iterator MSA_2 [V2DF V4SF V2DI V4SI V8HI V16QI])
;; Only used for splitting insert_d and copy_{u,s}.d.
(define_mode_iterator MSA_D [V2DI V2DF])
;; Only used for copy_{u,s}.w.
(define_mode_iterator MSA_W [V4SI V4SF])
;; Only integer modes.
(define_mode_iterator IMSA [V2DI V4SI V8HI V16QI])
;; As IMSA but excludes V16QI.
(define_mode_iterator IMSA_DWH [V2DI V4SI V8HI])
;; As IMSA but excludes V2DI.
(define_mode_iterator IMSA_WHB [V4SI V8HI V16QI])
;; Only integer modes equal or larger than a word.
(define_mode_iterator IMSA_DW [V2DI V4SI])
;; Only integer modes smaller than a word.
(define_mode_iterator IMSA_HB [V8HI V16QI])
;; Only integer modes for fixed-point madd_q/maddr_q.
(define_mode_iterator IMSA_WH [V4SI V8HI])
;; Only floating-point modes.
(define_mode_iterator FMSA [V2DF V4SF])
;; Only used for immediate set shuffle elements instruction.
(define_mode_iterator MSA_WHB_W [V4SI V8HI V16QI V4SF])
;; The attribute gives the integer vector mode with same size.
(define_mode_attr VIMODE
[(V2DF "V2DI")
(V4SF "V4SI")
(V2DI "V2DI")
(V4SI "V4SI")
(V8HI "V8HI")
(V16QI "V16QI")])
;; The attribute gives half modes for vector modes.
(define_mode_attr VHMODE
[(V8HI "V16QI")
(V4SI "V8HI")
(V2DI "V4SI")])
;; The attribute gives double modes for vector modes.
(define_mode_attr VDMODE
[(V4SI "V2DI")
(V8HI "V4SI")
(V16QI "V8HI")])
;; The attribute gives half modes with same number of elements for vector modes.
(define_mode_attr VTRUNCMODE
[(V8HI "V8QI")
(V4SI "V4HI")
(V2DI "V2SI")])
;; This attribute gives the mode of the result for "copy_s_b, copy_u_b" etc.
(define_mode_attr VRES
[(V2DF "DF")
(V4SF "SF")
(V2DI "DI")
(V4SI "SI")
(V8HI "SI")
(V16QI "SI")])
;; Only used with MSA_D iterator.
(define_mode_attr msa_d
[(V2DI "reg_or_0")
(V2DF "register")])
;; This attribute gives the integer vector mode with same size.
(define_mode_attr mode_i
[(V2DF "v2di")
(V4SF "v4si")
(V2DI "v2di")
(V4SI "v4si")
(V8HI "v8hi")
(V16QI "v16qi")])
;; This attribute gives suffix for MSA instructions.
(define_mode_attr msafmt
[(V2DF "d")
(V4SF "w")
(V2DI "d")
(V4SI "w")
(V8HI "h")
(V16QI "b")])
;; This attribute gives suffix for integers in VHMODE.
(define_mode_attr hmsafmt
[(V2DI "w")
(V4SI "h")
(V8HI "b")])
;; This attribute gives define_insn suffix for MSA instructions that need
;; distinction between integer and floating point.
(define_mode_attr msafmt_f
[(V2DF "d_f")
(V4SF "w_f")
(V2DI "d")
(V4SI "w")
(V8HI "h")
(V16QI "b")])
;; This is used to form an immediate operand constraint using
;; "const_<indeximm>_operand".
(define_mode_attr indeximm
[(V2DF "0_or_1")
(V4SF "0_to_3")
(V2DI "0_or_1")
(V4SI "0_to_3")
(V8HI "uimm3")
(V16QI "uimm4")])
;; This attribute represents bitmask needed for vec_merge using
;; "const_<bitmask>_operand".
(define_mode_attr bitmask
[(V2DF "exp_2")
(V4SF "exp_4")
(V2DI "exp_2")
(V4SI "exp_4")
(V8HI "exp_8")
(V16QI "exp_16")])
;; This attribute is used to form an immediate operand constraint using
;; "const_<bitimm>_operand".
(define_mode_attr bitimm
[(V16QI "uimm3")
(V8HI "uimm4")
(V4SI "uimm5")
(V2DI "uimm6")])
(define_expand "vec_init<mode>"
[(match_operand:MSA 0 "register_operand")
(match_operand:MSA 1 "")]
"ISA_HAS_MSA"
{
mips_expand_vector_init (operands[0], operands[1]);
DONE;
})
;; pckev pattern with implicit type conversion.
(define_insn "vec_pack_trunc_<mode>"
[(set (match_operand:<VHMODE> 0 "register_operand" "=f")
(vec_concat:<VHMODE>
(truncate:<VTRUNCMODE>
(match_operand:IMSA_DWH 1 "register_operand" "f"))
(truncate:<VTRUNCMODE>
(match_operand:IMSA_DWH 2 "register_operand" "f"))))]
"ISA_HAS_MSA"
"pckev.<hmsafmt>\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "<MODE>")])
(define_expand "vec_unpacks_hi_v4sf"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(float_extend:V2DF
(vec_select:V2SF
(match_operand:V4SF 1 "register_operand" "f")
(match_dup 2))))]
"ISA_HAS_MSA"
{
operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, true/*high_p*/);
})
(define_expand "vec_unpacks_lo_v4sf"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(float_extend:V2DF
(vec_select:V2SF
(match_operand:V4SF 1 "register_operand" "f")
(match_dup 2))))]
"ISA_HAS_MSA"
{
operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, false/*high_p*/);
})
(define_expand "vec_unpacks_hi_<mode>"
[(match_operand:<VDMODE> 0 "register_operand")
(match_operand:IMSA_WHB 1 "register_operand")]
"ISA_HAS_MSA"
{
mips_expand_vec_unpack (operands, false/*unsigned_p*/, true/*high_p*/);
DONE;
})
(define_expand "vec_unpacks_lo_<mode>"
[(match_operand:<VDMODE> 0 "register_operand")
(match_operand:IMSA_WHB 1 "register_operand")]
"ISA_HAS_MSA"
{
mips_expand_vec_unpack (operands, false/*unsigned_p*/, false/*high_p*/);
DONE;
})
(define_expand "vec_unpacku_hi_<mode>"
[(match_operand:<VDMODE> 0 "register_operand")
(match_operand:IMSA_WHB 1 "register_operand")]
"ISA_HAS_MSA"
{
mips_expand_vec_unpack (operands, true/*unsigned_p*/, true/*high_p*/);
DONE;
})
(define_expand "vec_unpacku_lo_<mode>"
[(match_operand:<VDMODE> 0 "register_operand")
(match_operand:IMSA_WHB 1 "register_operand")]
"ISA_HAS_MSA"
{
mips_expand_vec_unpack (operands, true/*unsigned_p*/, false/*high_p*/);
DONE;
})
(define_expand "vec_extract<mode>"
[(match_operand:<UNITMODE> 0 "register_operand")
(match_operand:IMSA 1 "register_operand")
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
if (<UNITMODE>mode == QImode || <UNITMODE>mode == HImode)
{
rtx dest1 = gen_reg_rtx (SImode);
emit_insn (gen_msa_copy_s_<msafmt> (dest1, operands[1], operands[2]));
emit_move_insn (operands[0],
gen_lowpart (<UNITMODE>mode, dest1));
}
else
emit_insn (gen_msa_copy_s_<msafmt> (operands[0], operands[1], operands[2]));
DONE;
})
(define_expand "vec_extract<mode>"
[(match_operand:<UNITMODE> 0 "register_operand")
(match_operand:FMSA 1 "register_operand")
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
rtx temp;
HOST_WIDE_INT val = INTVAL (operands[2]);
if (val == 0)
temp = operands[1];
else
{
/* We need to do the SLDI operation in V16QImode and adjust
operands[2] accordingly. */
rtx wd = gen_reg_rtx (V16QImode);
rtx ws = gen_reg_rtx (V16QImode);
emit_move_insn (ws, gen_rtx_SUBREG (V16QImode, operands[1], 0));
rtx n = GEN_INT (val * GET_MODE_SIZE (<UNITMODE>mode));
gcc_assert (INTVAL (n) < GET_MODE_NUNITS (V16QImode));
emit_insn (gen_msa_sldi_b (wd, ws, ws, n));
temp = gen_reg_rtx (<MODE>mode);
emit_move_insn (temp, gen_rtx_SUBREG (<MODE>mode, wd, 0));
}
emit_insn (gen_msa_vec_extract_<msafmt_f> (operands[0], temp));
DONE;
})
(define_insn_and_split "msa_vec_extract_<msafmt_f>"
[(set (match_operand:<UNITMODE> 0 "register_operand" "=f")
(vec_select:<UNITMODE>
(match_operand:FMSA 1 "register_operand" "f")
(parallel [(const_int 0)])))]
"ISA_HAS_MSA"
"#"
"&& reload_completed"
[(set (match_dup 0) (match_dup 1))]
"operands[1] = gen_rtx_REG (<UNITMODE>mode, REGNO (operands[1]));"
[(set_attr "move_type" "fmove")
(set_attr "mode" "<UNITMODE>")])
(define_expand "vec_set<mode>"
[(match_operand:IMSA 0 "register_operand")
(match_operand:<UNITMODE> 1 "reg_or_0_operand")
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
rtx index = GEN_INT (1 << INTVAL (operands[2]));
emit_insn (gen_msa_insert_<msafmt> (operands[0], operands[1],
operands[0], index));
DONE;
})
(define_expand "vec_set<mode>"
[(match_operand:FMSA 0 "register_operand")
(match_operand:<UNITMODE> 1 "register_operand")
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
rtx index = GEN_INT (1 << INTVAL (operands[2]));
emit_insn (gen_msa_insve_<msafmt_f>_scalar (operands[0], operands[1],
operands[0], index));
DONE;
})
(define_expand "vcondu<MSA:mode><IMSA:mode>"
[(match_operand:MSA 0 "register_operand")
(match_operand:MSA 1 "reg_or_m1_operand")
(match_operand:MSA 2 "reg_or_0_operand")
(match_operator 3 ""
[(match_operand:IMSA 4 "register_operand")
(match_operand:IMSA 5 "register_operand")])]
"ISA_HAS_MSA
&& (GET_MODE_NUNITS (<MSA:MODE>mode) == GET_MODE_NUNITS (<IMSA:MODE>mode))"
{
mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands);
DONE;
})
(define_expand "vcond<MSA:mode><MSA_2:mode>"
[(match_operand:MSA 0 "register_operand")
(match_operand:MSA 1 "reg_or_m1_operand")
(match_operand:MSA 2 "reg_or_0_operand")
(match_operator 3 ""
[(match_operand:MSA_2 4 "register_operand")
(match_operand:MSA_2 5 "register_operand")])]
"ISA_HAS_MSA
&& (GET_MODE_NUNITS (<MSA:MODE>mode) == GET_MODE_NUNITS (<MSA_2:MODE>mode))"
{
mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands);
DONE;
})
(define_insn "msa_insert_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(vec_merge:MSA
(vec_duplicate:MSA
(match_operand:<UNITMODE> 1 "reg_or_0_operand" "dJ"))
(match_operand:MSA 2 "register_operand" "0")
(match_operand 3 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
{
if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode))
return "#";
else
return "insert.<msafmt>\t%w0[%y3],%z1";
}
[(set_attr "type" "simd_insert")
(set_attr "mode" "<MODE>")])
(define_split
[(set (match_operand:MSA_D 0 "register_operand")
(vec_merge:MSA_D
(vec_duplicate:MSA_D
(match_operand:<UNITMODE> 1 "<MSA_D:msa_d>_operand"))
(match_operand:MSA_D 2 "register_operand")
(match_operand 3 "const_<bitmask>_operand")))]
"reload_completed && ISA_HAS_MSA && !TARGET_64BIT"
[(const_int 0)]
{
mips_split_msa_insert_d (operands[0], operands[2], operands[3], operands[1]);
DONE;
})
(define_insn "msa_insve_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(vec_merge:MSA
(vec_duplicate:MSA
(vec_select:<UNITMODE>
(match_operand:MSA 1 "register_operand" "f")
(parallel [(const_int 0)])))
(match_operand:MSA 2 "register_operand" "0")
(match_operand 3 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
"insve.<msafmt>\t%w0[%y3],%w1[0]"
[(set_attr "type" "simd_insert")
(set_attr "mode" "<MODE>")])
;; Operand 3 is a scalar.
(define_insn "msa_insve_<msafmt_f>_scalar"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(vec_merge:FMSA
(vec_duplicate:FMSA
(match_operand:<UNITMODE> 1 "register_operand" "f"))
(match_operand:FMSA 2 "register_operand" "0")
(match_operand 3 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
"insve.<msafmt>\t%w0[%y3],%w1[0]"
[(set_attr "type" "simd_insert")
(set_attr "mode" "<MODE>")])
(define_insn "msa_copy_<su>_<msafmt>"
[(set (match_operand:<VRES> 0 "register_operand" "=d")
(any_extend:<VRES>
(vec_select:<UNITMODE>
(match_operand:IMSA_HB 1 "register_operand" "f")
(parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))]
"ISA_HAS_MSA"
"copy_<su>.<msafmt>\t%0,%w1[%2]"
[(set_attr "type" "simd_copy")
(set_attr "mode" "<MODE>")])
(define_insn "msa_copy_u_w"
[(set (match_operand:DI 0 "register_operand" "=d")
(zero_extend:DI
(vec_select:SI
(match_operand:V4SI 1 "register_operand" "f")
(parallel [(match_operand 2 "const_0_to_3_operand" "")]))))]
"ISA_HAS_MSA && TARGET_64BIT"
"copy_u.w\t%0,%w1[%2]"
[(set_attr "type" "simd_copy")
(set_attr "mode" "V4SI")])
(define_insn "msa_copy_s_<msafmt_f>_64bit"
[(set (match_operand:DI 0 "register_operand" "=d")
(sign_extend:DI
(vec_select:<UNITMODE>
(match_operand:MSA_W 1 "register_operand" "f")
(parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))]
"ISA_HAS_MSA && TARGET_64BIT"
"copy_s.<msafmt>\t%0,%w1[%2]"
[(set_attr "type" "simd_copy")
(set_attr "mode" "<MODE>")])
(define_insn "msa_copy_s_<msafmt_f>"
[(set (match_operand:<UNITMODE> 0 "register_operand" "=d")
(vec_select:<UNITMODE>
(match_operand:MSA_W 1 "register_operand" "f")
(parallel [(match_operand 2 "const_<indeximm>_operand" "")])))]
"ISA_HAS_MSA"
"copy_s.<msafmt>\t%0,%w1[%2]"
[(set_attr "type" "simd_copy")
(set_attr "mode" "<MODE>")])
(define_insn_and_split "msa_copy_s_<msafmt_f>"
[(set (match_operand:<UNITMODE> 0 "register_operand" "=d")
(vec_select:<UNITMODE>
(match_operand:MSA_D 1 "register_operand" "f")
(parallel [(match_operand 2 "const_<indeximm>_operand" "")])))]
"ISA_HAS_MSA"
{
if (TARGET_64BIT)
return "copy_s.<msafmt>\t%0,%w1[%2]";
else
return "#";
}
"reload_completed && ISA_HAS_MSA && !TARGET_64BIT"
[(const_int 0)]
{
mips_split_msa_copy_d (operands[0], operands[1], operands[2],
gen_msa_copy_s_w);
DONE;
}
[(set_attr "type" "simd_copy")
(set_attr "mode" "<MODE>")])
(define_expand "vec_perm_const<mode>"
[(match_operand:MSA 0 "register_operand")
(match_operand:MSA 1 "register_operand")
(match_operand:MSA 2 "register_operand")
(match_operand:<VIMODE> 3 "")]
"ISA_HAS_MSA"
{
if (mips_expand_vec_perm_const (operands))
DONE;
else
FAIL;
})
(define_expand "abs<mode>2"
[(match_operand:IMSA 0 "register_operand" "=f")
(abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))]
"ISA_HAS_MSA"
{
rtx reg = gen_reg_rtx (<MODE>mode);
emit_move_insn (reg, CONST0_RTX (<MODE>mode));
emit_insn (gen_msa_add_a_<msafmt> (operands[0], operands[1], reg));
DONE;
})
(define_expand "neg<mode>2"
[(set (match_operand:MSA 0 "register_operand")
(minus:MSA (match_dup 2)
(match_operand:MSA 1 "register_operand")))]
"ISA_HAS_MSA"
{
rtx reg = gen_reg_rtx (<MODE>mode);
emit_move_insn (reg, CONST0_RTX (<MODE>mode));
operands[2] = reg;
})
(define_expand "msa_ldi<mode>"
[(match_operand:IMSA 0 "register_operand")
(match_operand 1 "const_imm10_operand")]
"ISA_HAS_MSA"
{
if (<MODE>mode == V16QImode)
operands[1] = GEN_INT (trunc_int_for_mode (INTVAL (operands[1]),
<UNITMODE>mode));
emit_move_insn (operands[0],
mips_gen_const_int_vector (<MODE>mode, INTVAL (operands[1])));
DONE;
})
(define_insn "vec_perm<mode>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(unspec:MSA [(match_operand:MSA 1 "register_operand" "f")
(match_operand:MSA 2 "register_operand" "f")
(match_operand:<VIMODE> 3 "register_operand" "0")]
UNSPEC_MSA_VSHF))]
"ISA_HAS_MSA"
"vshf.<msafmt>\t%w0,%w2,%w1"
[(set_attr "type" "simd_sld")
(set_attr "mode" "<MODE>")])
(define_expand "mov<mode>"
[(set (match_operand:MSA 0)
(match_operand:MSA 1))]
"ISA_HAS_MSA"
{
if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
DONE;
})
(define_expand "movmisalign<mode>"
[(set (match_operand:MSA 0)
(match_operand:MSA 1))]
"ISA_HAS_MSA"
{
if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
DONE;
})
;; 128-bit MSA modes can only exist in MSA registers or memory. An exception
;; is allowing MSA modes for GP registers for arguments and return values.
(define_insn "mov<mode>_msa"
[(set (match_operand:MSA 0 "nonimmediate_operand" "=f,f,R,*d,*f")
(match_operand:MSA 1 "move_operand" "fYGYI,R,f,*f,*d"))]
"ISA_HAS_MSA"
{ return mips_output_move (operands[0], operands[1]); }
[(set_attr "type" "simd_move,simd_load,simd_store,simd_copy,simd_insert")
(set_attr "mode" "<MODE>")])
(define_split
[(set (match_operand:MSA 0 "nonimmediate_operand")
(match_operand:MSA 1 "move_operand"))]
"reload_completed && ISA_HAS_MSA
&& mips_split_move_insn_p (operands[0], operands[1], insn)"
[(const_int 0)]
{
mips_split_move_insn (operands[0], operands[1], curr_insn);
DONE;
})
;; Offset load
(define_expand "msa_ld_<msafmt_f>"
[(match_operand:MSA 0 "register_operand")
(match_operand 1 "pmode_register_operand")
(match_operand 2 "aq10<msafmt>_operand")]
"ISA_HAS_MSA"
{
rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
INTVAL (operands[2]));
mips_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr));
DONE;
})
;; Offset store
(define_expand "msa_st_<msafmt_f>"
[(match_operand:MSA 0 "register_operand")
(match_operand 1 "pmode_register_operand")
(match_operand 2 "aq10<msafmt>_operand")]
"ISA_HAS_MSA"
{
rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
INTVAL (operands[2]));
mips_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]);
DONE;
})
;; Integer operations
(define_insn "add<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f,f")
(plus:IMSA
(match_operand:IMSA 1 "register_operand" "f,f,f")
(match_operand:IMSA 2 "reg_or_vector_same_ximm5_operand" "f,Unv5,Uuv5")))]
"ISA_HAS_MSA"
{
switch (which_alternative)
{
case 0:
return "addv.<msafmt>\t%w0,%w1,%w2";
case 1:
{
HOST_WIDE_INT val = INTVAL (CONST_VECTOR_ELT (operands[2], 0));
operands[2] = GEN_INT (-val);
return "subvi.<msafmt>\t%w0,%w1,%d2";
}
case 2:
return "addvi.<msafmt>\t%w0,%w1,%E2";
default:
gcc_unreachable ();
}
}
[(set_attr "alu_type" "simd_add")
(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "sub<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(minus:IMSA
(match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))]
"ISA_HAS_MSA"
"@
subv.<msafmt>\t%w0,%w1,%w2
subvi.<msafmt>\t%w0,%w1,%E2"
[(set_attr "alu_type" "simd_add")
(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "mul<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(mult:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"mulv.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_maddv_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(plus:IMSA (mult:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f"))
(match_operand:IMSA 3 "register_operand" "0")))]
"ISA_HAS_MSA"
"maddv.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_msubv_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(minus:IMSA (match_operand:IMSA 1 "register_operand" "0")
(mult:IMSA (match_operand:IMSA 2 "register_operand" "f")
(match_operand:IMSA 3 "register_operand" "f"))))]
"ISA_HAS_MSA"
"msubv.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "div<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(div:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
{ return mips_msa_output_division ("div_s.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "simd_div")
(set_attr "mode" "<MODE>")])
(define_insn "udiv<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(udiv:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
{ return mips_msa_output_division ("div_u.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "simd_div")
(set_attr "mode" "<MODE>")])
(define_insn "mod<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(mod:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
{ return mips_msa_output_division ("mod_s.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "simd_div")
(set_attr "mode" "<MODE>")])
(define_insn "umod<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(umod:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
{ return mips_msa_output_division ("mod_u.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "simd_div")
(set_attr "mode" "<MODE>")])
(define_insn "xor<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f,f")
(xor:IMSA
(match_operand:IMSA 1 "register_operand" "f,f,f")
(match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YC,Urv8")))]
"ISA_HAS_MSA"
"@
xor.v\t%w0,%w1,%w2
bnegi.%v0\t%w0,%w1,%V2
xori.b\t%w0,%w1,%B2"
[(set_attr "type" "simd_logic,simd_bit,simd_logic")
(set_attr "mode" "<MODE>")])
(define_insn "ior<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f,f")
(ior:IMSA
(match_operand:IMSA 1 "register_operand" "f,f,f")
(match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YC,Urv8")))]
"ISA_HAS_MSA"
"@
or.v\t%w0,%w1,%w2
bseti.%v0\t%w0,%w1,%V2
ori.b\t%w0,%w1,%B2"
[(set_attr "type" "simd_logic,simd_bit,simd_logic")
(set_attr "mode" "<MODE>")])
(define_insn "and<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f,f")
(and:IMSA
(match_operand:IMSA 1 "register_operand" "f,f,f")
(match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YZ,Urv8")))]
"ISA_HAS_MSA"
{
switch (which_alternative)
{
case 0:
return "and.v\t%w0,%w1,%w2";
case 1:
{
rtx elt0 = CONST_VECTOR_ELT (operands[2], 0);
unsigned HOST_WIDE_INT val = ~UINTVAL (elt0);
operands[2] = mips_gen_const_int_vector (<MODE>mode, val & (-val));
return "bclri.%v0\t%w0,%w1,%V2";
}
case 2:
return "andi.b\t%w0,%w1,%B2";
default:
gcc_unreachable ();
}
}
[(set_attr "type" "simd_logic,simd_bit,simd_logic")
(set_attr "mode" "<MODE>")])
(define_insn "one_cmpl<mode>2"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(not:IMSA (match_operand:IMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"nor.v\t%w0,%w1,%w1"
[(set_attr "type" "simd_logic")
(set_attr "mode" "TI")])
(define_insn "vlshr<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(lshiftrt:IMSA
(match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))]
"ISA_HAS_MSA"
"@
srl.<msafmt>\t%w0,%w1,%w2
srli.<msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "vashr<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ashiftrt:IMSA
(match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))]
"ISA_HAS_MSA"
"@
sra.<msafmt>\t%w0,%w1,%w2
srai.<msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "vashl<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ashift:IMSA
(match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))]
"ISA_HAS_MSA"
"@
sll.<msafmt>\t%w0,%w1,%w2
slli.<msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
;; Floating-point operations
(define_insn "add<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(plus:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fadd.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fadd")
(set_attr "mode" "<MODE>")])
(define_insn "sub<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(minus:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fsub.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fadd")
(set_attr "mode" "<MODE>")])
(define_insn "mul<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(mult:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmul.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fmul")
(set_attr "mode" "<MODE>")])
(define_insn "div<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(div:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fdiv.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fdiv")
(set_attr "mode" "<MODE>")])
(define_insn "fma<mode>4"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(fma:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")
(match_operand:FMSA 3 "register_operand" "0")))]
"ISA_HAS_MSA"
"fmadd.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fmadd")
(set_attr "mode" "<MODE>")])
(define_insn "fnma<mode>4"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(fma:FMSA (neg:FMSA (match_operand:FMSA 1 "register_operand" "f"))
(match_operand:FMSA 2 "register_operand" "f")
(match_operand:FMSA 3 "register_operand" "0")))]
"ISA_HAS_MSA"
"fmsub.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fmadd")
(set_attr "mode" "<MODE>")])
(define_insn "sqrt<mode>2"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(sqrt:FMSA (match_operand:FMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"fsqrt.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fdiv")
(set_attr "mode" "<MODE>")])
;; Built-in functions
(define_insn "msa_add_a_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(plus:IMSA (abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))
(abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))))]
"ISA_HAS_MSA"
"add_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_adds_a_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(ss_plus:IMSA
(abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))
(abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))))]
"ISA_HAS_MSA"
"adds_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "ssadd<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(ss_plus:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"adds_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "usadd<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(us_plus:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"adds_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_asub_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_ASUB_S))]
"ISA_HAS_MSA"
"asub_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_asub_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_ASUB_U))]
"ISA_HAS_MSA"
"asub_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ave_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_AVE_S))]
"ISA_HAS_MSA"
"ave_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ave_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_AVE_U))]
"ISA_HAS_MSA"
"ave_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_aver_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_AVER_S))]
"ISA_HAS_MSA"
"aver_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_aver_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_AVER_U))]
"ISA_HAS_MSA"
"aver_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bclr_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_BCLR))]
"ISA_HAS_MSA"
"bclr.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bclri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_BCLRI))]
"ISA_HAS_MSA"
"bclri.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_binsl_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0")
(match_operand:IMSA 2 "register_operand" "f")
(match_operand:IMSA 3 "register_operand" "f")]
UNSPEC_MSA_BINSL))]
"ISA_HAS_MSA"
"binsl.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_bitins")
(set_attr "mode" "<MODE>")])
(define_insn "msa_binsli_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0")
(match_operand:IMSA 2 "register_operand" "f")
(match_operand 3 "const_<bitimm>_operand" "")]
UNSPEC_MSA_BINSLI))]
"ISA_HAS_MSA"
"binsli.<msafmt>\t%w0,%w2,%3"
[(set_attr "type" "simd_bitins")
(set_attr "mode" "<MODE>")])
(define_insn "msa_binsr_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0")
(match_operand:IMSA 2 "register_operand" "f")
(match_operand:IMSA 3 "register_operand" "f")]
UNSPEC_MSA_BINSR))]
"ISA_HAS_MSA"
"binsr.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_bitins")
(set_attr "mode" "<MODE>")])
(define_insn "msa_binsri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0")
(match_operand:IMSA 2 "register_operand" "f")
(match_operand 3 "const_<bitimm>_operand" "")]
UNSPEC_MSA_BINSRI))]
"ISA_HAS_MSA"
"binsri.<msafmt>\t%w0,%w2,%3"
[(set_attr "type" "simd_bitins")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bmnz_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ior:IMSA (and:IMSA (match_operand:IMSA 2 "register_operand" "f,f")
(match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8"))
(and:IMSA (not:IMSA (match_dup 3))
(match_operand:IMSA 1 "register_operand" "0,0"))))]
"ISA_HAS_MSA"
"@
bmnz.v\t%w0,%w2,%w3
bmnzi.b\t%w0,%w2,%B3"
[(set_attr "type" "simd_bitmov")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bmz_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ior:IMSA (and:IMSA (not:IMSA
(match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8"))
(match_operand:IMSA 2 "register_operand" "f,f"))
(and:IMSA (match_operand:IMSA 1 "register_operand" "0,0")
(match_dup 3))))]
"ISA_HAS_MSA"
"@
bmz.v\t%w0,%w2,%w3
bmzi.b\t%w0,%w2,%B3"
[(set_attr "type" "simd_bitmov")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bneg_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_BNEG))]
"ISA_HAS_MSA"
"bneg.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bnegi_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_msa_branch_operand" "")]
UNSPEC_MSA_BNEGI))]
"ISA_HAS_MSA"
"bnegi.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bsel_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ior:IMSA (and:IMSA (not:IMSA
(match_operand:IMSA 1 "register_operand" "0,0"))
(match_operand:IMSA 2 "register_operand" "f,f"))
(and:IMSA (match_dup 1)
(match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8"))))]
"ISA_HAS_MSA"
"@
bsel.v\t%w0,%w2,%w3
bseli.b\t%w0,%w2,%B3"
[(set_attr "type" "simd_bitmov")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bset_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_BSET))]
"ISA_HAS_MSA"
"bset.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_bseti_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_BSETI))]
"ISA_HAS_MSA"
"bseti.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_code_iterator ICC [eq le leu lt ltu])
(define_code_attr icc
[(eq "eq")
(le "le_s")
(leu "le_u")
(lt "lt_s")
(ltu "lt_u")])
(define_code_attr icci
[(eq "eqi")
(le "lei_s")
(leu "lei_u")
(lt "lti_s")
(ltu "lti_u")])
(define_code_attr cmpi
[(eq "s")
(le "s")
(leu "u")
(lt "s")
(ltu "u")])
(define_insn "msa_c<ICC:icc>_<IMSA:msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(ICC:IMSA
(match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_<ICC:cmpi>imm5_operand" "f,U<ICC:cmpi>v5")))]
"ISA_HAS_MSA"
"@
c<ICC:icc>.<IMSA:msafmt>\t%w0,%w1,%w2
c<ICC:icci>.<IMSA:msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_dotp_<su>_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(plus:V2DI
(mult:V2DI
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 1 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)])))
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)]))))
(mult:V2DI
(any_extend:V2DI
(vec_select:V4SI (match_dup 1)
(parallel [(const_int 1) (const_int 3)])))
(any_extend:V2DI
(vec_select:V4SI (match_dup 2)
(parallel [(const_int 1) (const_int 3)]))))))]
"ISA_HAS_MSA"
"dotp_<su>.d\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V2DI")])
(define_insn "msa_dotp_<su>_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(plus:V4SI
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 1 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)]))))
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI (match_dup 1)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))
(any_extend:V4SI
(vec_select:V4HI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)]))))))]
"ISA_HAS_MSA"
"dotp_<su>.w\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V4SI")])
(define_insn "msa_dotp_<su>_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(plus:V8HI
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 1 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)])))
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)]))))
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI (match_dup 1)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))
(any_extend:V8HI
(vec_select:V8QI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)]))))))]
"ISA_HAS_MSA"
"dotp_<su>.h\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V8HI")])
(define_insn "msa_dpadd_<su>_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(plus:V2DI
(plus:V2DI
(mult:V2DI
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)])))
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)]))))
(mult:V2DI
(any_extend:V2DI
(vec_select:V4SI (match_dup 2)
(parallel [(const_int 1) (const_int 3)])))
(any_extend:V2DI
(vec_select:V4SI (match_dup 3)
(parallel [(const_int 1) (const_int 3)])))))
(match_operand:V2DI 1 "register_operand" "0")))]
"ISA_HAS_MSA"
"dpadd_<su>.d\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V2DI")])
(define_insn "msa_dpadd_<su>_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(plus:V4SI
(plus:V4SI
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)]))))
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))
(any_extend:V4SI
(vec_select:V4HI (match_dup 3)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))))
(match_operand:V4SI 1 "register_operand" "0")))]
"ISA_HAS_MSA"
"dpadd_<su>.w\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V4SI")])
(define_insn "msa_dpadd_<su>_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(plus:V8HI
(plus:V8HI
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)])))
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)]))))
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))
(any_extend:V8HI
(vec_select:V8QI (match_dup 3)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))))
(match_operand:V8HI 1 "register_operand" "0")))]
"ISA_HAS_MSA"
"dpadd_<su>.h\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V8HI")])
(define_insn "msa_dpsub_<su>_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(minus:V2DI
(match_operand:V2DI 1 "register_operand" "0")
(plus:V2DI
(mult:V2DI
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)])))
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)]))))
(mult:V2DI
(any_extend:V2DI
(vec_select:V4SI (match_dup 2)
(parallel [(const_int 1) (const_int 3)])))
(any_extend:V2DI
(vec_select:V4SI (match_dup 3)
(parallel [(const_int 1) (const_int 3)])))))))]
"ISA_HAS_MSA"
"dpsub_<su>.d\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V2DI")])
(define_insn "msa_dpsub_<su>_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(minus:V4SI
(match_operand:V4SI 1 "register_operand" "0")
(plus:V4SI
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)]))))
(mult:V4SI
(any_extend:V4SI
(vec_select:V4HI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))
(any_extend:V4SI
(vec_select:V4HI (match_dup 3)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))))))]
"ISA_HAS_MSA"
"dpsub_<su>.w\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V4SI")])
(define_insn "msa_dpsub_<su>_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(minus:V8HI
(match_operand:V8HI 1 "register_operand" "0")
(plus:V8HI
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 2 "register_operand" "%f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)])))
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 3 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)]))))
(mult:V8HI
(any_extend:V8HI
(vec_select:V8QI (match_dup 2)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))
(any_extend:V8HI
(vec_select:V8QI (match_dup 3)
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))))))]
"ISA_HAS_MSA"
"dpsub_<su>.h\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "V8HI")])
(define_insn "msa_fclass_<msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FCLASS))]
"ISA_HAS_MSA"
"fclass.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fclass")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fcaf_<msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")]
UNSPEC_MSA_FCAF))]
"ISA_HAS_MSA"
"fcaf.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcmp")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fcune_<FMSA:msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")]
UNSPEC_MSA_FCUNE))]
"ISA_HAS_MSA"
"fcune.<FMSA:msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcmp")
(set_attr "mode" "<MODE>")])
(define_code_iterator FCC [unordered ordered eq ne le lt uneq unle unlt])
(define_code_attr fcc
[(unordered "fcun")
(ordered "fcor")
(eq "fceq")
(ne "fcne")
(uneq "fcueq")
(unle "fcule")
(unlt "fcult")
(le "fcle")
(lt "fclt")])
(define_int_iterator FSC_UNS [UNSPEC_MSA_FSAF UNSPEC_MSA_FSUN UNSPEC_MSA_FSOR
UNSPEC_MSA_FSEQ UNSPEC_MSA_FSNE UNSPEC_MSA_FSUEQ
UNSPEC_MSA_FSUNE UNSPEC_MSA_FSULE UNSPEC_MSA_FSULT
UNSPEC_MSA_FSLE UNSPEC_MSA_FSLT])
(define_int_attr fsc
[(UNSPEC_MSA_FSAF "fsaf")
(UNSPEC_MSA_FSUN "fsun")
(UNSPEC_MSA_FSOR "fsor")
(UNSPEC_MSA_FSEQ "fseq")
(UNSPEC_MSA_FSNE "fsne")
(UNSPEC_MSA_FSUEQ "fsueq")
(UNSPEC_MSA_FSUNE "fsune")
(UNSPEC_MSA_FSULE "fsule")
(UNSPEC_MSA_FSULT "fsult")
(UNSPEC_MSA_FSLE "fsle")
(UNSPEC_MSA_FSLT "fslt")])
(define_insn "msa_<FCC:fcc>_<FMSA:msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(FCC:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"<FCC:fcc>.<FMSA:msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcmp")
(set_attr "mode" "<MODE>")])
(define_insn "msa_<fsc>_<FMSA:msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")]
FSC_UNS))]
"ISA_HAS_MSA"
"<fsc>.<FMSA:msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcmp")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fexp2_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")
(match_operand:<VIMODE> 2 "register_operand" "f")]
UNSPEC_MSA_FEXP2))]
"ISA_HAS_MSA"
"fexp2.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fexp2")
(set_attr "mode" "<MODE>")])
(define_mode_attr fint
[(V4SF "v4si")
(V2DF "v2di")])
(define_mode_attr FQ
[(V4SF "V8HI")
(V2DF "V4SI")])
(define_mode_attr FINTCNV
[(V4SF "I2S")
(V2DF "I2D")])
(define_mode_attr FINTCNV_2
[(V4SF "S2I")
(V2DF "D2I")])
(define_insn "float<fint><FMSA:mode>2"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(float:FMSA (match_operand:<VIMODE> 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ffint_s.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV>")
(set_attr "mode" "<MODE>")])
(define_insn "floatuns<fint><FMSA:mode>2"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unsigned_float:FMSA
(match_operand:<VIMODE> 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ffint_u.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV>")
(set_attr "mode" "<MODE>")])
(define_mode_attr FFQ
[(V4SF "V8HI")
(V2DF "V4SI")])
(define_insn "msa_ffql_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")]
UNSPEC_MSA_FFQL))]
"ISA_HAS_MSA"
"ffql.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV>")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ffqr_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")]
UNSPEC_MSA_FFQR))]
"ISA_HAS_MSA"
"ffqr.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV>")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fill_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f,f")
(vec_duplicate:MSA
(match_operand:<UNITMODE> 1 "reg_or_0_operand" "d,J")))]
"ISA_HAS_MSA"
{
if (which_alternative == 1)
return "ldi.<msafmt>\t%w0,0";
if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode))
return "#";
else
return "fill.<msafmt>\t%w0,%z1";
}
[(set_attr "type" "simd_fill")
(set_attr "mode" "<MODE>")])
(define_split
[(set (match_operand:MSA_D 0 "register_operand")
(vec_duplicate:MSA_D
(match_operand:<UNITMODE> 1 "register_operand")))]
"reload_completed && ISA_HAS_MSA && !TARGET_64BIT"
[(const_int 0)]
{
mips_split_msa_fill_d (operands[0], operands[1]);
DONE;
})
(define_insn "msa_flog2_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FLOG2))]
"ISA_HAS_MSA"
"flog2.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_flog2")
(set_attr "mode" "<MODE>")])
(define_insn "smax<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(smax:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmax.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fminmax")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fmax_a_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(if_then_else
(gt (abs:FMSA (match_operand:FMSA 1 "register_operand" "f"))
(abs:FMSA (match_operand:FMSA 2 "register_operand" "f")))
(match_dup 1)
(match_dup 2)))]
"ISA_HAS_MSA"
"fmax_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fminmax")
(set_attr "mode" "<MODE>")])
(define_insn "smin<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(smin:FMSA (match_operand:FMSA 1 "register_operand" "f")
(match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmin.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fminmax")
(set_attr "mode" "<MODE>")])
(define_insn "msa_fmin_a_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(if_then_else
(lt (abs:FMSA (match_operand:FMSA 1 "register_operand" "f"))
(abs:FMSA (match_operand:FMSA 2 "register_operand" "f")))
(match_dup 1)
(match_dup 2)))]
"ISA_HAS_MSA"
"fmin_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_fminmax")
(set_attr "mode" "<MODE>")])
(define_insn "msa_frcp_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FRCP))]
"ISA_HAS_MSA"
"frcp.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fdiv")
(set_attr "mode" "<MODE>")])
(define_insn "msa_frint_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FRINT))]
"ISA_HAS_MSA"
"frint.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "<MODE>")])
(define_insn "msa_frsqrt_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FRSQRT))]
"ISA_HAS_MSA"
"frsqrt.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fdiv")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ftint_s_<msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FTINT_S))]
"ISA_HAS_MSA"
"ftint_s.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV_2>")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ftint_u_<msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FTINT_U))]
"ISA_HAS_MSA"
"ftint_u.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV_2>")
(set_attr "mode" "<MODE>")])
(define_insn "fix_trunc<FMSA:mode><mode_i>2"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ftrunc_s.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV_2>")
(set_attr "mode" "<MODE>")])
(define_insn "fixuns_trunc<FMSA:mode><mode_i>2"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unsigned_fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ftrunc_u.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "<FINTCNV_2>")
(set_attr "mode" "<MODE>")])
(define_insn "msa_ftq_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(unspec:V8HI [(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f")]
UNSPEC_MSA_FTQ))]
"ISA_HAS_MSA"
"ftq.h\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "S2I")
(set_attr "mode" "V4SF")])
(define_insn "msa_ftq_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(unspec:V4SI [(match_operand:V2DF 1 "register_operand" "f")
(match_operand:V2DF 2 "register_operand" "f")]
UNSPEC_MSA_FTQ))]
"ISA_HAS_MSA"
"ftq.w\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcvt")
(set_attr "cnv_mode" "D2I")
(set_attr "mode" "V2DF")])
(define_insn "msa_h<optab>_<su>_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(addsub:V8HI
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 1 "register_operand" "f")
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))
(any_extend:V8HI
(vec_select:V8QI
(match_operand:V16QI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)])))))]
"ISA_HAS_MSA"
"h<optab>_<su>.h\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "V8HI")])
(define_insn "msa_h<optab>_<su>_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(addsub:V4SI
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 1 "register_operand" "f")
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))
(any_extend:V4SI
(vec_select:V4HI
(match_operand:V8HI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))))]
"ISA_HAS_MSA"
"h<optab>_<su>.w\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "V4SI")])
(define_insn "msa_h<optab>_<su>_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(addsub:V2DI
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 1 "register_operand" "f")
(parallel [(const_int 1) (const_int 3)])))
(any_extend:V2DI
(vec_select:V2SI
(match_operand:V4SI 2 "register_operand" "f")
(parallel [(const_int 0) (const_int 2)])))))]
"ISA_HAS_MSA"
"h<optab>_<su>.d\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "V2DI")])
(define_insn "msa_ilvev_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 16)
(const_int 2) (const_int 18)
(const_int 4) (const_int 20)
(const_int 6) (const_int 22)
(const_int 8) (const_int 24)
(const_int 10) (const_int 26)
(const_int 12) (const_int 28)
(const_int 14) (const_int 30)])))]
"ISA_HAS_MSA"
"ilvev.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_ilvev_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 8)
(const_int 2) (const_int 10)
(const_int 4) (const_int 12)
(const_int 6) (const_int 14)])))]
"ISA_HAS_MSA"
"ilvev.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_ilvev_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 4)
(const_int 2) (const_int 6)])))]
"ISA_HAS_MSA"
"ilvev.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_ilvev_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 4)
(const_int 2) (const_int 6)])))]
"ISA_HAS_MSA"
"ilvev.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "msa_ilvl_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 8) (const_int 24)
(const_int 9) (const_int 25)
(const_int 10) (const_int 26)
(const_int 11) (const_int 27)
(const_int 12) (const_int 28)
(const_int 13) (const_int 29)
(const_int 14) (const_int 30)
(const_int 15) (const_int 31)])))]
"ISA_HAS_MSA"
"ilvl.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_ilvl_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 4) (const_int 12)
(const_int 5) (const_int 13)
(const_int 6) (const_int 14)
(const_int 7) (const_int 15)])))]
"ISA_HAS_MSA"
"ilvl.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_ilvl_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 2) (const_int 6)
(const_int 3) (const_int 7)])))]
"ISA_HAS_MSA"
"ilvl.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_ilvl_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 2) (const_int 6)
(const_int 3) (const_int 7)])))]
"ISA_HAS_MSA"
"ilvl.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "msa_ilvl_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(vec_select:V2DI
(vec_concat:V4DI
(match_operand:V2DI 1 "register_operand" "f")
(match_operand:V2DI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)])))]
"ISA_HAS_MSA"
"ilvl.d\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V2DI")])
(define_insn "msa_ilvl_d_f"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(vec_select:V2DF
(vec_concat:V4DF
(match_operand:V2DF 1 "register_operand" "f")
(match_operand:V2DF 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)])))]
"ISA_HAS_MSA"
"ilvl.d\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V2DF")])
(define_insn "msa_ilvod_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 17)
(const_int 3) (const_int 19)
(const_int 5) (const_int 21)
(const_int 7) (const_int 23)
(const_int 9) (const_int 25)
(const_int 11) (const_int 27)
(const_int 13) (const_int 29)
(const_int 15) (const_int 31)])))]
"ISA_HAS_MSA"
"ilvod.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_ilvod_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 9)
(const_int 3) (const_int 11)
(const_int 5) (const_int 13)
(const_int 7) (const_int 15)])))]
"ISA_HAS_MSA"
"ilvod.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_ilvod_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 5)
(const_int 3) (const_int 7)])))]
"ISA_HAS_MSA"
"ilvod.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_ilvod_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 5)
(const_int 3) (const_int 7)])))]
"ISA_HAS_MSA"
"ilvod.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "msa_ilvr_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 16)
(const_int 1) (const_int 17)
(const_int 2) (const_int 18)
(const_int 3) (const_int 19)
(const_int 4) (const_int 20)
(const_int 5) (const_int 21)
(const_int 6) (const_int 22)
(const_int 7) (const_int 23)])))]
"ISA_HAS_MSA"
"ilvr.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_ilvr_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 8)
(const_int 1) (const_int 9)
(const_int 2) (const_int 10)
(const_int 3) (const_int 11)])))]
"ISA_HAS_MSA"
"ilvr.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_ilvr_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 4)
(const_int 1) (const_int 5)])))]
"ISA_HAS_MSA"
"ilvr.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_ilvr_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 4)
(const_int 1) (const_int 5)])))]
"ISA_HAS_MSA"
"ilvr.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "msa_ilvr_d"
[(set (match_operand:V2DI 0 "register_operand" "=f")
(vec_select:V2DI
(vec_concat:V4DI
(match_operand:V2DI 1 "register_operand" "f")
(match_operand:V2DI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)])))]
"ISA_HAS_MSA"
"ilvr.d\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V2DI")])
(define_insn "msa_ilvr_d_f"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(vec_select:V2DF
(vec_concat:V4DF
(match_operand:V2DF 1 "register_operand" "f")
(match_operand:V2DF 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)])))]
"ISA_HAS_MSA"
"ilvr.d\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V2DF")])
(define_insn "msa_madd_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0")
(match_operand:IMSA_WH 2 "register_operand" "f")
(match_operand:IMSA_WH 3 "register_operand" "f")]
UNSPEC_MSA_MADD_Q))]
"ISA_HAS_MSA"
"madd_q.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_maddr_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0")
(match_operand:IMSA_WH 2 "register_operand" "f")
(match_operand:IMSA_WH 3 "register_operand" "f")]
UNSPEC_MSA_MADDR_Q))]
"ISA_HAS_MSA"
"maddr_q.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_max_a_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(if_then_else
(gt (abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))
(abs:IMSA (match_operand:IMSA 2 "register_operand" "f")))
(match_dup 1)
(match_dup 2)))]
"ISA_HAS_MSA"
"max_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "smax<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(smax:IMSA (match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_simm5_operand" "f,Usv5")))]
"ISA_HAS_MSA"
"@
max_s.<msafmt>\t%w0,%w1,%w2
maxi_s.<msafmt>\t%w0,%w1,%B2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "umax<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(umax:IMSA (match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))]
"ISA_HAS_MSA"
"@
max_u.<msafmt>\t%w0,%w1,%w2
maxi_u.<msafmt>\t%w0,%w1,%B2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_min_a_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(if_then_else
(lt (abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))
(abs:IMSA (match_operand:IMSA 2 "register_operand" "f")))
(match_dup 1)
(match_dup 2)))]
"ISA_HAS_MSA"
"min_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "smin<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(smin:IMSA (match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_simm5_operand" "f,Usv5")))]
"ISA_HAS_MSA"
"@
min_s.<msafmt>\t%w0,%w1,%w2
mini_s.<msafmt>\t%w0,%w1,%B2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "umin<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(umin:IMSA (match_operand:IMSA 1 "register_operand" "f,f")
(match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))]
"ISA_HAS_MSA"
"@
min_u.<msafmt>\t%w0,%w1,%w2
mini_u.<msafmt>\t%w0,%w1,%B2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_msub_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0")
(match_operand:IMSA_WH 2 "register_operand" "f")
(match_operand:IMSA_WH 3 "register_operand" "f")]
UNSPEC_MSA_MSUB_Q))]
"ISA_HAS_MSA"
"msub_q.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_msubr_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0")
(match_operand:IMSA_WH 2 "register_operand" "f")
(match_operand:IMSA_WH 3 "register_operand" "f")]
UNSPEC_MSA_MSUBR_Q))]
"ISA_HAS_MSA"
"msubr_q.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_mul_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "f")
(match_operand:IMSA_WH 2 "register_operand" "f")]
UNSPEC_MSA_MUL_Q))]
"ISA_HAS_MSA"
"mul_q.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_mulr_q_<msafmt>"
[(set (match_operand:IMSA_WH 0 "register_operand" "=f")
(unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "f")
(match_operand:IMSA_WH 2 "register_operand" "f")]
UNSPEC_MSA_MULR_Q))]
"ISA_HAS_MSA"
"mulr_q.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_mul")
(set_attr "mode" "<MODE>")])
(define_insn "msa_nloc_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")]
UNSPEC_MSA_NLOC))]
"ISA_HAS_MSA"
"nloc.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "clz<mode>2"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(clz:IMSA (match_operand:IMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"nlzc.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_bit")
(set_attr "mode" "<MODE>")])
(define_insn "msa_nor_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
(and:IMSA (not:IMSA (match_operand:IMSA 1 "register_operand" "f,f"))
(not:IMSA (match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,Urv8"))))]
"ISA_HAS_MSA"
"@
nor.v\t%w0,%w1,%w2
nori.b\t%w0,%w1,%B2"
[(set_attr "type" "simd_logic")
(set_attr "mode" "<MODE>")])
(define_insn "msa_pckev_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)
(const_int 16) (const_int 18)
(const_int 20) (const_int 22)
(const_int 24) (const_int 26)
(const_int 28) (const_int 30)])))]
"ISA_HAS_MSA"
"pckev.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_pckev_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)
(const_int 8) (const_int 10)
(const_int 12) (const_int 14)])))]
"ISA_HAS_MSA"
"pckev.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_pckev_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))]
"ISA_HAS_MSA"
"pckev.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_pckev_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 0) (const_int 2)
(const_int 4) (const_int 6)])))]
"ISA_HAS_MSA"
"pckev.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "msa_pckod_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
(vec_select:V16QI
(vec_concat:V32QI
(match_operand:V16QI 1 "register_operand" "f")
(match_operand:V16QI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)
(const_int 17) (const_int 19)
(const_int 21) (const_int 23)
(const_int 25) (const_int 27)
(const_int 29) (const_int 31)])))]
"ISA_HAS_MSA"
"pckod.b\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V16QI")])
(define_insn "msa_pckod_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(vec_select:V8HI
(vec_concat:V16HI
(match_operand:V8HI 1 "register_operand" "f")
(match_operand:V8HI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)
(const_int 9) (const_int 11)
(const_int 13) (const_int 15)])))]
"ISA_HAS_MSA"
"pckod.h\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V8HI")])
(define_insn "msa_pckod_w"
[(set (match_operand:V4SI 0 "register_operand" "=f")
(vec_select:V4SI
(vec_concat:V8SI
(match_operand:V4SI 1 "register_operand" "f")
(match_operand:V4SI 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))]
"ISA_HAS_MSA"
"pckod.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SI")])
(define_insn "msa_pckod_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_select:V4SF
(vec_concat:V8SF
(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f"))
(parallel [(const_int 1) (const_int 3)
(const_int 5) (const_int 7)])))]
"ISA_HAS_MSA"
"pckod.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_permute")
(set_attr "mode" "V4SF")])
(define_insn "popcount<mode>2"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(popcount:IMSA (match_operand:IMSA 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"pcnt.<msafmt>\t%w0,%w1"
[(set_attr "type" "simd_pcnt")
(set_attr "mode" "<MODE>")])
(define_insn "msa_sat_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_SAT_S))]
"ISA_HAS_MSA"
"sat_s.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_sat")
(set_attr "mode" "<MODE>")])
(define_insn "msa_sat_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_SAT_U))]
"ISA_HAS_MSA"
"sat_u.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_sat")
(set_attr "mode" "<MODE>")])
(define_insn "msa_shf_<msafmt_f>"
[(set (match_operand:MSA_WHB_W 0 "register_operand" "=f")
(vec_select:MSA_WHB_W
(match_operand:MSA_WHB_W 1 "register_operand" "f")
(match_operand 2 "par_const_vector_shf_set_operand" "")))]
"ISA_HAS_MSA"
{
HOST_WIDE_INT val = 0;
unsigned int i;
/* We convert the selection to an immediate. */
for (i = 0; i < 4; i++)
val |= INTVAL (XVECEXP (operands[2], 0, i)) << (2 * i);
operands[2] = GEN_INT (val);
return "shf.<msafmt>\t%w0,%w1,%X2";
}
[(set_attr "type" "simd_shf")
(set_attr "mode" "<MODE>")])
(define_insn "msa_srar_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SRAR))]
"ISA_HAS_MSA"
"srar.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "msa_srari_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_SRARI))]
"ISA_HAS_MSA"
"srari.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "msa_srlr_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SRLR))]
"ISA_HAS_MSA"
"srlr.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "msa_srlri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_<bitimm>_operand" "")]
UNSPEC_MSA_SRLRI))]
"ISA_HAS_MSA"
"srlri.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "simd_shift")
(set_attr "mode" "<MODE>")])
(define_insn "msa_subs_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SUBS_S))]
"ISA_HAS_MSA"
"subs_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_subs_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SUBS_U))]
"ISA_HAS_MSA"
"subs_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_subsuu_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SUBSUU_S))]
"ISA_HAS_MSA"
"subsuu_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_subsus_u_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "register_operand" "f")]
UNSPEC_MSA_SUBSUS_U))]
"ISA_HAS_MSA"
"subsus_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "simd_int_arith")
(set_attr "mode" "<MODE>")])
(define_insn "msa_sld_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(unspec:MSA [(match_operand:MSA 1 "register_operand" "0")
(match_operand:MSA 2 "register_operand" "f")
(match_operand:SI 3 "reg_or_0_operand" "dJ")]
UNSPEC_MSA_SLD))]
"ISA_HAS_MSA"
"sld.<msafmt>\t%w0,%w2[%z3]"
[(set_attr "type" "simd_sld")
(set_attr "mode" "<MODE>")])
(define_insn "msa_sldi_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(unspec:MSA [(match_operand:MSA 1 "register_operand" "0")
(match_operand:MSA 2 "register_operand" "f")
(match_operand 3 "const_<indeximm>_operand" "")]
UNSPEC_MSA_SLDI))]
"ISA_HAS_MSA"
"sldi.<msafmt>\t%w0,%w2[%3]"
[(set_attr "type" "simd_sld")
(set_attr "mode" "<MODE>")])
(define_insn "msa_splat_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(unspec:MSA [(match_operand:MSA 1 "register_operand" "f")
(match_operand:SI 2 "register_operand" "d")]
UNSPEC_MSA_SPLAT))]
"ISA_HAS_MSA"
"splat.<msafmt>\t%w0,%w1[%z2]"
[(set_attr "type" "simd_splat")
(set_attr "mode" "<MODE>")])
(define_insn "msa_splati_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(vec_duplicate:MSA
(vec_select:<UNITMODE>
(match_operand:MSA 1 "register_operand" "f")
(parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))]
"ISA_HAS_MSA"
"splati.<msafmt>\t%w0,%w1[%2]"
[(set_attr "type" "simd_splat")
(set_attr "mode" "<MODE>")])
(define_insn "msa_splati_<msafmt_f>_scalar"
[(set (match_operand:FMSA 0 "register_operand" "=f")
(unspec:FMSA [(match_operand:<UNITMODE> 1 "register_operand" "f")]
UNSPEC_MSA_SPLATI))]
"ISA_HAS_MSA"
"splati.<msafmt>\t%w0,%w1[0]"
[(set_attr "type" "simd_splat")
(set_attr "mode" "<MODE>")])
(define_insn "msa_cfcmsa"
[(set (match_operand:SI 0 "register_operand" "=d")
(unspec_volatile:SI [(match_operand 1 "const_uimm5_operand" "")]
UNSPEC_MSA_CFCMSA))]
"ISA_HAS_MSA"
"cfcmsa\t%0,$%1"
[(set_attr "type" "simd_cmsa")
(set_attr "mode" "SI")])
(define_insn "msa_ctcmsa"
[(unspec_volatile [(match_operand 0 "const_uimm5_operand" "")
(match_operand:SI 1 "register_operand" "d")]
UNSPEC_MSA_CTCMSA)]
"ISA_HAS_MSA"
"ctcmsa\t$%0,%1"
[(set_attr "type" "simd_cmsa")
(set_attr "mode" "SI")])
(define_insn "msa_fexdo_h"
[(set (match_operand:V8HI 0 "register_operand" "=f")
(unspec:V8HI [(match_operand:V4SF 1 "register_operand" "f")
(match_operand:V4SF 2 "register_operand" "f")]
UNSPEC_MSA_FEXDO))]
"ISA_HAS_MSA"
"fexdo.h\t%w0,%w1,%w2"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V8HI")])
(define_insn "vec_pack_trunc_v2df"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(vec_concat:V4SF
(float_truncate:V2SF (match_operand:V2DF 1 "register_operand" "f"))
(float_truncate:V2SF (match_operand:V2DF 2 "register_operand" "f"))))]
"ISA_HAS_MSA"
"fexdo.w\t%w0,%w2,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V4SF")])
(define_insn "msa_fexupl_w"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")]
UNSPEC_MSA_FEXUPL))]
"ISA_HAS_MSA"
"fexupl.w\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V4SF")])
(define_insn "msa_fexupl_d"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(float_extend:V2DF
(vec_select:V2SF
(match_operand:V4SF 1 "register_operand" "f")
(parallel [(const_int 2) (const_int 3)]))))]
"ISA_HAS_MSA"
"fexupl.d\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V2DF")])
(define_insn "msa_fexupr_w"
[(set (match_operand:V4SF 0 "register_operand" "=f")
(unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")]
UNSPEC_MSA_FEXUPR))]
"ISA_HAS_MSA"
"fexupr.w\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V4SF")])
(define_insn "msa_fexupr_d"
[(set (match_operand:V2DF 0 "register_operand" "=f")
(float_extend:V2DF
(vec_select:V2SF
(match_operand:V4SF 1 "register_operand" "f")
(parallel [(const_int 0) (const_int 1)]))))]
"ISA_HAS_MSA"
"fexupr.d\t%w0,%w1"
[(set_attr "type" "simd_fcvt")
(set_attr "mode" "V2DF")])
(define_code_attr msabr
[(eq "bz")
(ne "bnz")])
(define_code_attr msabr_neg
[(eq "bnz")
(ne "bz")])
(define_insn "msa_<msabr>_<msafmt_f>"
[(set (pc) (if_then_else
(equality_op
(unspec:SI [(match_operand:MSA 1 "register_operand" "f")]
UNSPEC_MSA_BRANCH)
(match_operand:SI 2 "const_0_operand"))
(label_ref (match_operand 0))
(pc)))]
"ISA_HAS_MSA"
{
return mips_output_conditional_branch (insn, operands,
MIPS_BRANCH ("<msabr>.<msafmt>",
"%w1,%0"),
MIPS_BRANCH ("<msabr_neg>.<msafmt>",
"%w1,%0"));
}
[(set_attr "type" "simd_branch")
(set_attr "mode" "<MODE>")
(set_attr "compact_form" "never")])
(define_insn "msa_<msabr>_v_<msafmt_f>"
[(set (pc) (if_then_else
(equality_op
(unspec:SI [(match_operand:MSA 1 "register_operand" "f")]
UNSPEC_MSA_BRANCH_V)
(match_operand:SI 2 "const_0_operand"))
(label_ref (match_operand 0))
(pc)))]
"ISA_HAS_MSA"
{
return mips_output_conditional_branch (insn, operands,
MIPS_BRANCH ("<msabr>.v", "%w1,%0"),
MIPS_BRANCH ("<msabr_neg>.v",
"%w1,%0"));
}
[(set_attr "type" "simd_branch")
(set_attr "mode" "TI")
(set_attr "compact_form" "never")])
...@@ -197,8 +197,9 @@ extern bool mips_stack_address_p (rtx, machine_mode); ...@@ -197,8 +197,9 @@ extern bool mips_stack_address_p (rtx, machine_mode);
extern int mips_address_insns (rtx, machine_mode, bool); extern int mips_address_insns (rtx, machine_mode, bool);
extern int mips_const_insns (rtx); extern int mips_const_insns (rtx);
extern int mips_split_const_insns (rtx); extern int mips_split_const_insns (rtx);
extern int mips_split_128bit_const_insns (rtx);
extern int mips_load_store_insns (rtx, rtx_insn *); extern int mips_load_store_insns (rtx, rtx_insn *);
extern int mips_idiv_insns (void); extern int mips_idiv_insns (machine_mode);
extern rtx_insn *mips_emit_move (rtx, rtx); extern rtx_insn *mips_emit_move (rtx, rtx);
#ifdef RTX_CODE #ifdef RTX_CODE
extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx); extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx);
...@@ -216,6 +217,11 @@ extern bool mips_split_move_p (rtx, rtx, enum mips_split_type); ...@@ -216,6 +217,11 @@ extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
extern void mips_split_move (rtx, rtx, enum mips_split_type); extern void mips_split_move (rtx, rtx, enum mips_split_type);
extern bool mips_split_move_insn_p (rtx, rtx, rtx); extern bool mips_split_move_insn_p (rtx, rtx, rtx);
extern void mips_split_move_insn (rtx, rtx, rtx); extern void mips_split_move_insn (rtx, rtx, rtx);
extern void mips_split_128bit_move (rtx, rtx);
extern bool mips_split_128bit_move_p (rtx, rtx);
extern void mips_split_msa_copy_d (rtx, rtx, rtx, rtx (*)(rtx, rtx, rtx));
extern void mips_split_msa_insert_d (rtx, rtx, rtx, rtx);
extern void mips_split_msa_fill_d (rtx, rtx);
extern const char *mips_output_move (rtx, rtx); extern const char *mips_output_move (rtx, rtx);
extern bool mips_cfun_has_cprestore_slot_p (void); extern bool mips_cfun_has_cprestore_slot_p (void);
extern bool mips_cprestore_address_p (rtx, bool); extern bool mips_cprestore_address_p (rtx, bool);
...@@ -278,6 +284,15 @@ extern void mips_expand_before_return (void); ...@@ -278,6 +284,15 @@ extern void mips_expand_before_return (void);
extern void mips_expand_epilogue (bool); extern void mips_expand_epilogue (bool);
extern bool mips_can_use_return_insn (void); extern bool mips_can_use_return_insn (void);
extern bool mips_const_vector_same_val_p (rtx, machine_mode);
extern bool mips_const_vector_same_bytes_p (rtx, machine_mode);
extern bool mips_const_vector_same_int_p (rtx, machine_mode, HOST_WIDE_INT,
HOST_WIDE_INT);
extern bool mips_const_vector_shuffle_set_p (rtx, machine_mode);
extern bool mips_const_vector_bitimm_set_p (rtx, machine_mode);
extern bool mips_const_vector_bitimm_clr_p (rtx, machine_mode);
extern rtx mips_msa_vec_parallel_const_half (machine_mode, bool);
extern rtx mips_gen_const_int_vector (machine_mode, int);
extern bool mips_secondary_memory_needed (enum reg_class, enum reg_class, extern bool mips_secondary_memory_needed (enum reg_class, enum reg_class,
machine_mode); machine_mode);
extern bool mips_cannot_change_mode_class (machine_mode, extern bool mips_cannot_change_mode_class (machine_mode,
...@@ -305,6 +320,7 @@ extern const char *mips_output_sync (void); ...@@ -305,6 +320,7 @@ extern const char *mips_output_sync (void);
extern const char *mips_output_sync_loop (rtx_insn *, rtx *); extern const char *mips_output_sync_loop (rtx_insn *, rtx *);
extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *); extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *);
extern const char *mips_output_division (const char *, rtx *); extern const char *mips_output_division (const char *, rtx *);
extern const char *mips_msa_output_division (const char *, rtx *);
extern const char *mips_output_probe_stack_range (rtx, rtx); extern const char *mips_output_probe_stack_range (rtx, rtx);
extern bool mips_hard_regno_rename_ok (unsigned int, unsigned int); extern bool mips_hard_regno_rename_ok (unsigned int, unsigned int);
extern unsigned int mips_hard_regno_nregs (int, machine_mode); extern unsigned int mips_hard_regno_nregs (int, machine_mode);
...@@ -343,6 +359,7 @@ extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx)); ...@@ -343,6 +359,7 @@ extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
extern void mips_expand_vec_minmax (rtx, rtx, rtx, extern void mips_expand_vec_minmax (rtx, rtx, rtx,
rtx (*) (rtx, rtx, rtx), bool); rtx (*) (rtx, rtx, rtx), bool);
extern int mips_ldst_scaled_shift (machine_mode);
extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int); extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int); extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
extern const char *umips_output_save_restore (bool, rtx); extern const char *umips_output_save_restore (bool, rtx);
...@@ -372,5 +389,6 @@ extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code); ...@@ -372,5 +389,6 @@ extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
#endif #endif
extern void mips_register_frame_header_opt (void); extern void mips_register_frame_header_opt (void);
extern void mips_expand_vec_cond_expr (machine_mode, machine_mode, rtx *);
#endif /* ! GCC_MIPS_PROTOS_H */ #endif /* ! GCC_MIPS_PROTOS_H */
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -472,6 +472,12 @@ struct mips_cpu_info { ...@@ -472,6 +472,12 @@ struct mips_cpu_info {
builtin_define ("__mips_dsp_rev=1"); \ builtin_define ("__mips_dsp_rev=1"); \
} \ } \
\ \
if (ISA_HAS_MSA) \
{ \
builtin_define ("__mips_msa"); \
builtin_define ("__mips_msa_width=128"); \
} \
\
MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info); \ MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info); \
MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info); \ MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info); \
\ \
...@@ -824,7 +830,8 @@ struct mips_cpu_info { ...@@ -824,7 +830,8 @@ struct mips_cpu_info {
--with-fpu is ignored if -msoft-float, -msingle-float or -mdouble-float are --with-fpu is ignored if -msoft-float, -msingle-float or -mdouble-float are
specified. specified.
--with-nan is ignored if -mnan is specified. --with-nan is ignored if -mnan is specified.
--with-fp-32 is ignored if -msoft-float, -msingle-float or -mfp are specified. --with-fp-32 is ignored if -msoft-float, -msingle-float, -mmsa or -mfp are
specified.
--with-odd-spreg-32 is ignored if -msoft-float, -msingle-float, -modd-spreg --with-odd-spreg-32 is ignored if -msoft-float, -msingle-float, -modd-spreg
or -mno-odd-spreg are specified. or -mno-odd-spreg are specified.
--with-divide is ignored if -mdivide-traps or -mdivide-breaks are --with-divide is ignored if -mdivide-traps or -mdivide-breaks are
...@@ -841,7 +848,7 @@ struct mips_cpu_info { ...@@ -841,7 +848,7 @@ struct mips_cpu_info {
{"fpu", "%{!msoft-float:%{!msingle-float:%{!mdouble-float:-m%(VALUE)-float}}}" }, \ {"fpu", "%{!msoft-float:%{!msingle-float:%{!mdouble-float:-m%(VALUE)-float}}}" }, \
{"nan", "%{!mnan=*:-mnan=%(VALUE)}" }, \ {"nan", "%{!mnan=*:-mnan=%(VALUE)}" }, \
{"fp_32", "%{" OPT_ARCH32 \ {"fp_32", "%{" OPT_ARCH32 \
":%{!msoft-float:%{!msingle-float:%{!mfp*:-mfp%(VALUE)}}}}" }, \ ":%{!msoft-float:%{!msingle-float:%{!mfp*:%{!mmsa:-mfp%(VALUE)}}}}}" }, \
{"odd_spreg_32", "%{" OPT_ARCH32 ":%{!msoft-float:%{!msingle-float:" \ {"odd_spreg_32", "%{" OPT_ARCH32 ":%{!msoft-float:%{!msingle-float:" \
"%{!modd-spreg:%{!mno-odd-spreg:-m%(VALUE)}}}}}" }, \ "%{!modd-spreg:%{!mno-odd-spreg:-m%(VALUE)}}}}}" }, \
{"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \ {"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \
...@@ -1175,6 +1182,9 @@ struct mips_cpu_info { ...@@ -1175,6 +1182,9 @@ struct mips_cpu_info {
/* Revision 2 of the DSP ASE is available. */ /* Revision 2 of the DSP ASE is available. */
#define ISA_HAS_DSPR2 (TARGET_DSPR2 && !TARGET_MIPS16) #define ISA_HAS_DSPR2 (TARGET_DSPR2 && !TARGET_MIPS16)
/* The MSA ASE is available. */
#define ISA_HAS_MSA (TARGET_MSA && !TARGET_MIPS16)
/* True if the result of a load is not available to the next instruction. /* True if the result of a load is not available to the next instruction.
A nop will then be needed between instructions like "lw $4,..." A nop will then be needed between instructions like "lw $4,..."
and "addiu $4,$4,1". */ and "addiu $4,$4,1". */
...@@ -1316,6 +1326,7 @@ struct mips_cpu_info { ...@@ -1316,6 +1326,7 @@ struct mips_cpu_info {
%{meva} %{mno-eva} \ %{meva} %{mno-eva} \
%{mvirt} %{mno-virt} \ %{mvirt} %{mno-virt} \
%{mxpa} %{mno-xpa} \ %{mxpa} %{mno-xpa} \
%{mmsa} %{mno-msa} \
%{msmartmips} %{mno-smartmips} \ %{msmartmips} %{mno-smartmips} \
%{mmt} %{mno-mt} \ %{mmt} %{mno-mt} \
%{mfix-rm7000} %{mno-fix-rm7000} \ %{mfix-rm7000} %{mno-fix-rm7000} \
...@@ -1487,6 +1498,11 @@ FP_ASM_SPEC "\ ...@@ -1487,6 +1498,11 @@ FP_ASM_SPEC "\
#define MIN_UNITS_PER_WORD 4 #define MIN_UNITS_PER_WORD 4
#endif #endif
/* Width of a MSA vector register in bytes. */
#define UNITS_PER_MSA_REG 16
/* Width of a MSA vector register in bits. */
#define BITS_PER_MSA_REG (UNITS_PER_MSA_REG * BITS_PER_UNIT)
/* For MIPS, width of a floating point register. */ /* For MIPS, width of a floating point register. */
#define UNITS_PER_FPREG (TARGET_FLOAT64 ? 8 : 4) #define UNITS_PER_FPREG (TARGET_FLOAT64 ? 8 : 4)
...@@ -1559,8 +1575,11 @@ FP_ASM_SPEC "\ ...@@ -1559,8 +1575,11 @@ FP_ASM_SPEC "\
/* 8 is observed right on a DECstation and on riscos 4.02. */ /* 8 is observed right on a DECstation and on riscos 4.02. */
#define STRUCTURE_SIZE_BOUNDARY 8 #define STRUCTURE_SIZE_BOUNDARY 8
/* There is no point aligning anything to a rounder boundary than this. */ /* There is no point aligning anything to a rounder boundary than
#define BIGGEST_ALIGNMENT LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE, unless under MSA the bigggest alignment is
BITS_PER_MSA_REG. */
#define BIGGEST_ALIGNMENT \
(ISA_HAS_MSA ? BITS_PER_MSA_REG : LONG_DOUBLE_TYPE_SIZE)
/* All accesses must be aligned. */ /* All accesses must be aligned. */
#define STRICT_ALIGNMENT 1 #define STRICT_ALIGNMENT 1
...@@ -1667,7 +1686,7 @@ FP_ASM_SPEC "\ ...@@ -1667,7 +1686,7 @@ FP_ASM_SPEC "\
/* The [d]clz instructions have the natural values at 0. */ /* The [d]clz instructions have the natural values at 0. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \ #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
((VALUE) = GET_MODE_BITSIZE (MODE), 2) ((VALUE) = GET_MODE_UNIT_BITSIZE (MODE), 2)
/* Standard register usage. */ /* Standard register usage. */
...@@ -1798,6 +1817,10 @@ FP_ASM_SPEC "\ ...@@ -1798,6 +1817,10 @@ FP_ASM_SPEC "\
#define MD_REG_NUM (MD_REG_LAST - MD_REG_FIRST + 1) #define MD_REG_NUM (MD_REG_LAST - MD_REG_FIRST + 1)
#define MD_DBX_FIRST (FP_DBX_FIRST + FP_REG_NUM) #define MD_DBX_FIRST (FP_DBX_FIRST + FP_REG_NUM)
#define MSA_REG_FIRST FP_REG_FIRST
#define MSA_REG_LAST FP_REG_LAST
#define MSA_REG_NUM FP_REG_NUM
/* The DWARF 2 CFA column which tracks the return address from a /* The DWARF 2 CFA column which tracks the return address from a
signal handler context. This means that to maintain backwards signal handler context. This means that to maintain backwards
compatibility, no hard register can be assigned this column if it compatibility, no hard register can be assigned this column if it
...@@ -1886,8 +1909,11 @@ FP_ASM_SPEC "\ ...@@ -1886,8 +1909,11 @@ FP_ASM_SPEC "\
/* Test if REGNO is hi, lo, or one of the 6 new DSP accumulators. */ /* Test if REGNO is hi, lo, or one of the 6 new DSP accumulators. */
#define ACC_REG_P(REGNO) \ #define ACC_REG_P(REGNO) \
(MD_REG_P (REGNO) || DSP_ACC_REG_P (REGNO)) (MD_REG_P (REGNO) || DSP_ACC_REG_P (REGNO))
#define MSA_REG_P(REGNO) \
((unsigned int) ((int) (REGNO) - MSA_REG_FIRST) < MSA_REG_NUM)
#define FP_REG_RTX_P(X) (REG_P (X) && FP_REG_P (REGNO (X))) #define FP_REG_RTX_P(X) (REG_P (X) && FP_REG_P (REGNO (X)))
#define MSA_REG_RTX_P(X) (REG_P (X) && MSA_REG_P (REGNO (X)))
/* True if X is (const (unspec [(const_int 0)] UNSPEC_GP)). This is used /* True if X is (const (unspec [(const_int 0)] UNSPEC_GP)). This is used
to initialize the mips16 gp pseudo register. */ to initialize the mips16 gp pseudo register. */
...@@ -1916,10 +1942,12 @@ FP_ASM_SPEC "\ ...@@ -1916,10 +1942,12 @@ FP_ASM_SPEC "\
mips_hard_regno_caller_save_mode (REGNO, NREGS, MODE) mips_hard_regno_caller_save_mode (REGNO, NREGS, MODE)
/* Odd-numbered single-precision registers are not considered callee-saved /* Odd-numbered single-precision registers are not considered callee-saved
for o32 FPXX as they will be clobbered when run on an FR=1 FPU. */ for o32 FPXX as they will be clobbered when run on an FR=1 FPU.
MSA vector registers with MODE > 64 bits are part clobbered too. */
#define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \ #define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \
(TARGET_FLOATXX && hard_regno_nregs[REGNO][MODE] == 1 \ ((TARGET_FLOATXX && hard_regno_nregs[REGNO][MODE] == 1 \
&& FP_REG_P (REGNO) && ((REGNO) & 1)) && FP_REG_P (REGNO) && ((REGNO) & 1)) \
|| (ISA_HAS_MSA && FP_REG_P (REGNO) && GET_MODE_SIZE (MODE) > 8))
#define MODES_TIEABLE_P mips_modes_tieable_p #define MODES_TIEABLE_P mips_modes_tieable_p
...@@ -2381,6 +2409,13 @@ enum reg_class ...@@ -2381,6 +2409,13 @@ enum reg_class
#define FP_ARG_FIRST (FP_REG_FIRST + 12) #define FP_ARG_FIRST (FP_REG_FIRST + 12)
#define FP_ARG_LAST (FP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1) #define FP_ARG_LAST (FP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1)
/* True if MODE is vector and supported in a MSA vector register. */
#define MSA_SUPPORTED_MODE_P(MODE) \
(ISA_HAS_MSA \
&& GET_MODE_SIZE (MODE) == UNITS_PER_MSA_REG \
&& (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT \
|| GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT))
/* Temporary register that is used when restoring $gp after a call. $4 and $5 /* Temporary register that is used when restoring $gp after a call. $4 and $5
are used for returning complex double values in soft-float code, so $6 is the are used for returning complex double values in soft-float code, so $6 is the
first suitable candidate for TARGET_MIPS16. For !TARGET_MIPS16 we can use first suitable candidate for TARGET_MIPS16. For !TARGET_MIPS16 we can use
...@@ -2606,6 +2641,7 @@ typedef struct mips_args { ...@@ -2606,6 +2641,7 @@ typedef struct mips_args {
we generally don't want to use them for copying arbitrary data. we generally don't want to use them for copying arbitrary data.
A single N-word move is usually the same cost as N single-word moves. */ A single N-word move is usually the same cost as N single-word moves. */
#define MOVE_MAX UNITS_PER_WORD #define MOVE_MAX UNITS_PER_WORD
/* We don't modify it for MSA as it is only used by the classic reload. */
#define MAX_MOVE_MAX 8 #define MAX_MOVE_MAX 8
/* Define this macro as a C expression which is nonzero if /* Define this macro as a C expression which is nonzero if
...@@ -2767,7 +2803,39 @@ typedef struct mips_args { ...@@ -2767,7 +2803,39 @@ typedef struct mips_args {
{ "gp", 28 + GP_REG_FIRST }, \ { "gp", 28 + GP_REG_FIRST }, \
{ "sp", 29 + GP_REG_FIRST }, \ { "sp", 29 + GP_REG_FIRST }, \
{ "fp", 30 + GP_REG_FIRST }, \ { "fp", 30 + GP_REG_FIRST }, \
{ "ra", 31 + GP_REG_FIRST } \ { "ra", 31 + GP_REG_FIRST }, \
{ "$w0", 0 + FP_REG_FIRST }, \
{ "$w1", 1 + FP_REG_FIRST }, \
{ "$w2", 2 + FP_REG_FIRST }, \
{ "$w3", 3 + FP_REG_FIRST }, \
{ "$w4", 4 + FP_REG_FIRST }, \
{ "$w5", 5 + FP_REG_FIRST }, \
{ "$w6", 6 + FP_REG_FIRST }, \
{ "$w7", 7 + FP_REG_FIRST }, \
{ "$w8", 8 + FP_REG_FIRST }, \
{ "$w9", 9 + FP_REG_FIRST }, \
{ "$w10", 10 + FP_REG_FIRST }, \
{ "$w11", 11 + FP_REG_FIRST }, \
{ "$w12", 12 + FP_REG_FIRST }, \
{ "$w13", 13 + FP_REG_FIRST }, \
{ "$w14", 14 + FP_REG_FIRST }, \
{ "$w15", 15 + FP_REG_FIRST }, \
{ "$w16", 16 + FP_REG_FIRST }, \
{ "$w17", 17 + FP_REG_FIRST }, \
{ "$w18", 18 + FP_REG_FIRST }, \
{ "$w19", 19 + FP_REG_FIRST }, \
{ "$w20", 20 + FP_REG_FIRST }, \
{ "$w21", 21 + FP_REG_FIRST }, \
{ "$w22", 22 + FP_REG_FIRST }, \
{ "$w23", 23 + FP_REG_FIRST }, \
{ "$w24", 24 + FP_REG_FIRST }, \
{ "$w25", 25 + FP_REG_FIRST }, \
{ "$w26", 26 + FP_REG_FIRST }, \
{ "$w27", 27 + FP_REG_FIRST }, \
{ "$w28", 28 + FP_REG_FIRST }, \
{ "$w29", 29 + FP_REG_FIRST }, \
{ "$w30", 30 + FP_REG_FIRST }, \
{ "$w31", 31 + FP_REG_FIRST } \
} }
#define DBR_OUTPUT_SEQEND(STREAM) \ #define DBR_OUTPUT_SEQEND(STREAM) \
......
...@@ -225,11 +225,12 @@ ...@@ -225,11 +225,12 @@
shift_shift" shift_shift"
(const_string "unknown")) (const_string "unknown"))
(define_attr "alu_type" "unknown,add,sub,not,nor,and,or,xor" (define_attr "alu_type" "unknown,add,sub,not,nor,and,or,xor,simd_add"
(const_string "unknown")) (const_string "unknown"))
;; Main data type used by the insn ;; Main data type used by the insn
(define_attr "mode" "unknown,none,QI,HI,SI,DI,TI,SF,DF,TF,FPSW" (define_attr "mode" "unknown,none,QI,HI,SI,DI,TI,SF,DF,TF,FPSW,
V2DI,V4SI,V8HI,V16QI,V2DF,V4SF"
(const_string "unknown")) (const_string "unknown"))
;; True if the main data type is twice the size of a word. ;; True if the main data type is twice the size of a word.
...@@ -243,6 +244,13 @@ ...@@ -243,6 +244,13 @@
(const_string "yes")] (const_string "yes")]
(const_string "no"))) (const_string "no")))
;; True if the main data type is four times of the size of a word.
(define_attr "qword_mode" "no,yes"
(cond [(and (eq_attr "mode" "TI,TF")
(not (match_test "TARGET_64BIT")))
(const_string "yes")]
(const_string "no")))
;; Attributes describing a sync loop. These loops have the form: ;; Attributes describing a sync loop. These loops have the form:
;; ;;
;; if (RELEASE_BARRIER == YES) sync ;; if (RELEASE_BARRIER == YES) sync
...@@ -365,7 +373,12 @@ ...@@ -365,7 +373,12 @@
shift,slt,signext,clz,pop,trap,imul,imul3,imul3nc,imadd,idiv,idiv3,move, shift,slt,signext,clz,pop,trap,imul,imul3,imul3nc,imadd,idiv,idiv3,move,
fmove,fadd,fmul,fmadd,fdiv,frdiv,frdiv1,frdiv2,fabs,fneg,fcmp,fcvt,fsqrt, fmove,fadd,fmul,fmadd,fdiv,frdiv,frdiv1,frdiv2,fabs,fneg,fcmp,fcvt,fsqrt,
frsqrt,frsqrt1,frsqrt2,dspmac,dspmacsat,accext,accmod,dspalu,dspalusat, frsqrt,frsqrt1,frsqrt2,dspmac,dspmacsat,accext,accmod,dspalu,dspalusat,
multi,atomic,syncloop,nop,ghost,multimem" multi,atomic,syncloop,nop,ghost,multimem,
simd_div,simd_fclass,simd_flog2,simd_fadd,simd_fcvt,simd_fmul,simd_fmadd,
simd_fdiv,simd_bitins,simd_bitmov,simd_insert,simd_sld,simd_mul,simd_fcmp,
simd_fexp2,simd_int_arith,simd_bit,simd_shift,simd_splat,simd_fill,
simd_permute,simd_shf,simd_sat,simd_pcnt,simd_copy,simd_branch,simd_cmsa,
simd_fminmax,simd_logic,simd_move,simd_load,simd_store"
(cond [(eq_attr "jal" "!unset") (const_string "call") (cond [(eq_attr "jal" "!unset") (const_string "call")
(eq_attr "got" "load") (const_string "load") (eq_attr "got" "load") (const_string "load")
...@@ -400,6 +413,11 @@ ...@@ -400,6 +413,11 @@
(eq_attr "move_type" "constN,shift_shift") (eq_attr "move_type" "constN,shift_shift")
(const_string "multi") (const_string "multi")
;; These types of move are split for quadword modes only.
(and (eq_attr "move_type" "move,const")
(eq_attr "qword_mode" "yes"))
(const_string "multi")
;; These types of move are split for doubleword modes only. ;; These types of move are split for doubleword modes only.
(and (eq_attr "move_type" "move,const") (and (eq_attr "move_type" "move,const")
(eq_attr "dword_mode" "yes")) (eq_attr "dword_mode" "yes"))
...@@ -486,6 +504,12 @@ ...@@ -486,6 +504,12 @@
(eq_attr "dword_mode" "yes")) (eq_attr "dword_mode" "yes"))
(const_int 2) (const_int 2)
;; Check for quadword moves that are decomposed into four
;; instructions.
(and (eq_attr "move_type" "mtc,mfc,move")
(eq_attr "qword_mode" "yes"))
(const_int 4)
;; Constants, loads and stores are handled by external routines. ;; Constants, loads and stores are handled by external routines.
(and (eq_attr "move_type" "const,constN") (and (eq_attr "move_type" "const,constN")
(eq_attr "dword_mode" "yes")) (eq_attr "dword_mode" "yes"))
...@@ -527,7 +551,7 @@ ...@@ -527,7 +551,7 @@
(const_int 2) (const_int 2)
(eq_attr "type" "idiv,idiv3") (eq_attr "type" "idiv,idiv3")
(symbol_ref "mips_idiv_insns ()") (symbol_ref "mips_idiv_insns (GET_MODE (PATTERN (insn)))")
(not (eq_attr "sync_mem" "none")) (not (eq_attr "sync_mem" "none"))
(symbol_ref "mips_sync_loop_insns (insn, operands)")] (symbol_ref "mips_sync_loop_insns (insn, operands)")]
...@@ -884,8 +908,10 @@ ...@@ -884,8 +908,10 @@
(define_mode_attr fmt [(SF "s") (DF "d") (V2SF "ps")]) (define_mode_attr fmt [(SF "s") (DF "d") (V2SF "ps")])
;; This attribute gives the upper-case mode name for one unit of a ;; This attribute gives the upper-case mode name for one unit of a
;; floating-point mode. ;; floating-point mode or vector mode.
(define_mode_attr UNITMODE [(SF "SF") (DF "DF") (V2SF "SF")]) (define_mode_attr UNITMODE [(SF "SF") (DF "DF") (V2SF "SF") (V4SF "SF")
(V16QI "QI") (V8HI "HI") (V4SI "SI") (V2DI "DI")
(V2DF "DF")])
;; This attribute gives the integer mode that has the same size as a ;; This attribute gives the integer mode that has the same size as a
;; fixed-point mode. ;; fixed-point mode.
...@@ -941,6 +967,10 @@ ...@@ -941,6 +967,10 @@
;; from the same template. ;; from the same template.
(define_code_iterator any_mod [mod umod]) (define_code_iterator any_mod [mod umod])
;; This code iterator allows addition and subtraction to be generated
;; from the same template.
(define_code_iterator addsub [plus minus])
;; This code iterator allows all native floating-point comparisons to be ;; This code iterator allows all native floating-point comparisons to be
;; generated from the same template. ;; generated from the same template.
(define_code_iterator fcond [unordered uneq unlt unle eq lt le (define_code_iterator fcond [unordered uneq unlt unle eq lt le
...@@ -7634,6 +7664,9 @@ ...@@ -7634,6 +7664,9 @@
; ST-Microelectronics Loongson-2E/2F-specific patterns. ; ST-Microelectronics Loongson-2E/2F-specific patterns.
(include "loongson.md") (include "loongson.md")
; The MIPS MSA Instructions.
(include "mips-msa.md")
(define_c_enum "unspec" [ (define_c_enum "unspec" [
UNSPEC_ADDRESS_FIRST UNSPEC_ADDRESS_FIRST
]) ])
...@@ -299,6 +299,10 @@ mmicromips ...@@ -299,6 +299,10 @@ mmicromips
Target Report Mask(MICROMIPS) Target Report Mask(MICROMIPS)
Use microMIPS instructions. Use microMIPS instructions.
mmsa
Target Report Var(TARGET_MSA)
Use MIPS MSA Extension instructions.
mmt mmt
Target Report Var(TARGET_MT) Target Report Var(TARGET_MT)
Allow the use of MT instructions. Allow the use of MT instructions.
......
/* MIPS MSA intrinsics include file.
Copyright (C) 2015 Free Software Foundation, Inc.
Contributed by Imagination Technologies Ltd.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 3, or (at your
option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _MSA_H
#define _MSA_H 1
#if defined(__mips_msa)
typedef signed char v16i8 __attribute__ ((vector_size(16), aligned(16)));
typedef signed char v16i8_b __attribute__ ((vector_size(16), aligned(1)));
typedef unsigned char v16u8 __attribute__ ((vector_size(16), aligned(16)));
typedef unsigned char v16u8_b __attribute__ ((vector_size(16), aligned(1)));
typedef short v8i16 __attribute__ ((vector_size(16), aligned(16)));
typedef short v8i16_h __attribute__ ((vector_size(16), aligned(2)));
typedef unsigned short v8u16 __attribute__ ((vector_size(16), aligned(16)));
typedef unsigned short v8u16_h __attribute__ ((vector_size(16), aligned(2)));
typedef int v4i32 __attribute__ ((vector_size(16), aligned(16)));
typedef int v4i32_w __attribute__ ((vector_size(16), aligned(4)));
typedef unsigned int v4u32 __attribute__ ((vector_size(16), aligned(16)));
typedef unsigned int v4u32_w __attribute__ ((vector_size(16), aligned(4)));
typedef long long v2i64 __attribute__ ((vector_size(16), aligned(16)));
typedef long long v2i64_d __attribute__ ((vector_size(16), aligned(8)));
typedef unsigned long long v2u64 __attribute__ ((vector_size(16), aligned(16)));
typedef unsigned long long v2u64_d __attribute__ ((vector_size(16), aligned(8)));
typedef float v4f32 __attribute__ ((vector_size(16), aligned(16)));
typedef float v4f32_w __attribute__ ((vector_size(16), aligned(4)));
typedef double v2f64 __attribute__ ((vector_size(16), aligned(16)));
typedef double v2f64_d __attribute__ ((vector_size(16), aligned(8)));
#define __msa_sll_b __builtin_msa_sll_b
#define __msa_sll_h __builtin_msa_sll_h
#define __msa_sll_w __builtin_msa_sll_w
#define __msa_sll_d __builtin_msa_sll_d
#define __msa_slli_b __builtin_msa_slli_b
#define __msa_slli_h __builtin_msa_slli_h
#define __msa_slli_w __builtin_msa_slli_w
#define __msa_slli_d __builtin_msa_slli_d
#define __msa_sra_b __builtin_msa_sra_b
#define __msa_sra_h __builtin_msa_sra_h
#define __msa_sra_w __builtin_msa_sra_w
#define __msa_sra_d __builtin_msa_sra_d
#define __msa_srai_b __builtin_msa_srai_b
#define __msa_srai_h __builtin_msa_srai_h
#define __msa_srai_w __builtin_msa_srai_w
#define __msa_srai_d __builtin_msa_srai_d
#define __msa_srar_b __builtin_msa_srar_b
#define __msa_srar_h __builtin_msa_srar_h
#define __msa_srar_w __builtin_msa_srar_w
#define __msa_srar_d __builtin_msa_srar_d
#define __msa_srari_b __builtin_msa_srari_b
#define __msa_srari_h __builtin_msa_srari_h
#define __msa_srari_w __builtin_msa_srari_w
#define __msa_srari_d __builtin_msa_srari_d
#define __msa_srl_b __builtin_msa_srl_b
#define __msa_srl_h __builtin_msa_srl_h
#define __msa_srl_w __builtin_msa_srl_w
#define __msa_srl_d __builtin_msa_srl_d
#define __msa_srli_b __builtin_msa_srli_b
#define __msa_srli_h __builtin_msa_srli_h
#define __msa_srli_w __builtin_msa_srli_w
#define __msa_srli_d __builtin_msa_srli_d
#define __msa_srlr_b __builtin_msa_srlr_b
#define __msa_srlr_h __builtin_msa_srlr_h
#define __msa_srlr_w __builtin_msa_srlr_w
#define __msa_srlr_d __builtin_msa_srlr_d
#define __msa_srlri_b __builtin_msa_srlri_b
#define __msa_srlri_h __builtin_msa_srlri_h
#define __msa_srlri_w __builtin_msa_srlri_w
#define __msa_srlri_d __builtin_msa_srlri_d
#define __msa_bclr_b __builtin_msa_bclr_b
#define __msa_bclr_h __builtin_msa_bclr_h
#define __msa_bclr_w __builtin_msa_bclr_w
#define __msa_bclr_d __builtin_msa_bclr_d
#define __msa_bclri_b __builtin_msa_bclri_b
#define __msa_bclri_h __builtin_msa_bclri_h
#define __msa_bclri_w __builtin_msa_bclri_w
#define __msa_bclri_d __builtin_msa_bclri_d
#define __msa_bset_b __builtin_msa_bset_b
#define __msa_bset_h __builtin_msa_bset_h
#define __msa_bset_w __builtin_msa_bset_w
#define __msa_bset_d __builtin_msa_bset_d
#define __msa_bseti_b __builtin_msa_bseti_b
#define __msa_bseti_h __builtin_msa_bseti_h
#define __msa_bseti_w __builtin_msa_bseti_w
#define __msa_bseti_d __builtin_msa_bseti_d
#define __msa_bneg_b __builtin_msa_bneg_b
#define __msa_bneg_h __builtin_msa_bneg_h
#define __msa_bneg_w __builtin_msa_bneg_w
#define __msa_bneg_d __builtin_msa_bneg_d
#define __msa_bnegi_b __builtin_msa_bnegi_b
#define __msa_bnegi_h __builtin_msa_bnegi_h
#define __msa_bnegi_w __builtin_msa_bnegi_w
#define __msa_bnegi_d __builtin_msa_bnegi_d
#define __msa_binsl_b __builtin_msa_binsl_b
#define __msa_binsl_h __builtin_msa_binsl_h
#define __msa_binsl_w __builtin_msa_binsl_w
#define __msa_binsl_d __builtin_msa_binsl_d
#define __msa_binsli_b __builtin_msa_binsli_b
#define __msa_binsli_h __builtin_msa_binsli_h
#define __msa_binsli_w __builtin_msa_binsli_w
#define __msa_binsli_d __builtin_msa_binsli_d
#define __msa_binsr_b __builtin_msa_binsr_b
#define __msa_binsr_h __builtin_msa_binsr_h
#define __msa_binsr_w __builtin_msa_binsr_w
#define __msa_binsr_d __builtin_msa_binsr_d
#define __msa_binsri_b __builtin_msa_binsri_b
#define __msa_binsri_h __builtin_msa_binsri_h
#define __msa_binsri_w __builtin_msa_binsri_w
#define __msa_binsri_d __builtin_msa_binsri_d
#define __msa_addv_b __builtin_msa_addv_b
#define __msa_addv_h __builtin_msa_addv_h
#define __msa_addv_w __builtin_msa_addv_w
#define __msa_addv_d __builtin_msa_addv_d
#define __msa_addvi_b __builtin_msa_addvi_b
#define __msa_addvi_h __builtin_msa_addvi_h
#define __msa_addvi_w __builtin_msa_addvi_w
#define __msa_addvi_d __builtin_msa_addvi_d
#define __msa_subv_b __builtin_msa_subv_b
#define __msa_subv_h __builtin_msa_subv_h
#define __msa_subv_w __builtin_msa_subv_w
#define __msa_subv_d __builtin_msa_subv_d
#define __msa_subvi_b __builtin_msa_subvi_b
#define __msa_subvi_h __builtin_msa_subvi_h
#define __msa_subvi_w __builtin_msa_subvi_w
#define __msa_subvi_d __builtin_msa_subvi_d
#define __msa_max_s_b __builtin_msa_max_s_b
#define __msa_max_s_h __builtin_msa_max_s_h
#define __msa_max_s_w __builtin_msa_max_s_w
#define __msa_max_s_d __builtin_msa_max_s_d
#define __msa_maxi_s_b __builtin_msa_maxi_s_b
#define __msa_maxi_s_h __builtin_msa_maxi_s_h
#define __msa_maxi_s_w __builtin_msa_maxi_s_w
#define __msa_maxi_s_d __builtin_msa_maxi_s_d
#define __msa_max_u_b __builtin_msa_max_u_b
#define __msa_max_u_h __builtin_msa_max_u_h
#define __msa_max_u_w __builtin_msa_max_u_w
#define __msa_max_u_d __builtin_msa_max_u_d
#define __msa_maxi_u_b __builtin_msa_maxi_u_b
#define __msa_maxi_u_h __builtin_msa_maxi_u_h
#define __msa_maxi_u_w __builtin_msa_maxi_u_w
#define __msa_maxi_u_d __builtin_msa_maxi_u_d
#define __msa_min_s_b __builtin_msa_min_s_b
#define __msa_min_s_h __builtin_msa_min_s_h
#define __msa_min_s_w __builtin_msa_min_s_w
#define __msa_min_s_d __builtin_msa_min_s_d
#define __msa_mini_s_b __builtin_msa_mini_s_b
#define __msa_mini_s_h __builtin_msa_mini_s_h
#define __msa_mini_s_w __builtin_msa_mini_s_w
#define __msa_mini_s_d __builtin_msa_mini_s_d
#define __msa_min_u_b __builtin_msa_min_u_b
#define __msa_min_u_h __builtin_msa_min_u_h
#define __msa_min_u_w __builtin_msa_min_u_w
#define __msa_min_u_d __builtin_msa_min_u_d
#define __msa_mini_u_b __builtin_msa_mini_u_b
#define __msa_mini_u_h __builtin_msa_mini_u_h
#define __msa_mini_u_w __builtin_msa_mini_u_w
#define __msa_mini_u_d __builtin_msa_mini_u_d
#define __msa_max_a_b __builtin_msa_max_a_b
#define __msa_max_a_h __builtin_msa_max_a_h
#define __msa_max_a_w __builtin_msa_max_a_w
#define __msa_max_a_d __builtin_msa_max_a_d
#define __msa_min_a_b __builtin_msa_min_a_b
#define __msa_min_a_h __builtin_msa_min_a_h
#define __msa_min_a_w __builtin_msa_min_a_w
#define __msa_min_a_d __builtin_msa_min_a_d
#define __msa_ceq_b __builtin_msa_ceq_b
#define __msa_ceq_h __builtin_msa_ceq_h
#define __msa_ceq_w __builtin_msa_ceq_w
#define __msa_ceq_d __builtin_msa_ceq_d
#define __msa_ceqi_b __builtin_msa_ceqi_b
#define __msa_ceqi_h __builtin_msa_ceqi_h
#define __msa_ceqi_w __builtin_msa_ceqi_w
#define __msa_ceqi_d __builtin_msa_ceqi_d
#define __msa_clt_s_b __builtin_msa_clt_s_b
#define __msa_clt_s_h __builtin_msa_clt_s_h
#define __msa_clt_s_w __builtin_msa_clt_s_w
#define __msa_clt_s_d __builtin_msa_clt_s_d
#define __msa_clti_s_b __builtin_msa_clti_s_b
#define __msa_clti_s_h __builtin_msa_clti_s_h
#define __msa_clti_s_w __builtin_msa_clti_s_w
#define __msa_clti_s_d __builtin_msa_clti_s_d
#define __msa_clt_u_b __builtin_msa_clt_u_b
#define __msa_clt_u_h __builtin_msa_clt_u_h
#define __msa_clt_u_w __builtin_msa_clt_u_w
#define __msa_clt_u_d __builtin_msa_clt_u_d
#define __msa_clti_u_b __builtin_msa_clti_u_b
#define __msa_clti_u_h __builtin_msa_clti_u_h
#define __msa_clti_u_w __builtin_msa_clti_u_w
#define __msa_clti_u_d __builtin_msa_clti_u_d
#define __msa_cle_s_b __builtin_msa_cle_s_b
#define __msa_cle_s_h __builtin_msa_cle_s_h
#define __msa_cle_s_w __builtin_msa_cle_s_w
#define __msa_cle_s_d __builtin_msa_cle_s_d
#define __msa_clei_s_b __builtin_msa_clei_s_b
#define __msa_clei_s_h __builtin_msa_clei_s_h
#define __msa_clei_s_w __builtin_msa_clei_s_w
#define __msa_clei_s_d __builtin_msa_clei_s_d
#define __msa_cle_u_b __builtin_msa_cle_u_b
#define __msa_cle_u_h __builtin_msa_cle_u_h
#define __msa_cle_u_w __builtin_msa_cle_u_w
#define __msa_cle_u_d __builtin_msa_cle_u_d
#define __msa_clei_u_b __builtin_msa_clei_u_b
#define __msa_clei_u_h __builtin_msa_clei_u_h
#define __msa_clei_u_w __builtin_msa_clei_u_w
#define __msa_clei_u_d __builtin_msa_clei_u_d
#define __msa_ld_b __builtin_msa_ld_b
#define __msa_ld_h __builtin_msa_ld_h
#define __msa_ld_w __builtin_msa_ld_w
#define __msa_ld_d __builtin_msa_ld_d
#define __msa_st_b __builtin_msa_st_b
#define __msa_st_h __builtin_msa_st_h
#define __msa_st_w __builtin_msa_st_w
#define __msa_st_d __builtin_msa_st_d
#define __msa_sat_s_b __builtin_msa_sat_s_b
#define __msa_sat_s_h __builtin_msa_sat_s_h
#define __msa_sat_s_w __builtin_msa_sat_s_w
#define __msa_sat_s_d __builtin_msa_sat_s_d
#define __msa_sat_u_b __builtin_msa_sat_u_b
#define __msa_sat_u_h __builtin_msa_sat_u_h
#define __msa_sat_u_w __builtin_msa_sat_u_w
#define __msa_sat_u_d __builtin_msa_sat_u_d
#define __msa_add_a_b __builtin_msa_add_a_b
#define __msa_add_a_h __builtin_msa_add_a_h
#define __msa_add_a_w __builtin_msa_add_a_w
#define __msa_add_a_d __builtin_msa_add_a_d
#define __msa_adds_a_b __builtin_msa_adds_a_b
#define __msa_adds_a_h __builtin_msa_adds_a_h
#define __msa_adds_a_w __builtin_msa_adds_a_w
#define __msa_adds_a_d __builtin_msa_adds_a_d
#define __msa_adds_s_b __builtin_msa_adds_s_b
#define __msa_adds_s_h __builtin_msa_adds_s_h
#define __msa_adds_s_w __builtin_msa_adds_s_w
#define __msa_adds_s_d __builtin_msa_adds_s_d
#define __msa_adds_u_b __builtin_msa_adds_u_b
#define __msa_adds_u_h __builtin_msa_adds_u_h
#define __msa_adds_u_w __builtin_msa_adds_u_w
#define __msa_adds_u_d __builtin_msa_adds_u_d
#define __msa_ave_s_b __builtin_msa_ave_s_b
#define __msa_ave_s_h __builtin_msa_ave_s_h
#define __msa_ave_s_w __builtin_msa_ave_s_w
#define __msa_ave_s_d __builtin_msa_ave_s_d
#define __msa_ave_u_b __builtin_msa_ave_u_b
#define __msa_ave_u_h __builtin_msa_ave_u_h
#define __msa_ave_u_w __builtin_msa_ave_u_w
#define __msa_ave_u_d __builtin_msa_ave_u_d
#define __msa_aver_s_b __builtin_msa_aver_s_b
#define __msa_aver_s_h __builtin_msa_aver_s_h
#define __msa_aver_s_w __builtin_msa_aver_s_w
#define __msa_aver_s_d __builtin_msa_aver_s_d
#define __msa_aver_u_b __builtin_msa_aver_u_b
#define __msa_aver_u_h __builtin_msa_aver_u_h
#define __msa_aver_u_w __builtin_msa_aver_u_w
#define __msa_aver_u_d __builtin_msa_aver_u_d
#define __msa_subs_s_b __builtin_msa_subs_s_b
#define __msa_subs_s_h __builtin_msa_subs_s_h
#define __msa_subs_s_w __builtin_msa_subs_s_w
#define __msa_subs_s_d __builtin_msa_subs_s_d
#define __msa_subs_u_b __builtin_msa_subs_u_b
#define __msa_subs_u_h __builtin_msa_subs_u_h
#define __msa_subs_u_w __builtin_msa_subs_u_w
#define __msa_subs_u_d __builtin_msa_subs_u_d
#define __msa_subsuu_s_b __builtin_msa_subsuu_s_b
#define __msa_subsuu_s_h __builtin_msa_subsuu_s_h
#define __msa_subsuu_s_w __builtin_msa_subsuu_s_w
#define __msa_subsuu_s_d __builtin_msa_subsuu_s_d
#define __msa_subsus_u_b __builtin_msa_subsus_u_b
#define __msa_subsus_u_h __builtin_msa_subsus_u_h
#define __msa_subsus_u_w __builtin_msa_subsus_u_w
#define __msa_subsus_u_d __builtin_msa_subsus_u_d
#define __msa_asub_s_b __builtin_msa_asub_s_b
#define __msa_asub_s_h __builtin_msa_asub_s_h
#define __msa_asub_s_w __builtin_msa_asub_s_w
#define __msa_asub_s_d __builtin_msa_asub_s_d
#define __msa_asub_u_b __builtin_msa_asub_u_b
#define __msa_asub_u_h __builtin_msa_asub_u_h
#define __msa_asub_u_w __builtin_msa_asub_u_w
#define __msa_asub_u_d __builtin_msa_asub_u_d
#define __msa_mulv_b __builtin_msa_mulv_b
#define __msa_mulv_h __builtin_msa_mulv_h
#define __msa_mulv_w __builtin_msa_mulv_w
#define __msa_mulv_d __builtin_msa_mulv_d
#define __msa_maddv_b __builtin_msa_maddv_b
#define __msa_maddv_h __builtin_msa_maddv_h
#define __msa_maddv_w __builtin_msa_maddv_w
#define __msa_maddv_d __builtin_msa_maddv_d
#define __msa_msubv_b __builtin_msa_msubv_b
#define __msa_msubv_h __builtin_msa_msubv_h
#define __msa_msubv_w __builtin_msa_msubv_w
#define __msa_msubv_d __builtin_msa_msubv_d
#define __msa_div_s_b __builtin_msa_div_s_b
#define __msa_div_s_h __builtin_msa_div_s_h
#define __msa_div_s_w __builtin_msa_div_s_w
#define __msa_div_s_d __builtin_msa_div_s_d
#define __msa_div_u_b __builtin_msa_div_u_b
#define __msa_div_u_h __builtin_msa_div_u_h
#define __msa_div_u_w __builtin_msa_div_u_w
#define __msa_div_u_d __builtin_msa_div_u_d
#define __msa_hadd_s_h __builtin_msa_hadd_s_h
#define __msa_hadd_s_w __builtin_msa_hadd_s_w
#define __msa_hadd_s_d __builtin_msa_hadd_s_d
#define __msa_hadd_u_h __builtin_msa_hadd_u_h
#define __msa_hadd_u_w __builtin_msa_hadd_u_w
#define __msa_hadd_u_d __builtin_msa_hadd_u_d
#define __msa_hsub_s_h __builtin_msa_hsub_s_h
#define __msa_hsub_s_w __builtin_msa_hsub_s_w
#define __msa_hsub_s_d __builtin_msa_hsub_s_d
#define __msa_hsub_u_h __builtin_msa_hsub_u_h
#define __msa_hsub_u_w __builtin_msa_hsub_u_w
#define __msa_hsub_u_d __builtin_msa_hsub_u_d
#define __msa_mod_s_b __builtin_msa_mod_s_b
#define __msa_mod_s_h __builtin_msa_mod_s_h
#define __msa_mod_s_w __builtin_msa_mod_s_w
#define __msa_mod_s_d __builtin_msa_mod_s_d
#define __msa_mod_u_b __builtin_msa_mod_u_b
#define __msa_mod_u_h __builtin_msa_mod_u_h
#define __msa_mod_u_w __builtin_msa_mod_u_w
#define __msa_mod_u_d __builtin_msa_mod_u_d
#define __msa_dotp_s_h __builtin_msa_dotp_s_h
#define __msa_dotp_s_w __builtin_msa_dotp_s_w
#define __msa_dotp_s_d __builtin_msa_dotp_s_d
#define __msa_dotp_u_h __builtin_msa_dotp_u_h
#define __msa_dotp_u_w __builtin_msa_dotp_u_w
#define __msa_dotp_u_d __builtin_msa_dotp_u_d
#define __msa_dpadd_s_h __builtin_msa_dpadd_s_h
#define __msa_dpadd_s_w __builtin_msa_dpadd_s_w
#define __msa_dpadd_s_d __builtin_msa_dpadd_s_d
#define __msa_dpadd_u_h __builtin_msa_dpadd_u_h
#define __msa_dpadd_u_w __builtin_msa_dpadd_u_w
#define __msa_dpadd_u_d __builtin_msa_dpadd_u_d
#define __msa_dpsub_s_h __builtin_msa_dpsub_s_h
#define __msa_dpsub_s_w __builtin_msa_dpsub_s_w
#define __msa_dpsub_s_d __builtin_msa_dpsub_s_d
#define __msa_dpsub_u_h __builtin_msa_dpsub_u_h
#define __msa_dpsub_u_w __builtin_msa_dpsub_u_w
#define __msa_dpsub_u_d __builtin_msa_dpsub_u_d
#define __msa_sld_b __builtin_msa_sld_b
#define __msa_sld_h __builtin_msa_sld_h
#define __msa_sld_w __builtin_msa_sld_w
#define __msa_sld_d __builtin_msa_sld_d
#define __msa_sldi_b __builtin_msa_sldi_b
#define __msa_sldi_h __builtin_msa_sldi_h
#define __msa_sldi_w __builtin_msa_sldi_w
#define __msa_sldi_d __builtin_msa_sldi_d
#define __msa_splat_b __builtin_msa_splat_b
#define __msa_splat_h __builtin_msa_splat_h
#define __msa_splat_w __builtin_msa_splat_w
#define __msa_splat_d __builtin_msa_splat_d
#define __msa_splati_b __builtin_msa_splati_b
#define __msa_splati_h __builtin_msa_splati_h
#define __msa_splati_w __builtin_msa_splati_w
#define __msa_splati_d __builtin_msa_splati_d
#define __msa_pckev_b __builtin_msa_pckev_b
#define __msa_pckev_h __builtin_msa_pckev_h
#define __msa_pckev_w __builtin_msa_pckev_w
#define __msa_pckev_d __builtin_msa_pckev_d
#define __msa_pckod_b __builtin_msa_pckod_b
#define __msa_pckod_h __builtin_msa_pckod_h
#define __msa_pckod_w __builtin_msa_pckod_w
#define __msa_pckod_d __builtin_msa_pckod_d
#define __msa_ilvl_b __builtin_msa_ilvl_b
#define __msa_ilvl_h __builtin_msa_ilvl_h
#define __msa_ilvl_w __builtin_msa_ilvl_w
#define __msa_ilvl_d __builtin_msa_ilvl_d
#define __msa_ilvr_b __builtin_msa_ilvr_b
#define __msa_ilvr_h __builtin_msa_ilvr_h
#define __msa_ilvr_w __builtin_msa_ilvr_w
#define __msa_ilvr_d __builtin_msa_ilvr_d
#define __msa_ilvev_b __builtin_msa_ilvev_b
#define __msa_ilvev_h __builtin_msa_ilvev_h
#define __msa_ilvev_w __builtin_msa_ilvev_w
#define __msa_ilvev_d __builtin_msa_ilvev_d
#define __msa_ilvod_b __builtin_msa_ilvod_b
#define __msa_ilvod_h __builtin_msa_ilvod_h
#define __msa_ilvod_w __builtin_msa_ilvod_w
#define __msa_ilvod_d __builtin_msa_ilvod_d
#define __msa_vshf_b __builtin_msa_vshf_b
#define __msa_vshf_h __builtin_msa_vshf_h
#define __msa_vshf_w __builtin_msa_vshf_w
#define __msa_vshf_d __builtin_msa_vshf_d
#define __msa_and_v __builtin_msa_and_v
#define __msa_andi_b __builtin_msa_andi_b
#define __msa_or_v __builtin_msa_or_v
#define __msa_ori_b __builtin_msa_ori_b
#define __msa_nor_v __builtin_msa_nor_v
#define __msa_nori_b __builtin_msa_nori_b
#define __msa_xor_v __builtin_msa_xor_v
#define __msa_xori_b __builtin_msa_xori_b
#define __msa_bmnz_v __builtin_msa_bmnz_v
#define __msa_bmnzi_b __builtin_msa_bmnzi_b
#define __msa_bmz_v __builtin_msa_bmz_v
#define __msa_bmzi_b __builtin_msa_bmzi_b
#define __msa_bsel_v __builtin_msa_bsel_v
#define __msa_bseli_b __builtin_msa_bseli_b
#define __msa_shf_b __builtin_msa_shf_b
#define __msa_shf_h __builtin_msa_shf_h
#define __msa_shf_w __builtin_msa_shf_w
#define __msa_test_bnz_v __builtin_msa_bnz_v
#define __msa_test_bz_v __builtin_msa_bz_v
#define __msa_fill_b __builtin_msa_fill_b
#define __msa_fill_h __builtin_msa_fill_h
#define __msa_fill_w __builtin_msa_fill_w
#define __msa_fill_d __builtin_msa_fill_d
#define __msa_pcnt_b __builtin_msa_pcnt_b
#define __msa_pcnt_h __builtin_msa_pcnt_h
#define __msa_pcnt_w __builtin_msa_pcnt_w
#define __msa_pcnt_d __builtin_msa_pcnt_d
#define __msa_nloc_b __builtin_msa_nloc_b
#define __msa_nloc_h __builtin_msa_nloc_h
#define __msa_nloc_w __builtin_msa_nloc_w
#define __msa_nloc_d __builtin_msa_nloc_d
#define __msa_nlzc_b __builtin_msa_nlzc_b
#define __msa_nlzc_h __builtin_msa_nlzc_h
#define __msa_nlzc_w __builtin_msa_nlzc_w
#define __msa_nlzc_d __builtin_msa_nlzc_d
#define __msa_copy_s_b __builtin_msa_copy_s_b
#define __msa_copy_s_h __builtin_msa_copy_s_h
#define __msa_copy_s_w __builtin_msa_copy_s_w
#define __msa_copy_s_d __builtin_msa_copy_s_d
#define __msa_copy_u_b __builtin_msa_copy_u_b
#define __msa_copy_u_h __builtin_msa_copy_u_h
#define __msa_copy_u_w __builtin_msa_copy_u_w
#define __msa_copy_u_d __builtin_msa_copy_u_d
#define __msa_insert_b __builtin_msa_insert_b
#define __msa_insert_h __builtin_msa_insert_h
#define __msa_insert_w __builtin_msa_insert_w
#define __msa_insert_d __builtin_msa_insert_d
#define __msa_insve_b __builtin_msa_insve_b
#define __msa_insve_h __builtin_msa_insve_h
#define __msa_insve_w __builtin_msa_insve_w
#define __msa_insve_d __builtin_msa_insve_d
#define __msa_test_bnz_b __builtin_msa_bnz_b
#define __msa_test_bnz_h __builtin_msa_bnz_h
#define __msa_test_bnz_w __builtin_msa_bnz_w
#define __msa_test_bnz_d __builtin_msa_bnz_d
#define __msa_test_bz_b __builtin_msa_bz_b
#define __msa_test_bz_h __builtin_msa_bz_h
#define __msa_test_bz_w __builtin_msa_bz_w
#define __msa_test_bz_d __builtin_msa_bz_d
#define __msa_ldi_b __builtin_msa_ldi_b
#define __msa_ldi_h __builtin_msa_ldi_h
#define __msa_ldi_w __builtin_msa_ldi_w
#define __msa_ldi_d __builtin_msa_ldi_d
#define __msa_fcaf_w __builtin_msa_fcaf_w
#define __msa_fcaf_d __builtin_msa_fcaf_d
#define __msa_fcor_w __builtin_msa_fcor_w
#define __msa_fcor_d __builtin_msa_fcor_d
#define __msa_fcun_w __builtin_msa_fcun_w
#define __msa_fcun_d __builtin_msa_fcun_d
#define __msa_fcune_w __builtin_msa_fcune_w
#define __msa_fcune_d __builtin_msa_fcune_d
#define __msa_fcueq_w __builtin_msa_fcueq_w
#define __msa_fcueq_d __builtin_msa_fcueq_d
#define __msa_fceq_w __builtin_msa_fceq_w
#define __msa_fceq_d __builtin_msa_fceq_d
#define __msa_fcne_w __builtin_msa_fcne_w
#define __msa_fcne_d __builtin_msa_fcne_d
#define __msa_fclt_w __builtin_msa_fclt_w
#define __msa_fclt_d __builtin_msa_fclt_d
#define __msa_fcult_w __builtin_msa_fcult_w
#define __msa_fcult_d __builtin_msa_fcult_d
#define __msa_fcle_w __builtin_msa_fcle_w
#define __msa_fcle_d __builtin_msa_fcle_d
#define __msa_fcule_w __builtin_msa_fcule_w
#define __msa_fcule_d __builtin_msa_fcule_d
#define __msa_fsaf_w __builtin_msa_fsaf_w
#define __msa_fsaf_d __builtin_msa_fsaf_d
#define __msa_fsor_w __builtin_msa_fsor_w
#define __msa_fsor_d __builtin_msa_fsor_d
#define __msa_fsun_w __builtin_msa_fsun_w
#define __msa_fsun_d __builtin_msa_fsun_d
#define __msa_fsune_w __builtin_msa_fsune_w
#define __msa_fsune_d __builtin_msa_fsune_d
#define __msa_fsueq_w __builtin_msa_fsueq_w
#define __msa_fsueq_d __builtin_msa_fsueq_d
#define __msa_fseq_w __builtin_msa_fseq_w
#define __msa_fseq_d __builtin_msa_fseq_d
#define __msa_fsne_w __builtin_msa_fsne_w
#define __msa_fsne_d __builtin_msa_fsne_d
#define __msa_fslt_w __builtin_msa_fslt_w
#define __msa_fslt_d __builtin_msa_fslt_d
#define __msa_fsult_w __builtin_msa_fsult_w
#define __msa_fsult_d __builtin_msa_fsult_d
#define __msa_fsle_w __builtin_msa_fsle_w
#define __msa_fsle_d __builtin_msa_fsle_d
#define __msa_fsule_w __builtin_msa_fsule_w
#define __msa_fsule_d __builtin_msa_fsule_d
#define __msa_fadd_w __builtin_msa_fadd_w
#define __msa_fadd_d __builtin_msa_fadd_d
#define __msa_fsub_w __builtin_msa_fsub_w
#define __msa_fsub_d __builtin_msa_fsub_d
#define __msa_fmul_w __builtin_msa_fmul_w
#define __msa_fmul_d __builtin_msa_fmul_d
#define __msa_fdiv_w __builtin_msa_fdiv_w
#define __msa_fdiv_d __builtin_msa_fdiv_d
#define __msa_fmadd_w __builtin_msa_fmadd_w
#define __msa_fmadd_d __builtin_msa_fmadd_d
#define __msa_fmsub_w __builtin_msa_fmsub_w
#define __msa_fmsub_d __builtin_msa_fmsub_d
#define __msa_fexp2_w __builtin_msa_fexp2_w
#define __msa_fexp2_d __builtin_msa_fexp2_d
#define __msa_fexdo_h __builtin_msa_fexdo_h
#define __msa_fexdo_w __builtin_msa_fexdo_w
#define __msa_ftq_h __builtin_msa_ftq_h
#define __msa_ftq_w __builtin_msa_ftq_w
#define __msa_fmin_w __builtin_msa_fmin_w
#define __msa_fmin_d __builtin_msa_fmin_d
#define __msa_fmin_a_w __builtin_msa_fmin_a_w
#define __msa_fmin_a_d __builtin_msa_fmin_a_d
#define __msa_fmax_w __builtin_msa_fmax_w
#define __msa_fmax_d __builtin_msa_fmax_d
#define __msa_fmax_a_w __builtin_msa_fmax_a_w
#define __msa_fmax_a_d __builtin_msa_fmax_a_d
#define __msa_mul_q_h __builtin_msa_mul_q_h
#define __msa_mul_q_w __builtin_msa_mul_q_w
#define __msa_mulr_q_h __builtin_msa_mulr_q_h
#define __msa_mulr_q_w __builtin_msa_mulr_q_w
#define __msa_madd_q_h __builtin_msa_madd_q_h
#define __msa_madd_q_w __builtin_msa_madd_q_w
#define __msa_maddr_q_h __builtin_msa_maddr_q_h
#define __msa_maddr_q_w __builtin_msa_maddr_q_w
#define __msa_msub_q_h __builtin_msa_msub_q_h
#define __msa_msub_q_w __builtin_msa_msub_q_w
#define __msa_msubr_q_h __builtin_msa_msubr_q_h
#define __msa_msubr_q_w __builtin_msa_msubr_q_w
#define __msa_fclass_w __builtin_msa_fclass_w
#define __msa_fclass_d __builtin_msa_fclass_d
#define __msa_fsqrt_w __builtin_msa_fsqrt_w
#define __msa_fsqrt_d __builtin_msa_fsqrt_d
#define __msa_frcp_w __builtin_msa_frcp_w
#define __msa_frcp_d __builtin_msa_frcp_d
#define __msa_frint_w __builtin_msa_frint_w
#define __msa_frint_d __builtin_msa_frint_d
#define __msa_frsqrt_w __builtin_msa_frsqrt_w
#define __msa_frsqrt_d __builtin_msa_frsqrt_d
#define __msa_flog2_w __builtin_msa_flog2_w
#define __msa_flog2_d __builtin_msa_flog2_d
#define __msa_fexupl_w __builtin_msa_fexupl_w
#define __msa_fexupl_d __builtin_msa_fexupl_d
#define __msa_fexupr_w __builtin_msa_fexupr_w
#define __msa_fexupr_d __builtin_msa_fexupr_d
#define __msa_ffql_w __builtin_msa_ffql_w
#define __msa_ffql_d __builtin_msa_ffql_d
#define __msa_ffqr_w __builtin_msa_ffqr_w
#define __msa_ffqr_d __builtin_msa_ffqr_d
#define __msa_ftint_s_w __builtin_msa_ftint_s_w
#define __msa_ftint_s_d __builtin_msa_ftint_s_d
#define __msa_ftint_u_w __builtin_msa_ftint_u_w
#define __msa_ftint_u_d __builtin_msa_ftint_u_d
#define __msa_ftrunc_s_w __builtin_msa_ftrunc_s_w
#define __msa_ftrunc_s_d __builtin_msa_ftrunc_s_d
#define __msa_ftrunc_u_w __builtin_msa_ftrunc_u_w
#define __msa_ftrunc_u_d __builtin_msa_ftrunc_u_d
#define __msa_ffint_s_w __builtin_msa_ffint_s_w
#define __msa_ffint_s_d __builtin_msa_ffint_s_d
#define __msa_ffint_u_w __builtin_msa_ffint_u_w
#define __msa_ffint_u_d __builtin_msa_ffint_u_d
#define __msa_cfcmsa __builtin_msa_cfcmsa
#define __msa_move_v __builtin_msa_move_v
#endif /* defined(__mips_msa) */
#endif /* _MSA_H */
...@@ -39,8 +39,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -39,8 +39,8 @@ along with GCC; see the file COPYING3. If not see
\ \
/* If no FP ABI option is specified, infer one from the \ /* If no FP ABI option is specified, infer one from the \
ABI/ISA level. */ \ ABI/ISA level. */ \
"%{!msoft-float: %{!msingle-float: %{!mfp*: %{mabi=32: %{" \ "%{!msoft-float: %{!msingle-float: %{!mfp*: %{!mmsa: %{mabi=32: %{" \
MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}", \ MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}}", \
\ \
/* Make sure that an endian option is always present. This makes \ /* Make sure that an endian option is always present. This makes \
things like LINK_SPEC easier to write. */ \ things like LINK_SPEC easier to write. */ \
......
...@@ -61,9 +61,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -61,9 +61,9 @@ along with GCC; see the file COPYING3. If not see
"%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=n32}}", \ "%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=n32}}", \
\ \
/* If no FP ABI option is specified, infer one from the \ /* If no FP ABI option is specified, infer one from the \
ABI/ISA level. */ \ ABI/ISA level unless there is a conflicting option. */ \
"%{!msoft-float: %{!msingle-float: %{!mfp*: %{mabi=32: %{" \ "%{!msoft-float: %{!msingle-float: %{!mfp*: %{!mmsa: %{mabi=32: %{" \
MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}", \ MIPS_FPXX_OPTION_SPEC ": -mfpxx}}}}}}", \
\ \
/* Base SPECs. */ \ /* Base SPECs. */ \
BASE_DRIVER_SELF_SPECS \ BASE_DRIVER_SELF_SPECS \
......
...@@ -37,10 +37,34 @@ ...@@ -37,10 +37,34 @@
(and (match_code "const_int") (and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 1, 4)"))) (match_test "IN_RANGE (INTVAL (op), 1, 4)")))
(define_predicate "const_msa_branch_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), -1024, 1023)")))
(define_predicate "const_uimm3_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 0, 7)")))
(define_predicate "const_uimm4_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 0, 15)")))
(define_predicate "const_uimm5_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 0, 31)")))
(define_predicate "const_uimm6_operand" (define_predicate "const_uimm6_operand"
(and (match_code "const_int") (and (match_code "const_int")
(match_test "UIMM6_OPERAND (INTVAL (op))"))) (match_test "UIMM6_OPERAND (INTVAL (op))")))
(define_predicate "const_uimm8_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 0, 255)")))
(define_predicate "const_imm5_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), -16, 15)")))
(define_predicate "const_imm10_operand" (define_predicate "const_imm10_operand"
(and (match_code "const_int") (and (match_code "const_int")
(match_test "IMM10_OPERAND (INTVAL (op))"))) (match_test "IMM10_OPERAND (INTVAL (op))")))
...@@ -49,6 +73,22 @@ ...@@ -49,6 +73,22 @@
(ior (match_operand 0 "const_imm10_operand") (ior (match_operand 0 "const_imm10_operand")
(match_operand 0 "register_operand"))) (match_operand 0 "register_operand")))
(define_predicate "aq10b_operand"
(and (match_code "const_int")
(match_test "mips_signed_immediate_p (INTVAL (op), 10, 0)")))
(define_predicate "aq10h_operand"
(and (match_code "const_int")
(match_test "mips_signed_immediate_p (INTVAL (op), 10, 1)")))
(define_predicate "aq10w_operand"
(and (match_code "const_int")
(match_test "mips_signed_immediate_p (INTVAL (op), 10, 2)")))
(define_predicate "aq10d_operand"
(and (match_code "const_int")
(match_test "mips_signed_immediate_p (INTVAL (op), 10, 3)")))
(define_predicate "sle_operand" (define_predicate "sle_operand"
(and (match_code "const_int") (and (match_code "const_int")
(match_test "SMALL_OPERAND (INTVAL (op) + 1)"))) (match_test "SMALL_OPERAND (INTVAL (op) + 1)")))
...@@ -61,6 +101,14 @@ ...@@ -61,6 +101,14 @@
(and (match_code "const_int,const_double,const_vector") (and (match_code "const_int,const_double,const_vector")
(match_test "op == CONST0_RTX (GET_MODE (op))"))) (match_test "op == CONST0_RTX (GET_MODE (op))")))
(define_predicate "const_m1_operand"
(and (match_code "const_int,const_double,const_vector")
(match_test "op == CONSTM1_RTX (GET_MODE (op))")))
(define_predicate "reg_or_m1_operand"
(ior (match_operand 0 "const_m1_operand")
(match_operand 0 "register_operand")))
(define_predicate "reg_or_0_operand" (define_predicate "reg_or_0_operand"
(ior (and (match_operand 0 "const_0_operand") (ior (and (match_operand 0 "const_0_operand")
(not (match_test "TARGET_MIPS16"))) (not (match_test "TARGET_MIPS16")))
...@@ -74,6 +122,23 @@ ...@@ -74,6 +122,23 @@
(ior (match_operand 0 "const_1_operand") (ior (match_operand 0 "const_1_operand")
(match_operand 0 "register_operand"))) (match_operand 0 "register_operand")))
;; These are used in vec_merge, hence accept bitmask as const_int.
(define_predicate "const_exp_2_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (exact_log2 (INTVAL (op)), 0, 1)")))
(define_predicate "const_exp_4_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (exact_log2 (INTVAL (op)), 0, 3)")))
(define_predicate "const_exp_8_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (exact_log2 (INTVAL (op)), 0, 7)")))
(define_predicate "const_exp_16_operand"
(and (match_code "const_int")
(match_test "IN_RANGE (exact_log2 (INTVAL (op)), 0, 15)")))
;; This is used for indexing into vectors, and hence only accepts const_int. ;; This is used for indexing into vectors, and hence only accepts const_int.
(define_predicate "const_0_or_1_operand" (define_predicate "const_0_or_1_operand"
(and (match_code "const_int") (and (match_code "const_int")
...@@ -507,3 +572,65 @@ ...@@ -507,3 +572,65 @@
(define_predicate "non_volatile_mem_operand" (define_predicate "non_volatile_mem_operand"
(and (match_operand 0 "memory_operand") (and (match_operand 0 "memory_operand")
(not (match_test "MEM_VOLATILE_P (op)")))) (not (match_test "MEM_VOLATILE_P (op)"))))
(define_predicate "const_vector_same_val_operand"
(match_code "const_vector")
{
return mips_const_vector_same_val_p (op, mode);
})
(define_predicate "const_vector_same_simm5_operand"
(match_code "const_vector")
{
return mips_const_vector_same_int_p (op, mode, -16, 15);
})
(define_predicate "const_vector_same_uimm5_operand"
(match_code "const_vector")
{
return mips_const_vector_same_int_p (op, mode, 0, 31);
})
(define_predicate "const_vector_same_ximm5_operand"
(match_code "const_vector")
{
return mips_const_vector_same_int_p (op, mode, -31, 31);
})
(define_predicate "const_vector_same_uimm6_operand"
(match_code "const_vector")
{
return mips_const_vector_same_int_p (op, mode, 0, 63);
})
(define_predicate "const_vector_same_uimm8_operand"
(match_code "const_vector")
{
return mips_const_vector_same_int_p (op, mode, 0, 255);
})
(define_predicate "par_const_vector_shf_set_operand"
(match_code "parallel")
{
return mips_const_vector_shuffle_set_p (op, mode);
})
(define_predicate "reg_or_vector_same_val_operand"
(ior (match_operand 0 "register_operand")
(match_operand 0 "const_vector_same_val_operand")))
(define_predicate "reg_or_vector_same_simm5_operand"
(ior (match_operand 0 "register_operand")
(match_operand 0 "const_vector_same_simm5_operand")))
(define_predicate "reg_or_vector_same_uimm5_operand"
(ior (match_operand 0 "register_operand")
(match_operand 0 "const_vector_same_uimm5_operand")))
(define_predicate "reg_or_vector_same_ximm5_operand"
(ior (match_operand 0 "register_operand")
(match_operand 0 "const_vector_same_ximm5_operand")))
(define_predicate "reg_or_vector_same_uimm6_operand"
(ior (match_operand 0 "register_operand")
(match_operand 0 "const_vector_same_uimm6_operand")))
...@@ -11451,6 +11451,7 @@ instructions, but allow the compiler to schedule those calls. ...@@ -11451,6 +11451,7 @@ instructions, but allow the compiler to schedule those calls.
* MIPS DSP Built-in Functions:: * MIPS DSP Built-in Functions::
* MIPS Paired-Single Support:: * MIPS Paired-Single Support::
* MIPS Loongson Built-in Functions:: * MIPS Loongson Built-in Functions::
* MIPS SIMD Architecture (MSA) Support::
* Other MIPS Built-in Functions:: * Other MIPS Built-in Functions::
* MSP430 Built-in Functions:: * MSP430 Built-in Functions::
* NDS32 Built-in Functions:: * NDS32 Built-in Functions::
...@@ -13561,6 +13562,794 @@ else ...@@ -13561,6 +13562,794 @@ else
@end smallexample @end smallexample
@end table @end table
@node MIPS SIMD Architecture (MSA) Support
@subsection MIPS SIMD Architecture (MSA) Support
@menu
* MIPS SIMD Architecture Built-in Functions::
@end menu
GCC provides intrinsics to access the SIMD instructions provided by the
MSA MIPS SIMD Architecture. The interface is made available by including
@code{<msa.h>} and using @option{-mmsa -mhard-float -mfp64 -mnan=2008}.
For each @code{__builtin_msa_*}, there is a shortened name of the intrinsic,
@code{__msa_*}.
MSA implements 128-bit wide vector registers, operating on 8-, 16-, 32- and
64-bit integer, 16- and 32-bit fixed-point, or 32- and 64-bit floating point
data elements. The following vectors typedefs are included in @code{msa.h}:
@itemize
@item @code{v16i8}, a vector of sixteen signed 8-bit integers;
@item @code{v16u8}, a vector of sixteen unsigned 8-bit integers;
@item @code{v8i16}, a vector of eight signed 16-bit integers;
@item @code{v8u16}, a vector of eight unsigned 16-bit integers;
@item @code{v4i32}, a vector of four signed 32-bit integers;
@item @code{v4u32}, a vector of four unsigned 32-bit integers;
@item @code{v2i64}, a vector of two signed 64-bit integers;
@item @code{v2u64}, a vector of two unsigned 64-bit integers;
@item @code{v4f32}, a vector of four 32-bit floats;
@item @code{v2f64}, a vector of two 64-bit doubles.
@end itemize
Intructions and corresponding built-ins may have additional restrictions and/or
input/output values manipulated:
@itemize
@item @code{imm0_1}, an integer literal in range 0 to 1;
@item @code{imm0_3}, an integer literal in range 0 to 3;
@item @code{imm0_7}, an integer literal in range 0 to 7;
@item @code{imm0_15}, an integer literal in range 0 to 15;
@item @code{imm0_31}, an integer literal in range 0 to 31;
@item @code{imm0_63}, an integer literal in range 0 to 63;
@item @code{imm0_255}, an integer literal in range 0 to 255;
@item @code{imm_n16_15}, an integer literal in range -16 to 15;
@item @code{imm_n512_511}, an integer literal in range -512 to 511;
@item @code{imm_n1024_1022}, an integer literal in range -512 to 511 left
shifted by 1 bit, i.e., -1024, -1022, @dots{}, 1020, 1022;
@item @code{imm_n2048_2044}, an integer literal in range -512 to 511 left
shifted by 2 bits, i.e., -2048, -2044, @dots{}, 2040, 2044;
@item @code{imm_n4096_4088}, an integer literal in range -512 to 511 left
shifted by 3 bits, i.e., -4096, -4088, @dots{}, 4080, 4088;
@item @code{imm1_4}, an integer literal in range 1 to 4;
@item @code{i32, i64, u32, u64, f32, f64}, defined as follows:
@end itemize
@smallexample
@{
typedef int i32;
#if __LONG_MAX__ == __LONG_LONG_MAX__
typedef long i64;
#else
typedef long long i64;
#endif
typedef unsigned int u32;
#if __LONG_MAX__ == __LONG_LONG_MAX__
typedef unsigned long u64;
#else
typedef unsigned long long u64;
#endif
typedef double f64;
typedef float f32;
@}
@end smallexample
@node MIPS SIMD Architecture Built-in Functions
@subsubsection MIPS SIMD Architecture Built-in Functions
The intrinsics provided are listed below; each is named after the
machine instruction.
@smallexample
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);
@end smallexample
@node Other MIPS Built-in Functions @node Other MIPS Built-in Functions
@subsection Other MIPS Built-in Functions @subsection Other MIPS Built-in Functions
......
...@@ -849,6 +849,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -849,6 +849,7 @@ Objective-C and Objective-C++ Dialects}.
-mvirt -mno-virt @gol -mvirt -mno-virt @gol
-mxpa -mno-xpa @gol -mxpa -mno-xpa @gol
-mmicromips -mno-micromips @gol -mmicromips -mno-micromips @gol
-mmsa -mno-msa @gol
-mfpu=@var{fpu-type} @gol -mfpu=@var{fpu-type} @gol
-msmartmips -mno-smartmips @gol -msmartmips -mno-smartmips @gol
-mpaired-single -mno-paired-single -mdmx -mno-mdmx @gol -mpaired-single -mno-paired-single -mdmx -mno-mdmx @gol
......
...@@ -1641,6 +1641,9 @@ MIPS target can generate MIPS16 code. ...@@ -1641,6 +1641,9 @@ MIPS target can generate MIPS16 code.
MIPS target is a Loongson-2E or -2F target using an ABI that supports MIPS target is a Loongson-2E or -2F target using an ABI that supports
the Loongson vector modes. the Loongson vector modes.
@item mips_msa
MIPS target supports @code{-mmsa}, MIPS SIMD Architecture (MSA).
@item mips_newabi_large_long_double @item mips_newabi_large_long_double
MIPS target supports @code{long double} larger than @code{double} MIPS target supports @code{long double} larger than @code{double}
when using the new ABI. when using the new ABI.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment