On 12/14/2011 10:25 AM, Richard Earnshaw wrote:
> On 10/12/11 23:21, Richard Henderson wrote:
>> diff --git a/libitm/config/arm/hwcap.h b/libitm/config/arm/hwcap.h
>> new file mode 100644
>> index 0000000..16e4034
>> --- /dev/null
>> +++ b/libitm/config/arm/hwcap.h
>> +
>> +/* The following must match the kernel's <asm/procinfo.h>.  */
>> +#define HWCAP_ARM_SWP           1
> 
> All of these defines are linux-specific.  Shouldn't they be wrapped as such?

Well, we need *some* values for other targets.  Shouldn't they match, failing 
some other useful value  to put in?

> That can't be right.  The first instruction loads from your literal
> block an address difference, then your second instruction tries to use
> that as an address.

Yes, that's fixed in the followup that's been posed, wrt movw+movt.

> Why don't you just write
> 
> .macro ldaddr reg, addr
>       ldr     \reg, =(\addr - 99b + PC_OFFS)
> 99:   add     \reg, \reg, pc
> .endm

That was the first thing I tried.  Unfortunately, the assembler doesn't accept 
arbitrary expressions.  That's arguably a bug...

>> +       /* Store the VFP registers.  Don't use VFP instructions directly
>> +          because this code is used in non-VFP multilibs.  */
>> +       tst     r2, #HWCAP_ARM_VFP
>> +       it      ne
>> +       stcne   p11, cr8, [sp], {16}    /* vstmne sp, {d8-d15} */
> 
> You shouldn't rely on the conditional STC instruction not trapping if
> the condition test fails.  Conditionally NOT executing an instruction is
> implementation defined if the instruction itself is undefined.  Just
> branch round it as you've done for the other instructions below.

Fair enough.

>> +       ldm     r1, { r4-r11, sp, pc }
> 
> Isn't this buffer on the stack?

No.  We passed the buffer in on the stack, but we subsequently copied it 
elsewhere.


r~

Reply via email to