# [LLVMdev] Simple question on sign

sam parker S.Parker3 at lboro.ac.uk
Thu Feb 23 07:23:00 PST 2012

```Hi James,

So does this mean if the instruction could set the overflow flag, the
instruction should not have [(set ... )] in it's pattern, i see this is the
difference in instruction description for the mips case.

I'm wondering how llvm knows when to use certain compare instructions such
as SETNE or SETUNE? And for sign or zero extending loads? I can see the
PatFrags described and the LoadExtType enum defined, and the use of zext and
sext to differentiate what containers the values are being loaded into in
the IR.

Basically I'm trying to describe patterns for automatically selecting
between various multiplication instructions:

#define MULL(t,s1,s2) t = (s1) * INT16(s2)
#define MULLU(t,s1,s2) t = (s1) * UINT16(s2)
#define MULH(t,s1,s2) t = (s1) * INT16((s2) >> 16)
#define MULHU(t,s1,s2) t = (s1) * UINT16((s2) >> 16)
#define MULHS(t,s1,s2) t = ((s1) * UINT16((s2) >> 16)) << 16
#define MULLL(t,s1,s2)  t = INT16(s1) * INT16(s2)
#define MULLLU(t,s1,s2) t = UINT16(s1) * UINT16(s2)
#define MULLH(t,s1,s2)  t = INT16(s1) * INT16((s2) >> 16)
#define MULLHU(t,s1,s2) t = UINT16(s1) * UINT16((s2) >> 16)
#define MULHH(t,s1,s2)  t = INT16((s1) >> 16) * INT16((s2) >> 16)
#define MULHHU(t,s1,s2) t = UINT16((s1) >> 16) * UINT16((s2) >> 16)

I'm guessing, from what I've seen, I may just need to check in my Pats
whether a zext or sext has been used on the value to be operated on..?

Thanks,
Sam

James Molloy-3 wrote:
>
> Hi Sam,
>
> I am not a MIPS expert by any means, so YMMV, but: MIPS addu only differs
> to
> "add" in its (non)setting of the overflow flag. Because LLVM doesn't
> provide
> a way via the IR to access the overflow flag, a special notation isn't
> required in the IR to distinguish the two operations.
>
> Do you have another example?
>
> Cheers,
>
> James
>
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
> Behalf Of sam parker
> Sent: 23 February 2012 10:36
> To: llvmdev at cs.uiuc.edu
> Subject: Re: [LLVMdev] Simple question on sign
>
>
> Thanks for the replies guys but I think I should have phrased my question
> better... looking at the Mips backend there are machine instructions that
> operate on signed and unsigned data, such as add and addu. And like Mips,
> I
> need to specify unsigned specific instructions, so how do these get chosen
> between if the LLVM IR does not carry type data? A very general point in
> the
> right direction is all i need and would most appreciate it. sorry if i'm
> being dense.
>
> sam
>
>
> James Molloy-3 wrote:
>>
>> Hi Sam,
>>
>> Whereas most languages track signedness on the variable/value level, LLVM
>> IR
>> takes a more machine-like approach of having the sign apply to the
>> instruction rather than the value.
>>
>> It is therefore the frontend (or whatever is initially producing the LLVM
>> IR) that should know whether an operation should be signed or unsigned.
>>
>> Hopefully that makes sense,
>>
>> Cheers,
>>
>> James
>>
>> -----Original Message-----
>> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
>> Behalf Of sam parker
>> Sent: 23 February 2012 09:45
>> To: llvmdev at cs.uiuc.edu
>> Subject: Re: [LLVMdev] Simple question on sign
>>
>>
>> how does llvm decide when to use unsigned instructions then? such as
>> unsigned
>> adds and loads? I'm trying to describe some multiply shift ops and
>> getting
>> a
>> bit stuck differentiating between signed and unsigned.
>>
>> sam
>>
>>
>> Eli Friedman-2 wrote:
>>>
>>> On Wed, Feb 22, 2012 at 4:28 PM, Ryan Taylor <ryta1203 at gmail.com> wrote:
>>> On Wed, Feb 22, 2012 at 4:28 PM, Ryan Taylor <ryta1203 at gmail.com> wrote:
>>>> How do you determine if a shift is signed or not?
>>>>
>>>> ashr = always signed?
>>>
>>> Essentially, yes.
>>>
>>>> lshr = always unsigned?
>>>
>>> Essentially, yes.
>>>
>>>> shl = always signed?
>>>
>>> Signed left shift and unsigned left shift are both shl.
>>>
>>> http://llvm.org/docs/LangRef.html#i_shl describes the semantics of
>>> shifts.
>>>
>>>> The CmpInst has the "isSigned()" function, but it appears that every
>>>> other
>>>> Instruction I've looked at doesn't seem to have this.
>>>
>>> There isn't an isSigned() function because the query doesn't really
>>> make sense.  LLVM IR doesn't in general track whether a value is
>>> signed or unsigned.
>>>
>>> -Eli
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>
>>
>> --
>> View this message in context:
>> http://old.nabble.com/Simple-question-on-sign-tp33375005p33376706.html
>> Sent from the LLVM - Dev mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>
> --
> View this message in context:
> http://old.nabble.com/Simple-question-on-sign-tp33375005p33376946.html
> Sent from the LLVM - Dev mailing list archive at Nabble.com.
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>

--
View this message in context: http://old.nabble.com/Simple-question-on-sign-tp33375005p33378554.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.

```