satsubr


Subtracts reverse saturated.

[Syntax]

-

satsubr reg1, reg2

-

satsubr imm, reg2

 

The following can be specified for imm:

-

Absolute expression having a value of up to 32 bits

-

Relative expression

[Function]

-

Syntax "satsubr reg1, reg2"

Subtracts the value of the register specified by the second operand from the value of the register specified by the first operand, and stores the result in the register specified by the second operand. If the result exceeds the maximum positive value of 0x7FFFFFFF, however, 0x7FFFFFFF is stored in the register specified by the second operand. Likewise, if the result exceeds the maximum negative value of 0x80000000, 0x80000000 is stored in the register specified by the second operand. In both cases, the SAT flag is set to 1.

-

Syntax "satsubr imm, reg2"

Subtracts the value of the register specified by the second operand from the value of the absolute expression or relative expression specified by the first operand, and stores the result in the register specified by the second operand. If the result exceeds the maximum positive value of 0x7FFFFFFF, however, 0x7FFFFFFF is stored in the register specified by the second operand. Likewise, if the result exceeds the maximum negative value of 0x80000000, 0x80000000 is stored in the register specified by the second operand. In both cases, the SAT flag is set to 1.

[Description]

-

If the instruction is executed in syntax "satsubr reg1, reg2", the assembler generates one satsubr machine instruction.

-

If the instruction is executed in syntax "satsubr imm, reg2", the assembler executes instruction expansion to generate one or more machine instructionsNote.

(a)

0

satsubr 0, reg
satsubr r0, reg

(b)

Absolute expression having a value of other than 0 within the range of -16 to +15

satsubr imm5, reg
mov     imm5, r1
satsubr r1, reg

(c)

Absolute expression exceeding the range of -16 to +15, but within the range of -32,768 to +32,767

satsubr imm16, reg
movea   imm16, r0, r1
satsubr r1, reg

(d)

Absolute expression having a value exceeding the range of -32,768 to +32,767

If all the lower 16 bits of the value of imm are 0

satsubr imm, reg
movhi   HIGHW(imm), r0, r1
satsubr r1, reg

Else

satsubr imm, reg
mov     imm, r1
satsubr r1, reg

(e)

Relative expression having !label or %label, or that having $label for a label having a definition in the sdata/sbss-attribute section

satsubr !label, reg
movea   !label, r0, r1
satsubr r1, reg
satsubr %label, reg
movea   %label, r0, r1
satsubr r1, reg
satsubr $label, reg
movea   $label, r0, r1
satsubr r1, reg

(f)

Relative expression having #label or label, or that having $label for a label having no definition in the sdata/sbss-attribute section

satsubr #label, reg
mov     #label, r1
satsubr r1, reg
satsubr label, reg
mov     label, r1
satsubr r1, reg
satsubr $label, reg
mov     $label, r1
satsubr r1, reg

Note

The satsubr machine instruction does not take an immediate value as an operand.

[Flag]

CY

1 if a borrow occurs from MSB (Most Significant Bit), 0 if not

OV

1 if Integer-Overflow occurs, 0 if not

S

1 if the result is negative, 0 if not

Z

1 if the result is 0, 0 if not

SAT

1 if OV = 1, - if not

[Caution]

-

If r0 is specified by the second operand, the assembler outputs the following message and stops assembling.

E0550240 : Illegal operand (cannot use r0 as destination in RH850 mode).