> On Jun 26, 2024, at 8:54 AM, Stefan Schulze Frielinghaus 
> <stefa...@linux.ibm.com> wrote:
> 
> On Tue, Jun 25, 2024 at 01:02:39PM -0400, Paul Koning wrote:
>> 
>> 
>>> On Jun 25, 2024, at 12:04 PM, Stefan Schulze Frielinghaus 
>>> <stefa...@linux.ibm.com> wrote:
>>> 
>>> On Tue, Jun 25, 2024 at 10:03:34AM -0400, Paul Koning wrote:
>>>> 
>>>>>>> ...
>>>>>>> could be rewritten into
>>>>>>> 
>>>>>>> int test (int x, int y)
>>>>>>> {
>>>>>>> asm ("foo %0,%1,%2" : "+{r4}" (x) : "{r5}" (y), "d" (y));
>>>>>>> return x;
>>>>>>> }
>>>> 
>>>> I like this idea but I'm wondering: regular constraints specify what sort 
>>>> of value is needed, for example an int vs. a short int vs. a float.  The 
>>>> notation you've shown doesn't seem to have that aspect.
>>> 
>>> As Maciej already pointed out the type of the expression should suffice.
>>> My assumption was that an asm can deal with a value as is or its
>>> promoted value.  At least for integer values this should be fine and
>>> AFAICS is also the case for simple constraints like "r" which do not
>>> define any mode.  I've probably overseen something but which constraint
>>> differentiates between int vs short?  However, you have a good point
>>> with this and I should test this more.
>> 
>> I thought there was but I may be confused.  On the other hand, there 
>> definitely are (machine dependent) constraints that distinguish, say, float 
>> from integer registers; pdp11 is an example.  If you were to use an "a" 
>> constraint, that means a floating point register and the compiler will 
>> detect attempts to pass non-float operands ("Inconsistent operand 
>> constraints...").
>> 
>> I see that the existing "register int ..." syntax appears to check that the 
>> register is the right type for the data type given for it, so for example on 
>> pdp11, 
>> 
>>      register int ac1 asm ("ac1") = i;
>> 
>> fails ("register ... isn't suitable for data type").  I assume your new 
>> syntax would perform the same check and produce roughly the same error 
>> message.  You might verify that.  On pdp11, trying to use, for example, "r0" 
>> for a float, or "ac0" for an int, would produce that error.
> 
> Right, so far I don't error out here which I will change.  It basically
> results in bit casting floats to ints currently.

That would be bad.  For one thing, a PDP11 float doesn't fit in an integer 
register.

That also brings up another point (which applies to more mainstream targets as 
well): for data types that require multiple registers, say a register pair for 
a double length value, how is that handled?  One possible answer is to reject 
that.  Another would be to load a register pair.

This case applies to a "long int" on pdp11, or 32 bit MIPS, and probably a 
bunch of others.

        paul

Reply via email to