[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] how to compile stik/sting stuff with gcc4

This qualifies as guru material, you knowledge of GCC is astounding

I dont envy the 32 functions that need adjustuing, but I would have no
problem doing it with those instructions

Thanks again for the Gold

I presume the resulting header or sting/stik will be made public

One last question, does "It is defined in include/compiler.h" imply
there are more changes to be made elsewhere?


2010/1/12 Vincent Rivière <vincent.riviere@freesbee.fr>:
> Miro Kropacek wrote:
>> inet.c: In function 'inet_send':
>> inet.c:137: error: asm-specifier for variable 'retv' conflicts with asm
>> clobber list
> Oh, this header is huge.
> Here are the instructions.
> The file mint/osbind.h can be used as a model.
> Example:
> #define trap_1_w(n)                                                     \
> __extension__                                                           \
> ({                                                                      \
>        register long retvalue __asm__("d0");                           \
>                                                                        \
>        __asm__ volatile                                                \
>        (                                                               \
>                "movw   %1,sp@-\n\t"                                    \
>                "trap   #1\n\t"                                         \
>                "addql  #2,sp\n\t"                                      \
>        : "=r"(retvalue)                        /* outputs */           \
>        : "g"(n)                                /* inputs  */           \
>        : __CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2"    /* clobbered
> regs */   \
>          AND_MEMORY                                                    \
>        );                                                              \
>        retvalue;                                                       \
> })
> 1) Use the __CLOBBER_RETURN("d0") macro in the clobber list when the output
> list contain a variable mapped to d0. It is the case here for the retvalue
> variable, the compiler is told to allocate it in d0. GCC 2.x requires d0 to
> be put in the clobber list, but GCC 4.x is clever enough to see it on
> output, then it fails. The macro does the right thing with every compiler.
> It is defined in include/compiler.h
> Beware, if no output variable is mapped to d0, you must use "d0" alone
> without the macro !
> 2) Look at the end of line character. "\n\t" is the standard, it produces a
> perfectly aligned assembler source code when you use gcc -S. Perfect for
> debugging. ";" like in your source is valid, too, but everything is put on a
> single line, so it is unreadable.
> It is usually better to avoid to put "\n\t" on the last line, here it is a
> bad example.
> This change is not mandatory, it is only for the readability of the
> intermediate assembler code.
> 3) Look at the multiline strings. In my example, two adjacent strings are
> automatically concatened by the compiler, that's good. In your old file, the
> string is opened at the beginning, it contains embedded newlines, then it is
> closed at the end. This causes problems to something, I don't remember well,
> if it is not GCC, it is the binutils. This should be fixed.
> 4) If you care about ColdFire, you should replace "addqw #8,sp" by "addql
> #8,sp", which does exactly the same without performance loss, and which is
> ColdFire compatible.
> 5) When the stack correction is >8, you should use "lea sp@(12),sp" instead
> of "addw #12,sp", to be both faster and ColdFire compatible.
> 6) I see "a2" is missing from the clobber lists, is it really guaranteed
> that it will never be trashed ?
> 7) The inline assembler use that horrible MIT syntax, however gas has been
> supporting the normal Motorola syntax for ages.
> Now, you have some work to do.
> --
> Vincent Rivière