On 05/01/18 09:51, Richard Biener wrote:
> On Thu, Jan 4, 2018 at 2:58 PM, Richard Earnshaw
> <richard.earns...@arm.com> wrote:
>>
>> This patch implements support for __builtin_load_no_speculate on
>> AArch64.  On this architecture we inhibit speclation by emitting a
>> combination of CSEL and a hint instruction that ensures the CSEL is
>> full resolved when the operands to the CSEL may involve a speculative
>> load.
> 
> Missing a high-level exlanation here but it looks like you do sth like
> 
>   if (access is not in bounds)
>     no-speculate-access;
>   else
>      regular access;

For aarch64 we end up with a sequence like

        CMP     'bounds'
        B<cond> out-of-range
        LDR     x1, [ptr]
out-of-range:
        CSEL    x1, FAILVAL, x1, <cond>
        CSDB

The CSEL+CSDB combination ensures that even if we do fetch x1 from an
out-of-range location the value won't persist beyond the end of the code
sequence and thus can't be used for further speculation.

> 
> with the upper/lower bounds.  Is this because 'no-speculate-access' is
> prohibitely
> expensive even when factoring in the condition computation and the condjump?
> (trying to reverse engineer how the actual assembly will look like
> from the patch,

It's all in the white paper.

> there isn't even a testcase :/)
> 
>>         * config/aarch64/aarch64.c (aarch64_print_operand): Handle zero 
>> passed
>>         to 'H' operand qualifier.
>>         (aarch64_inhibit_load_speculation): New function.
>>         (TARGET_INHIBIT_LOAD_SPECULATION): Redefine.
>>         * config/aarch64/aarch64.md (UNSPECV_NOSPECULATE): New 
>> unspec_volatile
>>         code.
>>         (nospeculate<ALLI:mode>, nospeculateti): New patterns.
>> ---
>>  gcc/config/aarch64/aarch64.c  | 92 
>> +++++++++++++++++++++++++++++++++++++++++++
>>  gcc/config/aarch64/aarch64.md | 28 +++++++++++++
>>  2 files changed, 120 insertions(+)
>>

Reply via email to