https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87888
Bug ID: 87888
Summary: Behaviour of __builtin_arc_sr differs from its
description in the manual.
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: nbowler at draconx dot ca
Target Milestone: ---
I happened to notice what appears to be an error in the GCC manual,
ยง6.59.4 ARC Built-in Functions[1]:
Built-in Function: void __builtin_arc_sr (unsigned int auxr, unsigned int val)
The first argument, /auxv/, is the address of an auxiliary register,
the second argument, /val/, is a compile time constant to be written
to the register. Generates:
sr auxr, [val]
This function indeed generates the sr instruction with the parameters
exactly as described, e.g., __builtin_arc_sr(0x123, 0x456) generates
sr 0x123, [0x456]
However, the description of those parameters is incorrect: the first
operand of sr is the value to be written, and the second is the address,
so the previous example stores the value 0x123 to aux address 0x456.
Also I think the note about val being a compile-time constant is an
error as well... the sr instruction does not require constants, and
gcc happily accepts non-constant values as arguments to this builtin.
I suggest the documentation of this builtin should be changed to match
its actual behaviour, perhaps something like:
Built-in Function: void __builtin_arc_sr (unsigned int val, unsigned int auxr)
Stores /val/ to the auxiliary register with address /auxr/. Generates:
sr val, [auxr]
[1]
https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/ARC-Built-in-Functions.html#index-_005f_005fbuiltin_005farc_005fsr