Hello, 

for CONFIG_AVR32 the macro looks like this:
#define EXPORT_FUNC(x)                                  \
        asm volatile(                                   \
                "       .globl\t" #x "\n"               \
                #x ":\n"                                \
                "       ld.w    r8, r6[%0]\n"           \
                "       ld.w    pc, r8[%1]\n"           \
                :                                       \
                : "i"(offsetof(gd_t, jt)), "i"(XF_ ##x) \
                : "r8");
if there is an implicit shift in the ld.w instructuions, then the 
ld.w r8,r6[%0] is wrong, because offsetof(gd_t, jt) is the offset in bytes.
if there is no shift, then the 
ld.w pc,r8[%1] is wrong, because the XF_ ## is not multiplied by sizeof(void*)

the syntax from the avr32 manual shows

Operation:
III. Rd ← *(Rp + (ZE(disp5) << 2));
IV. Rd ← *(Rp + (SE(disp16)));

Syntax:
III.  ld.w Rd, Rp[disp]
IV.  ld.w Rd, Rp[disp]

my interpretation is :
the assembler checks if (disp % 4 == 0) && disp <= 124 then
is uses variant III and places disp >> 2 as disp5 into the instruction.
else it uses variant IV and places disp as disp16 into the 
extension word of the instruction.


Regards
Martin

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to