diff options
Diffstat (limited to 'gcc-4.9/gcc/config/i386/i386.md')
-rw-r--r-- | gcc-4.9/gcc/config/i386/i386.md | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/gcc-4.9/gcc/config/i386/i386.md b/gcc-4.9/gcc/config/i386/i386.md index 2369e4b40..f5eff3d90 100644 --- a/gcc-4.9/gcc/config/i386/i386.md +++ b/gcc-4.9/gcc/config/i386/i386.md @@ -11140,15 +11140,20 @@ [(set (pc) (match_operand 0 "indirect_branch_operand"))] "" { - if (TARGET_X32) + if (TARGET_X32 || ix86_indirect_branch_register) operands[0] = convert_memory_address (word_mode, operands[0]); + cfun->machine->has_local_indirect_jump = true; }) (define_insn "*indirect_jump" [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))] "" - "jmp\t%A0" - [(set_attr "type" "ibr") + "* return ix86_output_indirect_jmp (operands[0], false);" + [(set (attr "type") + (if_then_else (match_test "(cfun->machine->indirect_branch_type + != indirect_branch_keep)") + (const_string "multi") + (const_string "ibr"))) (set_attr "length_immediate" "0")]) (define_expand "tablejump" @@ -11188,16 +11193,21 @@ OPTAB_DIRECT); } - if (TARGET_X32) + if (TARGET_X32 || ix86_indirect_branch_register) operands[0] = convert_memory_address (word_mode, operands[0]); + cfun->machine->has_local_indirect_jump = true; }) (define_insn "*tablejump_1" [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw")) (use (label_ref (match_operand 1)))] "" - "jmp\t%A0" - [(set_attr "type" "ibr") + "* return ix86_output_indirect_jmp (operands[0], false);" + [(set (attr "type") + (if_then_else (match_test "(cfun->machine->indirect_branch_type + != indirect_branch_keep)") + (const_string "multi") + (const_string "ibr"))) (set_attr "length_immediate" "0")]) ;; Convert setcc + movzbl to xor + setcc if operands don't overlap. @@ -11583,18 +11593,7 @@ (define_insn "simple_return_internal" [(simple_return)] "reload_completed" -{ - if (TARGET_64BIT && patch_functions_for_instrumentation) - { - /* Emit 10 nop bytes after ret. */ - if (ix86_output_function_nops_prologue_epilogue (asm_out_file, - FUNCTION_PATCH_EPILOGUE_SECTION, - "\tret", - 10)) - return ""; - } - return "ret"; -} + "* return ix86_output_function_return (false);" [(set_attr "length" "1") (set_attr "atom_unit" "jeu") (set_attr "length_immediate" "0") @@ -11607,18 +11606,7 @@ [(simple_return) (unspec [(const_int 0)] UNSPEC_REP)] "reload_completed" -{ - if (TARGET_64BIT && patch_functions_for_instrumentation) - { - /* Emit 9 nop bytes after rep;ret. */ - if (ix86_output_function_nops_prologue_epilogue (asm_out_file, - FUNCTION_PATCH_EPILOGUE_SECTION, - "\trep\;ret", - 9)) - return ""; - } - return "rep\;ret"; -} + "* return ix86_output_function_return (true);" [(set_attr "length" "2") (set_attr "atom_unit" "jeu") (set_attr "length_immediate" "0") @@ -11639,8 +11627,12 @@ [(simple_return) (use (match_operand:SI 0 "register_operand" "r"))] "reload_completed" - "jmp\t%A0" - [(set_attr "type" "ibr") + "* return ix86_output_indirect_jmp (operands[0], true);" + [(set (attr "type") + (if_then_else (match_test "(cfun->machine->indirect_branch_type + != indirect_branch_keep)") + (const_string "multi") + (const_string "ibr"))) (set_attr "length_immediate" "0")]) (define_insn "nop" |