Hi,

Here is a patch which adds support for new instructions from Intel
Memory Protection Extensions (MPX) ISA [1]

This patch introduces bound type, modes, registers and all MPX instructions.

Control transfer instructions are modified to support 'bnd' prefix
used by Intel MPX.

Bootstrap and checked on x86_64-linux. There is one issue [2] with
length attribute computation which leads to several fails in make
check. Currently I assume it is not a bug in this patch. But in case
it is a patch problem I have a version which uses temp attribute for
length computation as a workaround (resulting in clean make check).

Does it look good for trunk?

Thanks,
Ilya

[1] http://download-software.intel.com/sites/default/files/319433-015.pdf
[2] http://gcc.gnu.org/ml/gcc/2013-07/msg00311.html

-----
2013-07-23  Ilya Enkovich  <ilya.enkov...@intel.com>

        * mode-classes.def (MODE_BOUND): New.
        * tree.def (BOUND_TYPE): New.
        * genmodes.c (complete_mode): Support MODE_BOUND.
        (BOUND_MODE): New.
        (make_bound_mode): New.
        * machmode.h (BOUND_MODE_P): New.
        * stor-layout.c (mode_for_bound): New.
        (int_mode_for_mode): Support MODE_BOUND.
        (layout_type): Support BOUND_TYPE.
        * tree-pretty-print.c (dump_generic_node): Support BOUND_TYPE.
        * tree.c (build_int_cst_wide): Support BOUND_TYPE.
        (type_contains_placeholder_1): Likewise.
        * tree.h (BOUND_TYPE_P): New.
        * varasm.c (output_constant): Support BOUND_TYPE.
        * config/i386/constraints.md (B): New.
        * config/i386/i386-modes.def (BND32): New.
        (BND64): New.
        * config/i386/i386-protos.h (ix86_bnd_prefixed_insn_p): New.
        * config/i386/i386.c (regclass_map): Add bound registers.
        (dbx_register_map): Likewise.
        (dbx64_register_map): Likewise.
        (svr4_dbx_register_map): Likewise.
        (ix86_code_end): Add MPX bnd prefix.
        (output_set_got): Likewise.
        (ix86_output_call_insn): Likewise.
        (get_some_local_dynamic_name): Add '!' (MPX bnd) print prefix support.
        (ix86_print_operand_punct_valid_p): Likewise.
        (ix86_print_operand_address): Support UNSPEC_BNDMK_ADDR and
        UNSPEC_BNDMK_ADDR.
        (ix86_class_likely_spilled_p): Add bound regs support.
        (ix86_hard_regno_mode_ok): Likewise.
        (x86_order_regs_for_local_alloc): Likewise.
        (ix86_bnd_prefixed_insn_p): New.
        * config/i386/i386.h (FIRST_PSEUDO_REGISTER): Fix to new value.
        (FIXED_REGISTERS): Add bound registers.
        (CALL_USED_REGISTERS): Likewise.
        (REG_ALLOC_ORDER): Likewise.
        (HARD_REGNO_NREGS): Likewise.
        (VALID_BND_REG_MODE): New.
        (FIRST_BND_REG): New.
        (LAST_BND_REG): New.
        (reg_class): Add BND_REGS.
        (REG_CLASS_NAMES): Likewise.
        (REG_CLASS_CONTENTS): Likewise.
        (BND_REGNO_P): New.
        (ANY_BND_REG_P): New.
        (BNDmode): New.
        (HI_REGISTER_NAMES): Add bound registers.
        * config/i386/i386.md (UNSPEC_BNDMK): New.
        (UNSPEC_BNDMK_ADDR): New.
        (UNSPEC_BNDSTX): New.
        (UNSPEC_BNDLDX): New.
        (UNSPEC_BNDLDX_ADDR): New.
        (UNSPEC_BNDCL): New.
        (UNSPEC_BNDCU): New.
        (UNSPEC_BNDCN): New.
        (UNSPEC_MPX_FENCE): New.
        (BND0_REG): New.
        (BND1_REG): New.
        (type): Add mpxmov, mpxmk, mpxchk, mpxld, mpxst.
        (length_immediate): Likewise.
        (prefix_0f): Likewise.
        (memory): Likewise.
        (prefix_rep): Check for bnd prefix.
        (BND): New.
        (bnd_ptr): New.
        (BNDCHECK): New.
        (bndcheck): New.
        (*jcc_1): Add MPX bnd prefix and fix length.
        (*jcc_2): Likewise.
        (jump): Likewise.
        (simple_return_internal): Likewise.
        (simple_return_pop_internal): Likewise.
        (*indirect_jump): Add MPX bnd prefix.
        (*tablejump_1): Likewise.
        (simple_return_internal_long): Likewise.
        (simple_return_indirect_internal): Likewise.
        (<mode>_mk): New.
        (*<mode>_mk): New.
        (mov<mode>): New.
        (*mov<mode>_internal_mpx): New.
        (<mode>_<bndcheck>): New.
        (*<mode>_<bndcheck>): New.
        (<mode>_ldx): New.
        (*<mode>_ldx): New.
        (<mode>_stx): New.
        (*<mode>_stx): New.
        * config/i386/predicates.md (lea_address_operand) Rename to...
        (address_no_seg_operand): ... this.
        (address_mpx_no_base_operand): New.
        (address_mpx_no_index_operand): New.
        (bnd_mem_operator): New.

Attachment: mpx-isa.patch
Description: Binary data

Reply via email to