Bootstrapped & regression-tested on x86_64-linux-gnu and aarch64-linux-gnu. Also tested via config-list.mk. Committed as preapproved.
Thanks, Richard gcc/ * target-insns.def (extv, extzv, insv): New targetm instruction patterns. * optabs.c (get_extraction_insn): Use them instead of HAVE_*/gen_* interface. * recog.c (simplify_while_replacing): Likewise. Index: gcc/target-insns.def =================================================================== --- gcc/target-insns.def 2015-07-05 09:01:57.816257588 +0100 +++ gcc/target-insns.def 2015-07-05 09:01:57.812257637 +0100 @@ -42,6 +42,9 @@ DEF_TARGET_INSN (doloop_begin, (rtx x0, DEF_TARGET_INSN (doloop_end, (rtx x0, rtx x1)) DEF_TARGET_INSN (epilogue, (void)) DEF_TARGET_INSN (exception_receiver, (void)) +DEF_TARGET_INSN (extv, (rtx x0, rtx x1, rtx x2, rtx x3)) +DEF_TARGET_INSN (extzv, (rtx x0, rtx x1, rtx x2, rtx x3)) +DEF_TARGET_INSN (insv, (rtx x0, rtx x1, rtx x2, rtx x3)) DEF_TARGET_INSN (jump, (rtx x0)) DEF_TARGET_INSN (load_multiple, (rtx x0, rtx x1, rtx x2)) DEF_TARGET_INSN (mem_signal_fence, (rtx x0)) Index: gcc/optabs.c =================================================================== --- gcc/optabs.c 2015-07-05 09:01:57.816257588 +0100 +++ gcc/optabs.c 2015-07-05 09:01:57.808257686 +0100 @@ -8416,18 +8416,6 @@ expand_jump_insn (enum insn_code icode, } /* Reduce conditional compilation elsewhere. */ -#ifndef HAVE_insv -#define HAVE_insv 0 -#define CODE_FOR_insv CODE_FOR_nothing -#endif -#ifndef HAVE_extv -#define HAVE_extv 0 -#define CODE_FOR_extv CODE_FOR_nothing -#endif -#ifndef HAVE_extzv -#define HAVE_extzv 0 -#define CODE_FOR_extzv CODE_FOR_nothing -#endif /* Enumerates the possible types of structure operand to an extraction_insn. */ @@ -8512,25 +8500,25 @@ get_extraction_insn (extraction_insn *in switch (pattern) { case EP_insv: - if (HAVE_insv + if (targetm.have_insv () && get_traditional_extraction_insn (insn, type, mode, - CODE_FOR_insv, 0, 3)) + targetm.code_for_insv, 0, 3)) return true; return get_optab_extraction_insn (insn, type, mode, insv_optab, insvmisalign_optab, 2); case EP_extv: - if (HAVE_extv + if (targetm.have_extv () && get_traditional_extraction_insn (insn, type, mode, - CODE_FOR_extv, 1, 0)) + targetm.code_for_extv, 1, 0)) return true; return get_optab_extraction_insn (insn, type, mode, extv_optab, extvmisalign_optab, 3); case EP_extzv: - if (HAVE_extzv + if (targetm.have_extzv () && get_traditional_extraction_insn (insn, type, mode, - CODE_FOR_extzv, 1, 0)) + targetm.code_for_extzv, 1, 0)) return true; return get_optab_extraction_insn (insn, type, mode, extzv_optab, extzvmisalign_optab, 3); Index: gcc/recog.c =================================================================== --- gcc/recog.c 2015-07-05 09:01:57.816257588 +0100 +++ gcc/recog.c 2015-07-05 09:01:57.812257637 +0100 @@ -566,15 +566,6 @@ cancel_changes (int num) } /* Reduce conditional compilation elsewhere. */ -#ifndef HAVE_extv -#define HAVE_extv 0 -#define CODE_FOR_extv CODE_FOR_nothing -#endif -#ifndef HAVE_extzv -#define HAVE_extzv 0 -#define CODE_FOR_extzv CODE_FOR_nothing -#endif - /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting rtx. */ @@ -690,15 +681,15 @@ simplify_while_replacing (rtx *loc, rtx machine_mode is_mode = GET_MODE (XEXP (x, 0)); int pos = INTVAL (XEXP (x, 2)); - if (GET_CODE (x) == ZERO_EXTRACT && HAVE_extzv) + if (GET_CODE (x) == ZERO_EXTRACT && targetm.have_extzv ()) { - wanted_mode = insn_data[CODE_FOR_extzv].operand[1].mode; + wanted_mode = insn_data[targetm.code_for_extzv].operand[1].mode; if (wanted_mode == VOIDmode) wanted_mode = word_mode; } - else if (GET_CODE (x) == SIGN_EXTRACT && HAVE_extv) + else if (GET_CODE (x) == SIGN_EXTRACT && targetm.have_extv ()) { - wanted_mode = insn_data[CODE_FOR_extv].operand[1].mode; + wanted_mode = insn_data[targetm.code_for_extv].operand[1].mode; if (wanted_mode == VOIDmode) wanted_mode = word_mode; }