Hi Florian,
I think the main thing is that Object
Pascal has always supported the ability to
drop into assembly language, unlike C++
which requires a dialect-specific
extension and is not allowed at all under
Microsoft Visual C++ 64-bit. Allowing
certain assembler routines to be inlined
seems like a logical extension using
language semantics that already exist.
Part of it may be preference but I think
some people like the fine degree of
control that assembly language offers,
while intrinsics, I find, can quickly get
somewhat untidy and confusing, especially
with instructions like CPUID that read and
write to specific registers (although my
code forbids that instruction because EBX
is non-volatile).
The other thing... no matter how good the
compiler is, there are some situations
where assembly language will always
perform better.
I suppose I would like to ask the
community more than anything. Is this a
feature that you'd like to see and use?
I hoped the way that I designed the patch
helps to alleviate the can of worms by
simply not allowing inline if the platform
doesn't have the ability to support it
yet. "CanInline" simply returns False
unless overridden.
Gareth aka. Kit
On Sun 17/03/19 17:37 , Florian Klämpfl
sent:
Am 15.03.19 um 11:32 schrieb J. Gareth
Moreton:
Show quoted text 6 lines
> Hi everyone,
>
> Sorry for the slightly long-winded
title.
This was something I've been
> working on for the past few weeks to
allow the
use of "inline" with
> certain x86 assembler routines,
subject to
restrictions for safety
> reasons. I have successfully written
code
that implements this support
> while ensuring it doesn't affect
platforms with
a different assembly
> languages. Regression tests have
passed,
as have some new tests, some
> of which test modified RTL assembler
functions
Show quoted text 6 lines
that have had "inline"
> added to their list of directives.
As said before, I have a lot of concerns
against this as it opens a can
of worms hard to handle:
* using inline assembler is always the
worst solution to do something,
Show quoted text 8 lines
it normally means either:
- the compiler misses a certain feature
- the compiler is generating bad code
* intrinsics provide a much better way
to achieve exactly what this
approach aims at:
- they enable the use of all registers
as the compiler does register
allocation
- constraints on instructions (like a
certain operand needs to be a
Show quoted text 6 lines
constant) can be easily forced
Is there any advantage over intrinsics,
I missed so far?
Show quoted text 6 lines
>
> There was a previous concern about it
breaking
too much and it being
> impossible to implement on all
platforms - the
latter point may be true,
> but through the careful use of virtual
methods
within the compiler, it
> should be possible to extend the
inline support
Show quoted text 6 lines
one platform at a time
> without breaking the others.
>
> All the details, including a PDF
specification
that explains the design
> and implementation choices, a couple
of existing
tests that touch on the
> functionality, along with any new
tests,
limitations or problems found,
> can be found here:
https://bugs.freepascal.org/view.php?
id=35232
>
> I hope it proves to be insightful and
useful.
Show quoted text 8 lines
>
> Gareth aka. Kit
>
> P.S. Though this feature can be used
for
implementing intrinsics, it is
> not a direct replacement for them
because
instructions like SHUFPS
> cannot be flexibly encoded due to its
immediate
operand (i.e. it has to
> be a raw number... it can't take its
value from
a parameter).
Well, with intrinsics, this can be
easily done.