[PATCH] Separate macro-fusible instructions from not for -mbranches-within-32B-boundaries
Hongtao Liu
crazylht@gmail.com
Fri Feb 28 08:57:00 GMT 2020
On Fri, Feb 28, 2020 at 4:55 PM Hongtao Liu <crazylht@gmail.com> wrote:
>
> Hi:
> This is subsequent patch for JCC Code Erratum.
> Refer to http://sourceware-org.1504.n7.nabble.com/PATCH-0-5-i386-Optimize-for-Jump-Conditional-Code-Erratum-tt598005.html#none
>
> According to intel SDM manual, not all compare flag-modifying
> instructions are marcro-fusible with subsequent jcc instruction. For
> those not, -mbranches-within-32B-boundaries need't align them as
> FUSED_JCC_PADDING, only jcc itself need to be aligned. Here are 2
> restrictions which separate macro-fusible instruction from not
>
> Restriction 1:
> If TEST/AND/CMP/ADD/SUB/INC/DEC is one of the following format:
>
> cmp m, imm
> add m, imm
> sub m, imm
> test m, imm
> and m, imm
> inc m
> dec m
>
> it is unfusible with any jcc instructions.
>
> Restriction 2:
> /* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
> ---------------------------------------------------------------------
> | JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
> | ------ | ----------- | ------- | -------- |
> | Jo | N | N | Y |
> | Jno | N | N | Y |
> | Jc/Jb | Y | N | Y |
> | Jae/Jnb | Y | N | Y |
> | Je/Jz | Y | Y | Y |
> | Jne/Jnz | Y | Y | Y |
> | Jna/Jbe | Y | N | Y |
> | Ja/Jnbe | Y | N | Y |
> | Js | N | N | Y |
> | Jns | N | N | Y |
> | Jp/Jpe | N | N | Y |
> | Jnp/Jpo | N | N | Y |
> | Jl/Jnge | Y | Y | Y |
> | Jge/Jnl | Y | Y | Y |
> | Jle/Jng | Y | Y | Y |
> | Jg/Jnle | Y | Y | Y |
>
>
> Changelog
>
> * gas/config/tc-i386.h (i386_tc_frag_data): Add member mf_type.
> (TC_FRAG_INIT): Init mf_type.
> * gas/config/tc-i386.c (enum mf_jcc_kind): New enum.
> (enum mf_cmp_kind): Ditto.
> (maybe_fused_with_jcc_p): Add argument mf_cmp_p to get
> mf_type of corresponding instructons, exclude unfusible
> instructions.
> (add_fused_jcc_padding_frag_p): Likewise.
> (add_branch_padding_frag_p): Likewise.
> (output_insn): Record mf_type for corresponding instructions.
> (i386_macro_fusible_p): New function.
> (i386_next_fusible_jcc_frag): Rename from i386_next_jcc_frag,
> add argument cmp_fragP to return next fusible jcc frag only.
> (i386_classify_machine_dependant_frag): Seperate macro-fusible
> instructions from condition jump.
> * gas/testsuite/gas/i386/align-branch-9.s: New file.
> * gas/testsuite/gas/i386/align-branch-9.d: Ditto.
> * gas/testsuite/gas/i386/x86-64-align-branch-9.s: Ditto.
> * gas/testsuite/gas/i386/x86-64-align-branch-9.d: Ditto.
> * gas/testsuite/gas/i386/i386.exp: Run new tests.
>
> --
> BR,
> Hongtao
Add patch.
--
BR,
Hongtao
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-According-to-intel-SDM-manual-not-all-compare-flag-m.patch
Type: application/octet-stream
Size: 24193 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20200228/18310730/attachment.obj>
More information about the Binutils
mailing list