Is it a bug? control flow instruction of PRU does not make right comparison with negative number

51 views
Skip to first unread message

zlw...@gmail.com

unread,
Oct 30, 2017, 6:22:20 PM10/30/17
to BeagleBoard
I am trying to use QBLT to compare two numbers and found out when one number is negative, the QBLT logic does not seem make right comparison. In the following code, before QBLT, r3 =1-4 = -3, and r2 = 10, so r3 < r2, then the code should execute MOV r3, -1. However, when I run this macro, r3 is set to 1.
Anyone notices this issue? Any idea how to fix it?

.macro LOGTEST
    MOV r7, 1
    MOV r8, 4
    SUB r3, r7, r8
    MOV r2, 10
    QBLT LESS, r2, r3
    MOV r3, 10
    JMP XXX
    LESS:
      MOV r3, -1
    XXX:
.endm

Przemek Klosowski

unread,
Oct 30, 2017, 7:59:56 PM10/30/17
to BeagleBoard


On Monday, October 30, 2017 at 6:22:20 PM UTC-4, Lingwei Zhan wrote:
I am trying to use QBLT to compare two numbers and found out when one number is negative, the QBLT logic does not seem make right comparison. In the following code, before QBLT, r3 =1-4 = -3, and r2 = 10, so r3 < r2, then the code should execute MOV r3, -1. However, when I run this macro, r3 is set to 1. 
Anyone notices this issue? Any idea how to fix it?
 
I looked at the description and couldn't  find the specification, but perhaps the comparison treats the numbers as unsigned; the bit pattern of negative 2-complement number, interpreted as unsigned results in large numbers, so the comparison would come out the way you observe.

Charles Steinkuehler

unread,
Oct 31, 2017, 9:13:31 AM10/31/17
to beagl...@googlegroups.com
On 10/30/2017 4:53 PM, zlw...@gmail.com wrote:
> I am trying to use QBLT to compare two numbers and found out when one
> number is negative, the QBLT logic does not seem make right comparison. In
> the following code, before QBLT, r3 =1-4 = -3, and r2 = 10, so r3 < r2,
> then the code should execute MOV r3, -1. However, when I run this macro, r3
> is set to 1.
> Anyone notices this issue? Any idea how to fix it?

This is a known issue, the PRU supports *ONLY* unsigned integers.

Write your code properly for unsigned data types and you will not have
any problems.

--
Charles Steinkuehler
cha...@steinkuehler.net

zlw...@gmail.com

unread,
Oct 31, 2017, 11:49:35 AM10/31/17
to BeagleBoard
Thank you Charles. Is it a known issue only for control flow logic? When I use MOV command to save a negative number (MOV r1, -1), then save r1 into shared RAM, then into a txt file, I do see -1 is saved into the txt file correctly.

Henner Zeller

unread,
Oct 31, 2017, 12:33:03 PM10/31/17
to Beagle Board
On 31 October 2017 at 08:49, <zlw...@gmail.com> wrote:
> Thank you Charles. Is it a known issue only for control flow logic? When I
> use MOV command to save a negative number (MOV r1, -1), then save r1 into
> shared RAM, then into a txt file, I do see -1 is saved into the txt file
> correctly.

This always works but has nothing to do with the PRU.

You can substract a larger value from an unsigned value, which then
gets wrapped around; you can then _interpret_ the bit-pattern as a
signed value in two-complement and get the expected negative number.
This is what you did in this case.
This is just a property of how the two-complement encoding works.

-h

>
> On Tuesday, October 31, 2017 at 9:13:31 AM UTC-4, Charles Steinkuehler
> wrote:
>>
>> On 10/30/2017 4:53 PM, zlw...@gmail.com wrote:
>> > I am trying to use QBLT to compare two numbers and found out when one
>> > number is negative, the QBLT logic does not seem make right comparison.
>> > In
>> > the following code, before QBLT, r3 =1-4 = -3, and r2 = 10, so r3 < r2,
>> > then the code should execute MOV r3, -1. However, when I run this macro,
>> > r3
>> > is set to 1.
>> > Anyone notices this issue? Any idea how to fix it?
>>
>> This is a known issue, the PRU supports *ONLY* unsigned integers.
>>
>> Write your code properly for unsigned data types and you will not have
>> any problems.
>>
>> --
>> Charles Steinkuehler
>> cha...@steinkuehler.net
>
> --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to beagleboard...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/beagleboard/859b4ea7-a3a6-430d-a715-b5d24ccc6a09%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

Lingwei Zhan

unread,
Oct 31, 2017, 2:07:01 PM10/31/17
to BeagleBoard
Thank you Henner. Since we can only interpret the subtraction result correctly when we know its sign, we always need first compare a and b (assuming a and b are positive and we do a-b) to know which is greater before we do a subtraction.

lingwei
Reply all
Reply to author
Forward
0 new messages