[llvm-commits] [llvm] r123424 - in /llvm/trunk: include/llvm/Object/MachOFormat.h lib/MC/ELFObjectWriter.cpp lib/MC/MachObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp lib/Target/ARM/ARMFixupKinds.h lib/Target/ARM/ARMMCCodeEmitter.cpp test/MC/A
Evan Cheng
evan.cheng at apple.com
Tue Jan 18 14:48:05 PST 2011
On Jan 18, 2011, at 12:22 PM, Jason Kim wrote:
> On Fri, Jan 14, 2011 at 3:38 PM, Evan Cheng <evan.cheng at apple.com> wrote:
>>
>> On Jan 14, 2011, at 12:20 PM, Jason Kim wrote:
>>
>>
>> Hi Evan,
>>
>> FYI, the movt hi16 fixup you put in does not match the output of GNU as -
>> Let me look into this and figure out why. I'll reply soon.
>>
>> -jason
>>
>>
>> Interesting. That's probably due to this:
>>
>> case ARM::fixup_arm_movt_hi16:
>>
>> - case ARM::fixup_arm_movw_lo16:
>>
>> case ARM::fixup_arm_movt_hi16_pcrel:
>>
>> + Value >>= 16;
>>
>> + // Fallthrough
>>
>> + case ARM::fixup_arm_movw_lo16:
>>
>> case ARM::fixup_arm_movw_lo16_pcrel: {
>>
>> unsigned Hi4 = (Value & 0xF000) >> 12;
>>
>> unsigned Lo12 = Value & 0x0FFF;
>>
>> @@ -168,6 +175,26 @@
>>
>> Value = (Hi4 << 16) | (Lo12);
>>
>> return Value;
>>
>> }
>>
>> Notice the Value is shifted down 16 bits for movt. I'm fairly sure this is
>> right, at least for Darwin. It's possible there is a bug elsewhere.
>> Evan
>>
>>
>
> Hmm, I see at least one problem that was not caught earlier -
>
> 1) movw/movt paired with :lower16:/:upper16:
> 2) movw/movt NOT paired with a :lower16:/:upper16:
>
> The handling has to be different for these two cases
> in case 2, the constant will already be a 16bit value
> in case 1, the constant will need to be right shifted (during? before? fixup)
>
> It seems like this needs to be handled before the fixup actually happens.
>
> Does Darwin assembler require :lower16:/:upper16: when using movw/movt?
I believe so. Kevin?
Evan
>
> -jason
More information about the llvm-commits
mailing list