fx9860-emulator-playground/scripts/raw_instructions.txt

4055 lines
130 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Format Operation Instruction Code Cycle T Bit
ADD Rm,Rn Rn + Rm → Rn 0011nnnnmmmm1100 1 —
ADD #imm,Rn Rn + imm → Rn 0111nnnniiiiiiii 1 —
Description: This instruction adds together the contents of general registers Rn and Rm and stores
the result in Rn.
8-bit immediate data can also be added to the contents of general register Rn.
8-bit immediate data is sign-extended to 32 bits, allowing use in decrement operations.
Notes: None
Operation:
ADD(long m, long n) /* ADD Rm,Rn */
{
R[n] += R[m];
PC += 2;
}
ADDI(long i, long n) /* ADD #imm,Rn */
{
if ((i&0x80)==0)
R[n] += (0x000000FF & (long)i);
else R[n] += (0xFFFFFF00 | (long)i);
PC += 2;
}
Example:
ADD R0,R1 ;Before execution R0 = H'7FFFFFFF, R1 = H'00000001
;After execution R1 = H'80000000
ADD #H'01,R2 ;Before execution R2 = H'00000000
;After execution R2 = H'00000001
ADD #H'FE,R3 ;Before execution R3 = H'00000001
;After execution R3 = H'FFFFFFFF
Rev. 1.50, 10/04, page 295 of 610
11.1.2 ADDC (Add with Carry): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
ADDC Rm,Rn Rn + Rm + T → Rn,
carry → T
0011nnnnmmmm1110 1 Carry
Description: This instruction adds together the contents of general registers Rn and Rm and the T
bit, and stores the result in Rn. A carry resulting from the operation is reflected in the T bit. This
instruction is used for additions exceeding 32 bits.
Notes: None
Operation:
ADDC(long m, long n) /* ADDC Rm,Rn */
{
unsigned long tmp0,tmp1;
tmp1 = R[n] + R[m];
tmp0 = R[n];
R[n] = tmp1 + T;
if (tmp0>tmp1) T = 1;
else T = 0;
if (tmp1>R[n]) T = 1;
PC += 2;
}
Example:
CLRT ;R0:R1(64 bits) + R2:R3(64 bits) = R0:R1(64 bits)
ADDC R3,R1 ;Before execution T = 0, R1 = H'00000001, R3 = H'FFFFFFFF
;After execution T = 1, R1 = H'00000000
ADDC R2,R0 ;Before execution T = 1, R0 = H'00000000, R2 = H'00000000
;After execution T = 0, R0 = H'00000001
Rev. 1.50, 10/04, page 296 of 610
11.1.3 ADDV (Add with (V flag) Overflow Check): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
ADDV Rm,Rn Rn + Rm → Rn,
overflow → T
0011nnnnmmmm1111 1 Overflow
Description:This instruction adds together the contents of general registers Rn and Rm and stores
the result in Rn. If overflow occurs, the T bit is set.
Notes: None
Operation:
ADDV(long m, long n) /* ADDV Rm,Rn */
{
long dest,src,ans;
if ((long)R[n]>=0) dest = 0;
else dest = 1;
if ((long)R[m]>=0) src = 0;
else src = 1;
src += dest;
R[n] += R[m];
if ((long)R[n]>=0) ans = 0;
else ans = 1;
ans += dest;
if (src==0 || src==2) {
if (ans==1) T = 1;
else T = 0;
}
else T = 0;
PC += 2;
}
Rev. 1.50, 10/04, page 297 of 610
Example:
ADDV R0,R1 ;Before execution R0 = H'00000001, R1 = H'7FFFFFFE, T=0
;After execution R1 = H'7FFFFFFF, T=0
ADDV R0,R1 ;Before execution R0 = H'00000002, R1 = H'7FFFFFFE, T=0
;After execution R1 = H'80000000, T=1
Rev. 1.50, 10/04, page 298 of 610
11.1.4 AND (AND Logical): Logical Instruction
Format Operation Instruction Code Cycle T Bit
AND Rm,Rn Rn & Rm → Rn 0010nnnnmmmm1001 1 —
AND #imm,R0 R0 & imm → R0 11001001iiiiiiii 1 —
AND.B #imm,@(R0,GBR) (R0 + GBR) & imm →
(R0 + GBR)
11001101iiiiiiii 3 —
Description:This instruction ANDs the contents of general registers Rn and Rm and stores the
result in Rn.
This instruction can be used to AND general register R0 contents with zero-extended 8-bit
immediate data, or, in indexed GBR indirect addressing mode, to AND 8-bit memory with 8-bit
immediate data.
Notes: With AND #imm,R0, the upper 24 bits of R0 are always cleared as a result of the
operation.
Operation:
AND(long m, long n) /* AND Rm,Rn */
{
R[n] &= R[m];
PC += 2;
}
ANDI(long i) /* AND #imm,R0 */
{
R[0] &= (0x000000FF & (long)i);
PC += 2;
}
ANDM(long i) /* AND.B #imm,@(R0,GBR) */
{
long temp;
temp = (long)Read_Byte(GBR+R[0]);
Rev. 1.50, 10/04, page 299 of 610
temp &= (0x000000FF & (long)i);
Write_Byte(GBR+R[0],temp);
PC += 2;
}
Example:
AND R0,R1 ;Before execution R0 = H'AAAAAAAA, R1=H'55555555
;After execution R1 = H'00000000
AND #H'0F,R0 ;Before execution R0 = H'FFFFFFFF
;After execution R0 = H'0000000F
AND.B #H'80,@(R0,GBR) ;Before execution (R0,GBR) = H'A5
;After execution (R0,GBR) = H'80
Possible Exceptions: Exceptions may occur when AND.B instruction is executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Exceptions are checked taking a data access by this instruction as a byte load and a byte store.
Rev. 1.50, 10/04, page 300 of 610
11.1.5 BF (Branch if False): Branch Instruction
Format Operation Instruction Code Cycle T Bit
BF label If T = 0
PC + 4 + disp × 2 → PC
If T = 1, nop
10001011dddddddd 1 —
Description: This is a conditional branch instruction that references the T bit. The branch is taken
if T = 0, and not taken if T = 1. The branch destination is address (PC + 4 + displacement × 2).
The PC source value is the BF instruction address. As the 8-bit displacement is multiplied by two
after sign-extension, the branch destination can be located in the range from 256 to +254 bytes
from the BF instruction.
Notes: If the branch destination cannot be reached, the branch must be handled by using BF in
combination with a BRA or JMP instruction, for example.
Operation:
BF(int d) /* BF disp */
{
int disp;
if ((d&0x80)==0)
disp = (0x000000FF & d);
else disp = (0xFFFFFF00 | d);
if (T==0)
PC = PC+4+(disp<<1);
else PC += 2;
}
Example:
CLRT ;Normally T = 0
BT TRGET_T ;T = 0, so branch is not taken.
BF TRGET_F ;T = 0, so branch to TRGET_F.
NOP ;
NOP ;
TRGET_F: ;← BF instruction branch destination
Rev. 1.50, 10/04, page 301 of 610
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 302 of 610
11.1.6 BF/S (Branch if False with Delay Slot): Branch Instruction
Format Operation Instruction Code Cycle T Bit
BF/S label If T = 0,
PC + 4 + disp × 2 → PC
If T = 1, nop
10001111dddddddd 1 —
Description: This is a delayed conditional branch instruction that references the T bit. If T = 1, the
next instruction is executed and the branch is not taken. If T = 0, the branch is taken after
execution of the next instruction.
The branch destination is address (PC + 4 + displacement × 2). The PC source value is the BF/S
instruction address. As the 8-bit displacement is multiplied by two after sign-extension, the branch
destination can be located in the range from 256 to +254 bytes from the BF/S instruction.
Notes: As this is a delayed branch instruction, when the branch condition is satisfied, the
instruction following this instruction is executed before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction.
If the following instruction is a branch instruction, it is identified as a slot illegal instruction.
If this instruction is located in the delay slot immediately following a delayed branch instruction, it
is identified as a slot illegal instruction.
If the branch destination cannot be reached, the branch must be handled by using BF/S in
combination with a BRA or JMP instruction, for example.
Rev. 1.50, 10/04, page 303 of 610
Operation:
BFS(int d) /* BFS disp */
{
int disp;
unsigned int temp;
temp = PC;
if ((d&0x80)==0)
disp = (0x000000FF & d);
else disp = (0xFFFFFF00 | d);
if (T==0)
PC = PC + 4 + (disp<<1);
else PC += 4;
Delay_Slot(temp+2);
}
Example:
CLRT ;Normally T = 0
BT/S TRGET_T ;T = 0, so branch is not taken.
NOP ;
BF/S TRGET_F ;T = 0, so branch to TRGET.
ADD R0,R1 ;Executed before branch.
NOP ;
TRGET_F: ;← BF/S instruction branch destination
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 304 of 610
11.1.7 BRA (Branch): Branch Instruction
Format Operation Instruction Code Cycle T Bit
BRA label PC + 4 + disp × 2 → PC 1010dddddddddddd 1 —
Description: This is an unconditional branch instruction. The branch destination is address (PC +
4 + displacement × 2). The PC source value is the BRA instruction address. As the 12-bit
displacement is multiplied by two after sign-extension, the branch destination can be located in the
range from 4096 to +4094 bytes from the BRA instruction. If the branch destination cannot be
reached, this branch can be performed with a JMP instruction.
Notes: As this is a delayed branch instruction, the instruction following this instruction is executed
before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. If the following
instruction is a branch instruction, it is identified as a slot illegal instruction.
Operation:
BRA(int d) /* BRA disp */
{
int disp;
unsigned int temp;
temp = PC;
if ((d&0x800)==0)
disp = (0x00000FFF & d);
else disp = (0xFFFFF000 | d);
PC = PC + 4 + (disp<<1);
Delay_Slot(temp+2);
}
Example:
BRA TRGET ;Branch to TRGET.
ADD R0,R1 ;ADD executed before branch.
NOP ;
TRGET: ;← BRA instruction branch destination
Rev. 1.50, 10/04, page 305 of 610
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 306 of 610
11.1.8 BRAF (Branch Far): Branch Instruction (Delayed Branch Instruction)
Format Operation Instruction Code Cycle T Bit
BRAF Rn PC + 4 + Rn → PC 0000nnnn00100011 1 —
Description: This is an unconditional branch instruction. The branch destination is address (PC +
4 + Rn). The branch destination address is the result of adding 4 plus the 32-bit contents of general
register Rn to PC.
Notes: As this is a delayed branch instruction, the instruction following this instruction is executed
before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. If the following
instruction is a branch instruction, it is identified as a slot illegal instruction.
Operation:
BRAF(int n) /* BRAF Rn */
{
unsigned int temp;
temp = PC;
PC = PC + 4 + R[n];
Delay_Slot(temp+2);
}
Example:
MOV.L #(TRGET-BRAF_PC),R0 ;Set displacement.
BRAF R0 ;Branch to TRGET.
ADD R0,R1 ;ADD executed before branch.
BRAF_PC: ;
NOP
TRGET: ;← BRAF instruction branch destination
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 307 of 610
11.1.9 BT (Branch if True): Branch Instruction
Format Operation Instruction Code Cycle T Bit
BT label If T = 1
PC + 4 + disp × 2 → PC
If T = 0, nop
10001001dddddddd 1 —
Description: This is a conditional branch instruction that references the T bit. The branch is taken
if T = 1, and not taken if T = 0.
The branch destination is address (PC + 4 + displacement × 2). The PC source value is the BT
instruction address. As the 8-bit displacement is multiplied by two after sign-extension, the branch
destination can be located in the range from 256 to +254 bytes from the BT instruction.
Notes: If the branch destination cannot be reached, the branch must be handled by using BT in
combination with a BRA or JMP instruction, for example.
Operation:
BT(int d) /* BT disp */
{
int disp;
if ((d&0x80)==0)
disp = (0x000000FF & d);
else disp = (0xFFFFFF00 | d);
if (T==1)
PC = PC + 4 + (disp<<1);
else PC += 2;
}
Example:
SETT ;Normally T = 1
BF TRGET_F ;T = 1, so branch is not taken.
BT TRGET_T ;T = 1, so branch to TRGET_T.
NOP ;
NOP ;
TRGET_T: ;← BT instruction branch destination
Rev. 1.50, 10/04, page 308 of 610
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 309 of 610
11.1.10 BT/S (Branch if True with Delay Slot): Branch Instruction
Format Operation Instruction Code Cycle T Bit
BT/S label If T = 1,
PC + 4 + disp × 2 → PC
If T = 0, nop
10001101dddddddd 1 —
Description: This is a conditional branch instruction that references the T bit. The branch is taken
if T = 1, and not taken if T = 0.
The PC source value is the BT/S instruction address. As the 8-bit displacement is multiplied by
two after sign-extension, the branch destination can be located in the range from 256 to +254
bytes from the BT/S instruction.
Notes: As this is a delayed branch instruction, when the branch condition is satisfied, the
instruction following this instruction is executed before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction.
If the following instruction is a branch instruction, it is identified as a slot illegal instruction.
If the branch destination cannot be reached, the branch must be handled by using BT/S in
combination with a BRA or JMP instruction, for example.
Operation:
BTS(int d) /* BTS disp */
{
int disp;
unsigned temp;
temp = PC;
if ((d&0x80)==0)
disp = (0x000000FF & d);
else disp = (0xFFFFFF00 | d);
if (T==1)
PC = PC + 4 + (disp<<1);
else PC += 4;
Delay_Slot(temp+2);
}
Rev. 1.50, 10/04, page 310 of 610
Example:
SETT ;Normally T = 1
BF/S TRGET_F ;T = 1, so branch is not taken.
NOP ;
BT/S TRGET_T ;T = 1, so branch to TRGET_T.
ADD R0,R1 ;Executed before branch.
NOP ;
TRGET_T: ;← BT/S instruction branch destination
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 311 of 610
11.1.11 CLRMAC (Clear MAC Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
CLRMAC 0 → MACH, MACL 0000000000101000 1 —
Description: This instruction clears the MACH and MACL registers.
Notes: None
Operation:
CLRMAC( ) /* CLRMAC */
{
MACH = 0;
MACL = 0;
PC += 2;
}
Example:
CLRMAC ;Clear MAC register to initialize.
MAC.W @R0+,@R1+ ;Multiply-and-accumulate operation
MAC.W @R0+,@R1+ ;
Rev. 1.50, 10/04, page 312 of 610
11.1.12 CLRS (Clear S Bit): System Control Instruction
Format Operation Instruction Code Cycle T Bit
CLRS 0 → S 0000000001001000 1 —
Description: This instruction clears the S bit to 0.
Notes: None
Operation:
CLRS( ) /* CLRS */
{
S = 0;
PC += 2;
}
Example:
CLRS ;Before execution S = 1
;After execution S = 0
Rev. 1.50, 10/04, page 313 of 610
11.1.13 CLRT (Clear T Bit): System Control Instruction
Format Operation Instruction Code Cycle T Bit
CLRT 0 → T 0000000000001000 1 0
Description: This instruction clears the T bit.
Notes: None
Operation:
CLRT( ) /* CLRT */
{
T = 0;
PC += 2;
}
Example:
CLRT ;Before execution T = 1
;After execution T = 0
Rev. 1.50, 10/04, page 314 of 610
11.1.14 CMP/cond (Compare Conditionally): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
CMP/EQ Rm,Rn If Rn = Rm, 1 → T
Otherwise, 0 → T
0011nnnnmmmm0000 1 Result of
comparison
CMP/GE Rm,Rn If Rn ≥ Rm, signed, 1 → T
Otherwise, 0 → T
0011nnnnmmmm0011 1 Result of
comparison
CMP/GT Rm,Rn If Rn > Rm, signed, 1 → T
Otherwise, 0 → T
0011nnnnmmmm0111 1 Result of
comparison
CMP/HI Rm,Rn If Rn > Rm, unsigned, 1 → T
Otherwise, 0 → T
0011nnnnmmmm0110 1 Result of
comparison
CMP/HS Rm,Rn If Rn ≥ Rm, unsigned, 1 → T
Otherwise, 0 → T
0011nnnnmmmm0010 1 Result of
comparison
CMP/PL Rn If Rn > 0, 1 → T
Otherwise, 0 → T
0100nnnn00010101 1 Result of
comparison
CMP/PZ Rn If Rn ≥ 0, 1 → T
Otherwise, 0 → T
0100nnnn00010001 1 Result of
comparison
CMP/STR Rm,Rn If any bytes are equal, 1 → T
Otherwise, 0 → T
0010nnnnmmmm1100 1 Result of
comparison
CMP/EQ #imm,R0 If R0 = imm, 1 → T
Otherwise, 0 → T
10001000iiiiiiii 1 Result of
comparison
Description: This instruction compares general registers Rn and Rm, and sets the T bit if the
specified condition (cond) is true. If the condition is false, the T bit is cleared. The contents of Rn
are not changed. Nine conditions can be specified. For the two conditions PZ and PL, Rn is
compared with 0.
With the EQ condition, sign-extended 8-bit immediate data can be compared with R0. The
contents of R0 are not changed.
Rev. 1.50, 10/04, page 315 of 610
Mnemonic Description
CMP/EQ Rm,Rn If Rn = Rm, T = 1
CMP/GE Rm,Rn If Rn ≥ Rm as signed values, T = 1
CMP/GT Rm,Rn If Rn > Rm as signed values, T = 1
CMP/HI Rm,Rn If Rn > Rm as unsigned values, T = 1
CMP/HS Rm,Rn If Rn ≥ Rm as unsigned values, T = 1
CMP/PL Rn If Rn > 0, T = 1
CMP/PZ Rn If Rn ≥ 0, T = 1
CMP/STR Rm,Rn If any bytes are equal, T = 1
CMP/EQ #imm,R0 If R0 = imm, T = 1
Notes: None
Operation:
CMPEQ(long m, long n) /* CMP_EQ Rm,Rn */
{
if (R[n]==R[m]) T = 1;
else T = 0;
PC += 2;
}
CMPGE(long m, long n) /* CMP_GE Rm,Rn */
{
if ((long)R[n]>=(long)R[m]) T = 1;
else T = 0;
PC += 2;
}
CMPGT(long m, long n) /* CMP_GT Rm,Rn */
{
if ((long)R[n]>(long)R[m]) T = 1;
else T = 0;
PC += 2;
}
Rev. 1.50, 10/04, page 316 of 610
CMPHI(long m, long n) /* CMP_HI Rm,Rn */
{
if ((unsigned long)R[n]>(unsigned long)R[m]) T = 1;
else T = 0;
PC += 2;
}
CMPHS(long m, long n) /* CMP_HS Rm,Rn */
{
if ((unsigned long)R[n]>=(unsigned long)R[m]) T = 1;
else T = 0;
PC += 2;
}
CMPPL(long n) /* CMP_PL Rn */
{
if ((long)R[n]>0) T = 1;
else T = 0;
PC += 2;
}
CMPPZ(long n) /* CMP_PZ Rn */
{
if ((long)R[n]>=0) T = 1;
else T = 0;
PC += 2;
}
Rev. 1.50, 10/04, page 317 of 610
CMPSTR(long m, long n) /* CMP_STR Rm,Rn */
{
unsigned long temp;
long HH,HL,LH,LL;
temp=R[n]^R[m];
HH = (temp & 0xFF000000) >> 24;
HL = (temp & 0x00FF0000) >> 16;
LH = (temp & 0x0000FF00) >> 8;
LL = temp & 0x000000FF;
HH = HH && HL && LH && LL;
if (HH==0) T = 1;
else T = 0;
PC += 2;
}
CMPIM(long i) /* CMP_EQ #imm,R0 */
{
long imm;
if ((i&0x80)==0) imm=(0x000000FF & (long) i);
else imm=(0xFFFFFF00 | (long) i);
if (R[0]==imm) T = 1;
else T = 0;
PC += 2;
}
Example:
CMP/GE R0,R1 ;R0 = H'7FFFFFFF, R1 = H'80000000
BT TRGET_T ;T = 0, so branch is not taken.
CMP/HS R0,R1 ;R0 = H'7FFFFFFF, R1 = H'80000000
BT TRGET_T ;T = 1, so branch is taken.
CMP/STR R2,R3 ;R2 = "ABCD", R3 = "XYCZ"
BT TRGET_T ;T = 1, so branch is taken.
Rev. 1.50, 10/04, page 318 of 610
11.1.15 DIV0S (Divide (Step 0) as Signed): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DIV0S Rm,Rn MSB of Rn → Q,
MSB of Rm → M,
M^Q → T
0010nnnnmmmm0111 1 Result of
calculation
Description: This instruction performs initial settings for signed division. This instruction is
followed by a DIV1 instruction that executes 1-digit division, for example, and repeated divisions
are executed to find the quotient. See the description of the DIV1 instruction for details.
Notes: None
Operation:
DIV0S(long m, long n) /* DIV0S Rm,Rn */
{
if ((R[n] & 0x80000000)==0) Q = 0;
else Q = 1;
if ((R[m] & 0x80000000)==0) M = 0;
else M = 1;
T = !(M==Q);
PC += 2;
}
Example:
See the examples for the DIV1 instruction.
Rev. 1.50, 10/04, page 319 of 610
11.1.16 DIV0U (Divide (Step 0) as Unsigned): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DIV0U 0 → M/Q/T 0000000000011001 1 0
Description: This instruction performs initial settings for unsigned division. This instruction is
followed by a DIV1 instruction that executes 1-digit division, for example, and repeated divisions
are executed to find the quotient. See the description of the DIV1 instruction for details.
Notes: None
Operation:
DIV0U( ) /* DIV0U */
{
M = Q = T = 0;
PC += 2;
}
Example:
See the examples for the DIV1 instruction.
Rev. 1.50, 10/04, page 320 of 610
11.1.17 DIV1 (Divide 1 Step): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DIV1 Rm,Rn 1-step division
(Rn ÷ Rm)
0011nnnnmmmm0100 1 Result of
calculation
Description: This instruction performs 1-digit division (1-step division) of the 32-bit contents of
general register Rn (dividend) by the contents of Rm (divisor). The quotient is obtained by
repeated execution of this instruction alone or in combination with other instructions. The
specified registers and the M, Q, and T bits must not be modified during these repeated
executions.
In 1-step division, the dividend is shifted 1 bit to the left, the divisor is subtracted from this, and
the quotient bit is reflected in the Q bit according to whether the result is positive or negative.
The remainder can be found as follows after first finding the quotient using the DIV1 instruction:
(Remainder) = (dividend) (divisor) × (quotient)
Detection of division by zero or overflow is not provided. Check for division by zero and overflow
division before executing the division. A remainder operation is not provided. Find the remainder
by finding the product of the divisor and the obtained quotient, and subtracting this value from the
dividend.
Initial settings should first be made with the DIV0S or DIV0U instruction. DIV1 is executed once
for each bit of the divisor. If a quotient of more than 17 bits is required, place an ROTCL
instruction before the DIV1 instruction. See the examples for details of the division sequence.
Notes: None
Rev. 1.50, 10/04, page 321 of 610
Operation:
DIV1(long m, long n) /* DIV1 Rm,Rn */
{
unsigned long tmp0, tmp2;
unsigned char old_q, tmp1;
old_q = Q;
Q = (unsigned char)((0x80000000 & R[n])!=0);
tmp2 = R[m];
R[n] <<= 1;
R[n] |= (unsigned long)T;
switch(old_q){
case 0:switch(M){
case 0:tmp0 = R[n];
R[n] -= tmp2;
tmp1 = (R[n]>tmp0);
switch(Q){
case 0:Q = tmp1;
break;
case 1:Q = (unsigned char)(tmp1==0);
break;
}
break;
case 1:tmp0 = R[n];
R[n] += tmp2;
tmp1 = (R[n]<tmp0);
switch(Q){
case 0:Q = (unsigned char)(tmp1==0);
break;
case 1:Q = tmp1;
break;
}
break;
}
Rev. 1.50, 10/04, page 322 of 610
break;
case 1:switch(M){
case 0:tmp0 = R[n];
R[n] += tmp2;
tmp1 = (R[n]<tmp0);
switch(Q){
case 0:Q = tmp1;
break;
case 1:Q = (unsigned char)(tmp1==0);
break;
}
break;
case 1:tmp0 = R[n];
R[n] -= tmp2;
tmp1 = (R[n]>tmp0);
switch(Q){
case 0:Q = (unsigned char)(tmp1==0);
break;
case 1:Q = tmp1;
break;
}
break;
}
break;
}
T = (Q==M);
PC += 2;
}
Rev. 1.50, 10/04, page 323 of 610
Example 1:
;R1 (32 bits) ÷ R0 (16 bits) = R1 (16 bits); unsigned
SHLL16 R0 ;Set divisor in upper 16 bits, clear lower 16 bits to 0
TST R0,R0 ;Check for division by zero
BT ZERO_DIV ;
CMP/HS R0,R1 ;Check for overflow
BT OVER_DIV ;
DIV0U ;Flag initialization
.arepeat 16 ;
DIV1 R0,R1 ;Repeat 16 times
.aendr ;
ROTCL R1 ;
EXTU.W R1,R1 ;R1 = quotient
Example 2:
; R1:R2 (64 bits) ÷ R0 (32 bits) = R2 (32 bits); unsigned
TST R0,R0 ;Check for division by zero
BT ZERO_DIV ;
CMP/HS R0,R1 ;Check for overflow
BT OVER_DIV ;
DIV0U ;Flag initialization
.arepeat 32 ;
ROTCL R2 ;Repeat 32 times
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2 = quotient
Rev. 1.50, 10/04, page 324 of 610
Example 3:
;R1 (16 bits) ÷ R0 (16 bits) = R1 (16 bits); signed
SHLL16 R0 ;Set divisor in upper 16 bits, clear lower 16 bits to 0
EXTS.W R1,R1 ;Dividend sign-extended to 32 bits
XOR R2,R2 ;R2 = 0
MOV R1,R3 ;
ROTCL R3 ;
SUBC R2,R1 ;If dividend is negative, subtract 1
DIV0S R0,R1 ;Flag initialization
.arepeat 16 ;
DIV1 R0,R1 ;Repeat 16 times
.aendr ;
EXTS.W R1,R1 ;
ROTCL R1 ;R1 = quotient (one's complement notation)
ADDC R2,R1 ;If MSB of quotient is 1, add 1 to convert to two's complement notation
EXTS.W R1,R1 ;R1 = quotient (two's complement notation)
Example 4:
;R2 (32 bits) ÷ R0 (32 bits) = R2 (32 bits); signed
MOV R2,R3 ;
ROTCL R3 ;
SUBC R1,R1 ;Dividend sign-extended to 64 bits (R1:R2)
XOR R3,R3 ;R3 = 0
SUBC R3,R2 ;If dividend is negative, subtract 1 to convert to one's complement notation
DIV0S R0,R1 ;Flag initialization
.arepeat 32 ;
ROTCL R2 ;Repeat 32 times
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2 = quotient (one's complement notation)
ADDC R3,R2 ;If MSB of quotient is 1, add 1 to convert to two's complement notation
;R2 = quotient (two's complement notation)
Rev. 1.50, 10/04, page 325 of 610
11.1.18 DMULS.L (Double-length Multiply as Signed): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DMULS.L Rm,Rn Signed,
Rn × Rm →MAC
0011nnnnmmmm1101 2 —
Description: This instruction performs 32-bit multiplication of the contents of general register Rn
by the contents of Rm, and stores the 64-bit result in the MACH and MACL registers. The
multiplication is performed as a signed arithmetic operation.
Notes: None
Operation:
DMULS(long m, long n) /* DMULS.L Rm,Rn */
{
unsigned long RnL,RnH,RmL,RmH,Res0,Res1,Res2;
unsigned long temp0,temp1,temp2,temp3;
long tempm,tempn,fnLmL;
tempn = (long)R[n];
tempm = (long)R[m];
if (tempn<0) tempn = 0 - tempn;
if (tempm<0) tempm = 0 - tempm;
if ((long)(R[n]^R[m])<0) fnLmL = -1;
else fnLmL = 0;
temp1 = (unsigned long)tempn;
temp2 = (unsigned long)tempm;
RnL = temp1&0x0000FFFF;
RnH = (temp1>>16)&0x0000FFFF;
RmL = temp2&0x0000FFFF;
RmH = (temp2>>16)&0x0000FFFF;
Rev. 1.50, 10/04, page 326 of 610
temp0 = RmL*RnL;
temp1 = RmH*RnL;
temp2 = RmL*RnH;
temp3 = RmH*RnH;
Res2 = 0;
Res1 = temp1+temp2;
if (Res1<temp1) Res2 += 0x00010000;
temp1 = (Res1<<16)&0xFFFF0000;
Res0 = temp0 + temp1;
if (Res0<temp0) Res2++;
Res2 = Res2 + ((Res1>>16)&0x0000FFFF) + temp3;
if (fnLmL<0) {
Res2 = ~
Res2;
if (Res0==0)
Res2++;
else
Res0 = (~
Res0) + 1;
}
MACH = Res2;
MACL = Res0;
PC +=2;
}
Example:
DMULS.L R0,R1 ;Before execution R0 = H'FFFFFFFE, R1 = H'00005555
;After execution MACH = H'FFFFFFFF, MACL = H'FFFF5556
STS MACH,R0 ;Get operation result (upper)
STS MACL,R1 ;Get operation result (lower)
Rev. 1.50, 10/04, page 327 of 610
11.1.19 DMULU.L (Double-length Multiply as Unsigned): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DMULU.L Rm,Rn Unsigned,
Rn × Rm →MAC
0011nnnnmmmm0101 2 —
Description: This instruction performs 32-bit multiplication of the contents of general register Rn
by the contents of Rm, and stores the 64-bit result in the MACH and MACL registers. The
multiplication is performed as an unsigned arithmetic operation.
Notes: None
Operation:
DMULU(long m, long n) /* DMULU.L Rm,Rn */
{
unsigned long RnL,RnH,RmL,RmH,Res0,Res1,Res2;
unsigned long temp0,temp1,temp2,temp3;
RnL = R[n] & 0x0000FFFF;
RnH = (R[n]>>16) & 0x0000FFFF;
RmL = R[m] & 0x0000FFFF;
RmH = (R[m]>>16) & 0x0000FFFF;
temp0 = RmL*RnL;
temp1 = RmH*RnL;
temp2 = RmL*RnH;
temp3 = RmH*RnH;
Res2 = 0;
Res1 = temp1 + temp2;
if (Res1<temp1) Res2 += 0x00010000;
temp1 = (Res1<<16) & 0xFFFF0000;
Res0 = temp0 + temp1;
Rev. 1.50, 10/04, page 328 of 610
if (Res0<temp0) Res2++;
Res2 = Res2 + ((Res1>>16)&0x0000FFFF) + temp3;
MACH = Res2;
MACL = Res0;
PC += 2;
}
Example:
DMULU.L R0,R1 ;Before execution R0 = H'FFFFFFFE, R1 = H'00005555
;After execution MACH = H'00005554, MACL = H'FFFF5556
STS MACH,R0 ;Get operation result (upper)
STS MACL,R1 ;Get operation result (lower)
Rev. 1.50, 10/04, page 329 of 610
11.1.20 DT (Decrement and Test): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
DT Rn Rn 1 → Rn;
if Rn = 0, 1 → T
if Rn ≠ 0, 0 → T
0100nnnn00010000 1 Result of
comparison
Description: This instruction decrements the contents of general register Rn by 1 and compares
the result with zero. If the result is zero, the T bit is set to 1. If the result is nonzero, the T bit is
cleared to 0.
Notes: None
Operation:
DT(long n)/* DT Rn */
{
R[n]--;
if (R[n]==0) T = 1;
else T = 0;
PC += 2;
}
Example:
MOV #4,R5 ;Set loop count
LOOP:
ADD R0,R1 ;
DT R5 ;Decrement R5 value and check for 0.
BF LOOP ;If T = 0, branch to LOOP (in this example, 4 loops are executed).
Rev. 1.50, 10/04, page 330 of 610
11.1.21 EXTS (Extend as Signed): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
EXTS.B Rm,Rn Rm sign-extended from
byte → Rn
0110nnnnmmmm1110 1 —
EXTS.W Rm,Rn Rm sign-extended from
word → Rn
0110nnnnmmmm1111 1 —
Description:
This instruction sign-extends the contents of general register Rm and stores the result in Rn.
For a byte specification, the value of Rm bit 7 is transferred to Rn bits 8 to 31. For a word
specification, the value of Rm bit 15 is transferred to Rn bits 16 to 31.
Notes: None
Operation:
EXTSB(long m, long n) /* EXTS.B Rm,Rn */
{
R[n] = R[m];
if ((R[m] & 0x00000080)==0) R[n] &=0x000000FF;
else R[n] |= 0xFFFFFF00;
PC += 2;
}
EXTSW(long m, long n) /* EXTS.W Rm,Rn */
{
R[n] = R[m];
if ((R[m] & 0x00008000)==0) R[n] &=0x0000FFFF;
else R[n] |= 0xFFFF0000;
PC += 2;
}
Rev. 1.50, 10/04, page 331 of 610
Example:
EXTS.B R0,R1 ;Before execution R0 = H'00000080
;After execution R1 = H'FFFFFF80
EXTS.W R0,R1 ;Before execution R0 = H'00008000
;After execution R1 = H'FFFF8000
Rev. 1.50, 10/04, page 332 of 610
11.1.22 EXTU (Extend as Unsigned): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
EXTU.B Rm,Rn Rm zero-extended from
byte → Rn
0110nnnnmmmm1100 1 —
EXTU.W Rm,Rn Rm zero-extended from
word → Rn
0110nnnnmmmm1101 1 —
Description: This instruction zero-extends the contents of general register Rm and stores the
result in Rn.
For a byte specification, 0 is transferred to Rn bits 8 to 31. For a word specification, 0 is
transferred to Rn bits 16 to 31.
Notes: None
Operation:
EXTUB(long m, long n) /* EXTU.B Rm,Rn */
{
R[n] = R[m];
R[n] &= 0x000000FF;
PC += 2;
}
EXTUW(long m, long n) /* EXTU.W Rm,Rn */
{
R[n] = R[m];
R[n] &= 0x0000FFFF;
PC += 2;
}
Example:
EXTU.B R0,R1 ;Before execution R0 = H'FFFFFF80
;After execution R1 = H'00000080
EXTU.W R0,R1 ;Before execution R0 = H'FFFF8000
;After execution R1 = H'00008000
Rev. 1.50, 10/04, page 333 of 610
11.1.23 ICBI (Instruction Cache Block Invalidate): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
ICBI @Rn Invalidates the instruction
cache block indicated by
logical address Rn
0000nnnn11100011 13 —
Description: This instruction accesses the instruction cache at the effective address indicated by
the contents of Rn. When the cache is hit, the corresponding cache block is invalidated (the V bit
is cleared to 0). At this time, write-back is not performed. No operation is performed in the case of
a cache miss or access to a non-cache area.
Notes: None
Operation:
ICBI(int n) /* ICBI @Rn */
{
invalidate_instruction_cache_block(R[n]);
PC += 2;
}
Example: When a program is overwriting RAM to modify its own execution, the corresponding
block of the instruction cache should be invalidated by the ICBI instruction. This prevents
execution of the program from the instruction cache, where the non-overwritten instructions are
stored.
Possible Exceptions: Exceptions may occur when invalidation is not performed.
• Instruction TLB multiple-hit exception
• Instruction TLB miss exception
• Instruction TLB protection violation exception
• Instruction address error
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 334 of 610
11.1.24 JMP (Jump): Branch Instruction
Format Operation Instruction Code Cycle T Bit
JMP @Rn Rn → PC 0100nnnn00101011 1 —
Description: Unconditionally makes a delayed branch to the address specified by Rn.
Notes: As this is a delayed branch instruction, the instruction following this instruction is executed
before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. If the following
instruction is a branch instruction, it is identified as a slot illegal instruction.
Operation:
JMP(int n)/* JMP @Rn */
{
unsigned int temp;
temp = PC;
PC = R[n];
Delay_Slot(temp+2);
}
Example:
MOV.L JMP_TABLE,R0 ;R0 = TRGET address
JMP @R0 ;Branch to TRGET.
MOV R0,R1 ;MOV executed before branch.
.align 4
JMP_TABLE: .data.l TRGET ;Jump table
...........
TRGET: ADD #1,R1 ;← Branch destination
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 335 of 610
11.1.25 LDC (Load to Control Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDC Rm, GBR Rm → GBR 0100mmmm00011110 1 —
LDC Rm, VBR Rm → VBR 0100mmmm00101110 1 —
LDC Rm, SGR Rm → SGR 0100mmmm00111010 4 —
LDC Rm, SSR Rm → SSR 0100mmmm00111110 1 —
LDC Rm, SPC Rm → SPC 0100mmmm01001110 1
LDC Rm, DBR Rm → DBR 0100mmmm11111010 4 —
LDC Rm, R0_BANK Rm → R0_BANK 0100mmmm10001110 1 —
LDC Rm, R1_BANK Rm → R1_BANK 0100mmmm10011110 1 —
LDC Rm, R2_BANK Rm → R2_BANK 0100mmmm10101110 1 —
LDC Rm, R3_BANK Rm → R3_BANK 0100mmmm10111110 1 —
LDC Rm, R4_BANK Rm → R4_BANK 0100mmmm11001110 1 —
LDC Rm, R5_BANK Rm → R5_BANK 0100mmmm11011110 1 —
LDC Rm, R6_BANK Rm → R6_BANK 0100mmmm11101110 1 —
LDC Rm, R7_BANK Rm → R7_BANK 0100mmmm11111110 1 —
LDC.L @Rm+, GBR (Rm) → GBR, Rm+4 → Rm 0100mmmm00010111 1 —
LDC.L @Rm+, VBR (Rm) → VBR, Rm+4 → Rm 0100mmmm00100111 1 —
LDC.L @Rm+, SGR (Rm) → SGR, Rm+4 → Rm 0100mmmm00110110 4 —
LDC.L @Rm+, SSR (Rm) → SSR, Rm+4 → Rm 0100mmmm00110111 1 —
LDC.L @Rm+, SPC (Rm) → SPC, Rm+4 → Rm 0100mmmm01000111 1 —
LDC.L @Rm+, DBR (Rm) → DBR, Rm+4 → Rm 0100mmmm11110110 4 —
LDC.L @Rm+, R0_BANK (Rm) → R0_BANK, Rm+4 → Rm 0100mmmm10000111 1 —
LDC.L @Rm+, R1_BANK (Rm) → R1_BANK, Rm+4 → Rm 0100mmmm10010111 1 —
LDC.L @Rm+, R2_BANK (Rm) → R2_BANK, Rm+4 → Rm 0100mmmm10100111 1 —
LDC.L @Rm+, R3_BANK (Rm) → R3_BANK, Rm+4 → Rm 0100mmmm10110111 1 —
LDC.L @Rm+, R4_BANK (Rm) → R4_BANK, Rm+4 → Rm 0100mmmm11000111 1 —
LDC.L @Rm+, R5_BANK (Rm) → R5_BANK, Rm+4 → Rm 0100mmmm11010111 1 —
LDC.L @Rm+, R6_BANK (Rm) → R6_BANK, Rm+4 → Rm 0100mmmm11100111 1 —
LDC.L @Rm+, R7_BANK (Rm) → R7_BANK, Rm+4 → Rm 0100mmmm11110111 1 —
Description: These instructions store the source operand in the control register GBR, VBR, SSR,
SPC, DBR, SGR, or R0_BANK to R7_BANK.
Rev. 1.50, 10/04, page 336 of 610
Notes: With the exception of LDC Rm,GBR and LDC.L @Rm+,GBR, the LDC/LDC.L
instructions are privileged instructions and can only be used in privileged mode. Use in user mode
will cause an illegal instruction exception. However, LDC Rm,GBR and LDC.L @Rm+,GBR can
also be used in user mode.
With the LDC Rm, Rn_BANK and LDC.L @Rm, Rn_BANK instructions, Rn_BANK0 is
accessed when the RB bit in the SR register is 1, and Rn_BANK1 is accessed when this bit is 0.
Operation:
LDCGBR(int m) /* LDC Rm,GBR */
{
GBR = R[m];
PC += 2;
}
LDCVBR(int m) /* LDC Rm,VBR : Privileged */
{
VBR = R[m];
PC += 2;
}
LDCSGR(int m) /* LDC Rm,SGR : Privileged */
{
SGR = R[m];
PC += 2;
}
LDCSSR(int m) /* LDC Rm,SSR : Privileged */
{
SSR = R[m],
PC += 2;
}
Rev. 1.50, 10/04, page 337 of 610
LDCSPC(int m) /* LDC Rm,SPC : Privileged */
{
SPC = R[m];
PC += 2;
}
LDCDBR(int m) /* LDC Rm,DBR : Privileged */
{
DBR = R[m];
PC += 2;
}
LDCRn_BANK(int m) /* LDC Rm,Rn_BANK : Privileged */
/* n=07 */
{
Rn_BANK = R[m];
PC += 2;
}
LDCMGBR(int m) /* LDC.L @Rm+,GBR */
{
GBR=Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMVBR(int m) /* LDC.L @Rm+,VBR : Privileged */
{
VBR = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 338 of 610
LDCMSGR(int m) /* LDC.L @Rm+,SGR : Privileged */
{
SGR = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMSSR(int m) /* LDC.L @Rm+,SSR : Privileged */
{
SSR=Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMSPC(int m) /* LDC.L @Rm+,SPC : Privileged */
{
SPC = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMDBR(int m) /* LDC.L @Rm+,DBR : Privileged */
{
DBR = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMRn_BANK(Long m) /* LDC.L @Rm+,Rn_BANK : Privileged */
/* n=07 */
{
Rn_BANK = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 339 of 610
Possible Exceptions:
• Data TLB multiple-hit exception
• General illegal instruction exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 340 of 610
11.1.26 LDS (Load to System Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDS Rm,MACH Rm → MACH 0100mmmm00001010 1 —
LDS Rm,MACL Rm → MACL 0100mmmm00011010 1 —
LDS Rm,PR Rm→ PR 0100mmmm00101010 1 —
LDS.L @Rm+,MACH (Rm) → MACH, Rm + 4 → Rm 0100mmmm00000110 1 —
LDS.L @Rm+,MACL (Rm) → MACL, Rm + 4 → Rm 0100mmmm00010110 1 —
LDS.L @Rm+,PR (Rm) → PR, Rm + 4 → Rm 0100mmmm00100110 1 —
Description: Stores the source operand into the system registers MACH, MACL, or PR.
Notes: None
Operation:
LDSMACH(long m) /* LDS Rm,MACH */
{
MACH = R[m];
PC += 2;
}
LDSMACL(long m) /* LDS Rm,MACL */
{
MACL = R[m];
PC += 2;
}
LDSPR(long m) /* LDS Rm,PR */
{
PR = R[m];
PC += 2;
}
Rev. 1.50, 10/04, page 341 of 610
LDSMMACH(long m) /* LDS.L @Rm+,MACH */
{
MACH = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDSMMACL(long m) /* LDS.L @Rm+,MACL */
{
MACL = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDSMPR(long m) /* LDS.L @Rm+,PR */
{
PR = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
Example:
LDS R0,PR ; Before execution R0 = H'12345678, PR = H'00000000
; After execution PR = H'12345678
LDS.L @R15+,MACL ; Before execution R15 = H'10000000
; After execution R15 = H'10000004, MACL = (H'10000000)
Possible Exceptions: Exception may occur when LDS.L instruction is executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 342 of 610
11.1.27 LDTLB (Load PTEH/PTEL to TLB): System Control Instruction (Privileged
Instruction)
Format Operation Instruction Code Cycle T Bit
LDTLB PTEH/PTEL → TLB 0000000000111000 1 —
Description: This instruction loads the contents of the PTEH/PTEL registers into the TLB
(translation lookaside buffer) specified by MMUCR.URC (random counter field in the MMC
control register).
LDTLB is a privileged instruction, and can only be used in privileged mode. Use of this
instruction in user mode will cause an illegal instruction exception.
Notes: As this instruction loads the contents of the PTEH/PTEL registers into a TLB, it should be
used either with the MMU disabled, or in the P1 or P2 virtual space with the MMU enabled (see
section 7, Memory Management Unit (MMU), for details). After this instruction is issued, there
must be at least one instruction between the LDTLB instruction and issuance of an instruction
relating to address to the P0, U0, and P3 areas (i.e. BRAF, BSRF, JMP, JSR, RTS, or RTE).
Operation:
LDTLB( ) /*LDTLB */
{
TLB[MMUCR.URC].ASID = PTEH & 0x000000FF;
TLB[MMUCR.URC].VPN = (PTEH & 0xFFFFFC00) >> 10;
TLB[MMUCR.URC].PPN = (PTEH & 0x1FFFFC00) >> 10;
TLB[MMUCR.URC].SZ = (PTEL & 0x00000080) >> 6 |
(PTEL & 0x00000010) >> 4;
TLB[MMUCR.URC].SH = (PTEH & 0x00000002) >> 1;
TLB[MMUCR.URC].PR = (PTEH & 0x00000060) >> 5;
TLB[MMUCR.URC].WT = (PTEH & 0x00000001);
TLB[MMUCR.URC].C = (PTEH & 0x00000008) >> 3;
TLB[MMUCR.URC].D = (PTEH & 0x00000004) >> 2;
TLB[MMUCR.URC].V = (PTEH & 0x00000100) >> 8;
PC += 2;
}
Rev. 1.50, 10/04, page 343 of 610
Example:
MOV @R0,R1 ;Load page table entry (upper) into R1
MOV R1,@R2 ;Load R1 into PTEH; R2 is PTEH address (H'FF000000)
LDTLB ;Load PTEH, PTEL registers into TLB
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 344 of 610
11.1.28 MAC.L (Multiply and Accumulate Long): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
MAC.L @Rm+,@Rn+ Signed,
(Rn) × (Rm) + MAC → MAC
Rn + 4 → Rn, Rm + 4 → Rm
0000nnnnmmmm1111 5 —
Description: This instruction performs signed multiplication of the 32-bit operands whose
addresses are the contents of general registers Rm and Rn, adds the 64-bit result to the MAC
register contents, and stores the result in the MAC register. Operands Rm and Rn are each
incremented by 4 each time they are read.
If the S bit is 0, the 64-bit result is stored in the linked MACH and MACL registers.
If the S bit is 1, the addition to the MAC register contents is a saturation operation at the 48th bit
from the LSB. In a saturation operation, only the lower 48 bits of the MAC register are valid, and
the result range is limited to H'FFFF800000000000 (minimum value) to H'00007FFFFFFFFFFF
(maximum value).
Notes: None
Operation:
MACL(long m, long n) /* MAC.L @Rm+,@Rn+ */
{
unsigned long RnL,RnH,RmL,RmH,Res0,Res1,Res2;
unsigned long temp0,temp1,temp2,temp3;
long tempm,tempn,fnLmL;
tempn = (long)Read_Long(R[n]);
R[n] += 4;
tempm = (long)Read_Long(R[m]);
R[m] += 4;
if ((long)(tempn^tempm)<0) fnLmL = -1;
else fnLmL = 0;
if (tempn<0) tempn = 0-tempn;
if (tempm<0) tempm = 0-tempm;
Rev. 1.50, 10/04, page 345 of 610
temp1 = (unsigned long)tempn;
temp2 = (unsigned long)tempm;
RnL = temp1&0x0000FFFF;
RnH = (temp1>>16) & 0x0000FFFF;
RmL = temp2 & 0x0000FFFF;
RmH = (temp2>>16) & 0x0000FFFF;
temp0 = RmL*RnL;
temp1 = RmH*RnL;
temp2 = RmL*RnH;
temp3 = RmH*RnH;
Res2 = 0;
Res1 = temp1 + temp2;
if (Res1<temp1) Res2 += 0x00010000;
temp1 =(Res1<<16) & 0xFFFF0000;
Res0 = temp0 + temp1;
if (Res0<temp0) Res2++;
Res2 = Res2 + ((Res1>>16) & 0x0000FFFF) + temp3;
if(fnLmL<0){
Res2 = ~
Res2;
if (Res0==0) Res2++;
else Res0 = (~
Res0)+1;
}
if(S==1){
Res0 = MACL + Res0;
if (MACL>Res0) Res2++;
if (MACH & 0x00008000);
else Res2 += MACH|0xFFFF0000;
Res2 += MACH&0x00007FFF;
Rev. 1.50, 10/04, page 346 of 610
if(((long)Res2<0)&&(Res2 < 0xFFFF8000)){
Res2 = 0xFFFF8000;
Res0 = 0x00000000;
}
if(((long)Res2>0)&&(Res2 > 0x00007FFF)){
Res2 = 0x00007FFF;
Res0 = 0xFFFFFFFF;
};
MACH = (Res2 & 0x0000FFFF)|(MACH & 0xFFFF0000);
MACL = Res0;
}
else {
Res0 = MACL + Res0;
if (MACL>Res0) Res2++;
Res2 += MACH;
MACH = Res2;
MACL = Res0;
}
PC += 2;
}
Rev. 1.50, 10/04, page 347 of 610
Example:
MOVA TBLM,R0 ;Get table address
MOV R0,R1;
MOVA TBLN,R0 ;Get table address
CLRMAC ;MAC register initialization
MAC.L @R0+,@R1+ ;
MAC.L @R0+,@R1+ ;
STS MACL,R0 ;Get result in R0
.........
.align 2 ;
TBLM .data.l H'1234ABCD ;
.data.l H'5678EF01 ;
TBLN .data.l H'0123ABCD ;
.data.l H'4567DEF0 ;
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 348 of 610
11.1.29 MAC.W (Multiply and Accumulate Word): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
MAC.W @Rm+,@Rn+
MAC @Rm+,@Rn+
Signed,
(Rn) × (Rm) + MAC →MAC
Rn + 2 → Rn, Rm + 2 → Rm
0100nnnnmmmm1111 4 —
Description: This instruction performs signed multiplication of the 16-bit operands whose
addresses are the contents of general registers Rm and Rn, adds the 32-bit result to the MAC
register contents, and stores the result in the MAC register. Operands Rm and Rn are each
incremented by 2 each time they are read.
If the S bit is 0, a 16 × 16 + 64 → 64-bit multiply-and-accumulate operation is performed, and the
64-bit result is stored in the linked MACH and MACL registers.
If the S bit is 1, a 16 × 16 + 32 → 32-bit multiply-and-accumulate operation is performed, and the
addition to the MAC register contents is a saturation operation. In a saturation operation, only the
MACL register is valid, and the result range is limited to H'80000000 (minimum value) to
H'7FFFFFFF (maximum value). If overflow occurs, the LSB of the MACH register is set to 1.
H'80000000 (minimum value) is stored in the MACL register if the result overflows in the
negative direction, and H'7FFFFFFF (maximum value) is stored if the result overflows in the
positive direction
Notes: If the S bit is 0, a 16 × 16 + 64 → 64-bit multiply-and-accumulate operation is performed.
Rev. 1.50, 10/04, page 349 of 610
Operation:
MACW(long m, long n) /* MAC.W @Rm+,@Rn+ */
{
long tempm,tempn,dest,src,ans;
unsigned long templ;
tempn = (long)Read_Word(R[n]);
R[n] += 2;
tempm = (long)Read_Word(R[m]);
R[m] += 2;
templ = MACL;
tempm = ((long)(short)tempn*(long)(short)tempm);
if ((long)MACL>=0) dest = 0;
else dest = 1;
if ((long)tempm>=0) {
src = 0;
tempn = 0;
}
else {
src = 1;
tempn = 0xFFFFFFFF;
}
src += dest;
MACL += tempm;
if ((long)MACL>=0) ans = 0;
else ans = 1;
ans += dest;
if (S==1) {
if (ans==1) {
if (src==0) MACL = 0x7FFFFFFF;
if (src==2) MACL = 0x80000000;
}
}
Rev. 1.50, 10/04, page 350 of 610
else {
MACH += tempn;
if (templ>MACL) MACH += 1;
}
PC += 2;
}
Example:
MOVA TBLM,R0 ;Get table address
MOV R0,R1 ;
MOVA TBLN,R0 ;Get table address
CLRMAC ;MAC register initialization
MAC.W @R0+,@R1+ ;
MAC.W @R0+,@R1+ ;
STS MACL,R0 ;Get result in R0
...........
.align 2 ;
TBLM .data.w H'1234 ;
.data.w H'5678 ;
TBLN .data.w H'0123 ;
.data.w H'4567 ;
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 351 of 610
11.1.30 MOV (Move data): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOV Rm,Rn Rm → Rn 0110nnnnmmmm0011 1 —
MOV.B Rm,@Rn Rm → (Rn) 0010nnnnmmmm0000 1 —
MOV.W Rm,@Rn Rm → (Rn) 0010nnnnmmmm0001 1 —
MOV.L Rm,@Rn Rm → (Rn) 0010nnnnmmmm0010 1 —
MOV.B @Rm,Rn (Rm) → sign extension → Rn 0110nnnnmmmm0000 1 —
MOV.W @Rm,Rn (Rm) → sign extension → Rn 0110nnnnmmmm0001 1 —
MOV.L @Rm,Rn (Rm) → Rn 0110nnnnmmmm0010 1 —
MOV.B Rm,@-Rn Rn-1 → Rn, Rm → (Rn ) 0010nnnnmmmm0100 1 —
MOV.W Rm,@-Rn Rn-2 → Rn, Rm → (Rn ) 0010nnnnmmmm0101 1 —
MOV.L Rm,@-Rn Rn-4 → Rn, Rm → (Rn) 0010nnnnmmmm0110 1 —
MOV.B @Rm+,Rn (Rm) → sign extension → Rn,
Rm + 1 → Rm
0110nnnnmmmm0100 1 —
MOV.W @Rm+,Rn (Rm) → sign extension → Rn,
Rm + 2 → Rm
0110nnnnmmmm0101 1 —
MOV.L @Rm+,Rn (Rm) → Rn, Rm + 4 → Rm 0110nnnnmmmm0110 1 —
MOV.B Rm,@(R0,Rn) Rm → (R0 + Rn) 0000nnnnmmmm0100 1 —
MOV.W Rm,@(R0,Rn) Rm → (R0 + Rn) 0000nnnnmmmm0101 1 —
MOV.L Rm,@(R0,Rn) Rm → (R0 + Rn) 0000nnnnmmmm0110 1 —
MOV.B @(R0,Rm),Rn (R0 + Rm) → sign extension → Rn 0000nnnnmmmm1100 1 —
MOV.W @(R0,Rm),Rn (R0 + Rm) → sign extension → Rn 0000nnnnmmmm1101 1 —
MOV.L @(R0,Rm),Rn (R0 + Rm) → Rn 0000nnnnmmmm1110 1 —
Description: This instruction transfers the source operand to the destination. When an operand is
memory, the data size can be specified as byte, word, or longword. When the source operand is
memory, the loaded data is sign-extended to longword before being stored in the register.
Notes: None
Rev. 1.50, 10/04, page 352 of 610
Operation:
MOV(long m, long n) /* MOV Rm,Rn */
{
R[n] = R[m];
PC += 2;
}
MOVBS(long m, long n) /* MOV.B Rm,@Rn */
{
Write_Byte(R[n],R[m]);
PC += 2;
}
MOVWS(long m, long n) /* MOV.W Rm,@Rn */
{
Write_Word(R[n],R[m]);
PC += 2;
}
MOVLS(long m, long n) /* MOV.L Rm,@Rn */
{
Write_Long(R[n],R[m]);
PC += 2;
}
MOVBL(long m, long n) /* MOV.B @Rm,Rn */
{
R[n] = (long)Read_Byte(R[m]);
if ((R[n]&0x80)==0) R[n] &= 0x000000FF;
else R[n] |= 0xFFFFFF00;
PC += 2;
}
Rev. 1.50, 10/04, page 353 of 610
MOVWL(long m, long n) /* MOV.W @Rm,Rn */
{
R[n] = (long)Read_Word(R[m]);
if ((R[n]&0x8000)==0) R[n] &= 0x0000FFFF;
else R[n] |= 0xFFFF0000;
PC += 2;
}
MOVLL(long m, long n) /* MOV.L @Rm,Rn */
{
R[n] = Read_Long(R[m]);
PC += 2;
}
MOVBM(long m, long n) /* MOV.B Rm,@-Rn */
{
Write_Byte(R[n]-1,R[m]);
R[n] -= 1;
PC += 2;
}
MOVWM(long m, long n) /* MOV.W Rm,@-Rn */
{
Write_Word(R[n]-2,R[m]);
R[n] -= 2;
PC += 2;
}
MOVLM(long m, long n) /* MOV.L Rm,@-Rn */
{
Write_Long(R[n]-4,R[m]);
R[n] -= 4;
PC += 2;
}
Rev. 1.50, 10/04, page 354 of 610
MOVBP(long m, long n) /* MOV.B @Rm+,Rn */
{
R[n] = (long)Read_Byte(R[m]);
if ((R[n]&0x80)==0) R[n] &= 0x000000FF;
else R[n] |= 0xFFFFFF00;
if (n!=m) R[m] += 1;
PC += 2;
}
MOVWP(long m, long n) /* MOV.W @Rm+,Rn */
{
R[n] = (long)Read_Word(R[m]);
if ((R[n]&0x8000)==0) R[n] &= 0x0000FFFF;
else R[n] |= 0xFFFF0000;
if (n!=m) R[m] += 2;
PC += 2;
}
MOVLP(long m, long n) /* MOV.L @Rm+,Rn */
{
R[n] = Read_Long(R[m]);
if (n!=m) R[m] += 4;
PC += 2;
}
MOVBS0(long m, long n) /* MOV.B Rm,@(R0,Rn) */
{
Write_Byte(R[n]+R[0],R[m]);
PC += 2;
}
MOVWS0(long m, long n) /* MOV.W Rm,@(R0,Rn) */
{
Write_Word(R[n]+R[0],R[m]);
PC+=2;
}
Rev. 1.50, 10/04, page 355 of 610
MOVLS0(long m, long n) /* MOV.L Rm,@(R0,Rn) */
{
Write_Long(R[n]+R[0],R[m]);
PC += 2;
}
MOVBL0(long m, long n) /* MOV.B @(R0,Rm),Rn */
{
R[n] = (long)Read_Byte(R[m]+R[0]);
if ((R[n]&0x80)==0) R[n] &= 0x000000FF;
else R[n] |= 0xFFFFFF00;
PC += 2;
}
MOVWL0(long m, long n) /* MOV.W @(R0,Rm),Rn */
{
R[n] = (long)Read_Word(R[m]+R[0]);
if ((R[n]&0x8000)==0) R[n] &= 0x0000FFFF;
else R[n] |= 0xFFFF0000;
PC += 2;
}
MOVLL0(long m, long n) /* MOV.L @(R0,Rm),Rn */
{
R[n] = Read_Long(R[m]+R[0]);
PC += 2;
}
Rev. 1.50, 10/04, page 356 of 610
Example:
MOV R0,R1 ;Before execution R0 = H'FFFFFFFF, R1 = H'00000000
;After execution R1 = H'FFFFFFFF
MOV.W R0,@R1 ;Before execution R0 = H'FFFF7F80
;After execution (R1) = H'7F80
MOV.B @R0,R1 ;Before execution (R0) = H'80, R1 = H'00000000
;After execution R1 = H'FFFFFF80
MOV.W R0,@-R1 ;Before execution R0 = H'AAAAAAAA, (R1) = H'FFFF7F80
;After execution R1 = H'FFFF7F7E, (R1) = H'AAAA
MOV.L @R0+,R1 ;Before execution R0 = H'12345670
;After execution R0 = H'12345674, R1 = (H'12345670)
MOV.B R1,@(R0,R2) ;Before execution R2 = H'00000004, R0 = H'10000000
;After execution R1 = (H'10000004)
MOV.W @(R0,R2),R1 ;Before execution R2 = H'00000004, R0 = H'10000000
;After execution R1 = (H'10000004)
Possible Exceptions: Exceptions may occur when MOV instructions without MOV Rm, Rn are
executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
• Initial page write exception (only write operation)
Rev. 1.50, 10/04, page 357 of 610
11.1.31 MOV (Move Constant Value): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOV #imm,Rn imm → sign extension → Rn 1110nnnniiiiiiii 1 —
MOV.W @(disp*,PC),Rn (disp × 2 + PC + 4) → sign
extension → Rn
1001nnnndddddddd 1 —
MOV.L @(disp*,PC),Rn (disp × 4 + PC &
H'FFFFFFFC + 4) → Rn
1101nnnndddddddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Description: This instruction stores immediate data, sign-extended to longword, in general
register Rn. In the case of word or longword data, the data is stored from memory address (PC + 4
+ displacement × 2) or (PC + 4 + displacement × 4).
With word data, the 8-bit displacement is multiplied by two after zero-extension, and so the
relative distance from the table is in the range up to PC + 4 + 510 bytes. The PC value is the
address of this instruction.
With longword data, the 8-bit displacement is multiplied by four after zero-extension, and so the
relative distance from the operand is in the range up to PC + 4 + 1020 bytes. The PC value is the
address of this instruction. A value with the lower 2 bits adjusted to B'00 is used in address
calculation.
Notes: If a PC-relative load instruction is executed in a delay slot, a slot illegal instruction
exception will be generated.
Rev. 1.50, 10/04, page 358 of 610
Operation:
MOVI(int i, int n) /* MOV #imm,Rn */
{
if ((i&0x80)==0) R[n] = (0x000000FF & i);
else R[n] = (0xFFFFFF00 | i);
PC += 2;
}
MOVWI(int d, int n) /* MOV.W @(disp,PC),Rn */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
R[n] = (int)Read_Word(PC+4+(disp<<1));
if ((R[n]&0x8000)==0) R[n] &= 0x0000FFFF;
else R[n] |= 0xFFFF0000;
PC += 2;
}
MOVLI(int d, int n)/* MOV.L @(disp,PC),Rn */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & (int)d);
R[n] = Read_Long((PC & 0xFFFFFFFC)+4+(disp<<2));
PC += 2;
}
Rev. 1.50, 10/04, page 359 of 610
Example:
Address
1000 MOV #H'80,R1 ;R1 = H'FFFFFF80
1002 MOV.W IMM,R2 ;R2 = H'FFFF9ABC IMM means (PC + 4 + H'08)
1004 ADD #-1,R0 ;
1006 TST R0,R0 ;
1008 MOV.L @(3*,PC),R3 ;R3 = H'12345678
100A BRA NEXT ;Delayed branch instruction
100C NOP
100E IMM .data.w H'9ABC ;
1010 .data.w H'1234 ;
1012 NEXT JMP @R3 ;Distination of BRA branch instruction
1014 CMP/EQ#0,R0 ;
.align 4;
1018 .data.l H'12345678 ;
101C .data.l H'9ABCDEF0 ;
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Possible Exceptions: Exceptions may occur when PC-relative load instruction is executed.
• Data TLB multiple-hit exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 360 of 610
11.1.32 MOV (Move Global Data): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOV.B @(disp*,GBR),R0 (disp + GBR) → sign
extension → R0
11000100dddddddd 1 —
MOV.W @(disp*,GBR),R0 (disp × 2 + GBR) →
sign extension → R0
11000101dddddddd 1 —
MOV.L @(disp*,GBR),R0 (disp × 4 + GBR) → R0 11000110dddddddd 1 —
MOV.B R0,@(disp*,GBR) R0 → (disp + GBR) 11000000dddddddd 1 —
MOV.W R0,@(disp*,GBR) R0 → (disp × 2 + GBR) 11000001dddddddd 1 —
MOV.L R0,@(disp*,GBR) R0 → (disp × 4 + GBR) 11000010dddddddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Description: This instruction transfers the source operand to the destination. Byte, word, or
longword can be specified as the data size, but the register is always R0. If the transfer data is
byte-size, the 8-bit displacement is only zero-extended, so a range up to +255 bytes can be
specified. If the transfer data is word-size, the 8-bit displacement is multiplied by two after zeroextension, enabling a range up to +510 bytes to be specified. With longword transfer data, the 8-
bit displacement is multiplied by four after zero-extension, enabling a range up to +1020 bytes to
be specified.
When the source operand is memory, the loaded data is sign-extended to longword before being
stored in the register.
Notes: When loading, the destination register is always R0.
Rev. 1.50, 10/04, page 361 of 610
Operation:
MOVBLG(int d) /* MOV.B @(disp,GBR),R0 */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
R[0] = (int)Read_Byte(GBR+disp);
if ((R[0]&0x80)==0) R[0] &= 0x000000FF;
else R[0] |= 0xFFFFFF00;
PC += 2;
}
MOVWLG(int d) /* MOV.W @(disp,GBR),R0 */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
R[0] = (int)Read_Word(GBR+(disp<<1));
if ((R[0]&0x8000)==0) R[0] &= 0x0000FFFF;
else R[0] |= 0xFFFF0000;
PC += 2;
}
MOVLLG(int d) /* MOV.L @(disp,GBR),R0 */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
R[0] = Read_Long(GBR+(disp<<2));
PC += 2;
}
Rev. 1.50, 10/04, page 362 of 610
MOVBSG(int d) /* MOV.B R0,@(disp,GBR) */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
Write_Byte(GBR+disp,R[0]);
PC += 2;
}
MOVWSG(int d) /* MOV.W R0,@(disp,GBR) */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
Write_Word(GBR+(disp<<1),R[0]);
PC += 2;
}
MOVLSG(int d) /* MOV.L R0,@(disp,GBR) */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & (long)d);
Write_Long(GBR+(disp<<2),R[0]);
PC += 2;
}
Example:
MOV.L @(2*,GBR),R0 ;Before execution (GBR+8) = H'12345670
;After execution R0 = H'12345670
MOV.B R0,@(1*,GBR) ;Before execution R0 = H'FFFF7F80
;After execution (GBR+1) = H'80
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Rev. 1.50, 10/04, page 363 of 610
Possible Exceptions:
• Data TLB multiple-hit exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
• Initial page write exception (only write operation)
Rev. 1.50, 10/04, page 364 of 610
11.1.33 MOV (Move Structure Data): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOV.B R0,@(disp*,Rn) R0 → (disp + Rn) 10000000nnnndddd 1 —
MOV.W R0,@(disp*,Rn) R0 → (disp × 2 + Rn) 10000001nnnndddd 1 —
MOV.L Rm,@(disp*,Rn) Rm → (disp × 4 + Rn) 0001nnnnmmmmdddd 1 —
MOV.B @(disp*,Rm),R0 (disp + Rm) → sign
extension → R0
10000100mmmmdddd 1 —
MOV.W @(disp*,Rm),R0 (disp × 2 + Rm) → sign
extension → R0
10000101mmmmdddd 1 —
MOV.L @(disp*,Rm),Rn (disp × 4 + Rm) → Rn 0101nnnnmmmmdddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Description: This instruction transfers the source operand to the destination. It is ideal for
accessing data inside a structure or stack. Byte, word, or longword can be specified as the data
size, but with byte or word data the register is always R0.
If the data is byte-size, the 4-bit displacement is only zero-extended, so a range up to +15 bytes
can be specified. If the data is word-size, the 4-bit displacement is multiplied by two after zeroextension, enabling a range up to +30 bytes to be specified. With longword data, the 4-bit
displacement is multiplied by four after zero-extension, enabling a range up to +60 bytes to be
specified. If a memory operand cannot be reached, the previously described @(R0,Rn) mode must
be used.
When the source operand is memory, the loaded data is sign-extended to longword before being
stored in the register.
Notes: When loading byte or word data, the destination register is always R0. Therefore, if the
following instruction attempts to reference R0, it is kept waiting until completion of the load
instruction. This allows optimization by changing the order of instructions.
MOV.B
AND
ADD
@(2,R1),R0
#80,R0
#20,R1
MOV.B
ADD
AND
@(2,R1),R0
#20,R1
#80,R0
Rev. 1.50, 10/04, page 365 of 610
Operation:
MOVBS4(long d, long n) /* MOV.B R0,@(disp,Rn) */
{
long disp;
disp = (0x0000000F & (long)d);
Write_Byte(R[n]+disp,R[0]);
PC += 2;
}
MOVWS4(long d, long n) /* MOV.W R0,@(disp,Rn) */
{
long disp;
disp = (0x0000000F & (long)d);
Write_Word(R[n]+(disp<<1),R[0]);
PC += 2;
}
MOVLS4(long m, long d, long n) /* MOV.L Rm,@(disp,Rn) */
{
long disp;
disp = (0x0000000F & (long)d);
Write_Long(R[n]+(disp<<2),R[m]);
PC += 2;
}
MOVBL4(long m, long d) /* MOV.B @(disp,Rm),R0 */
{
long disp;
disp = (0x0000000F & (long)d);
R[0] = Read_Byte(R[m]+disp);
if ((R[0]&0x80)==0) R[0] &= 0x000000FF;
else R[0] |= 0xFFFFFF00;
PC += 2;
}
Rev. 1.50, 10/04, page 366 of 610
MOVWL4(long m, long d) /* MOV.W @(disp,Rm),R0 */
{
long disp;
disp = (0x0000000F & (long)d);
R[0] = Read_Word(R[m]+(disp<<1));
if ((R[0]&0x8000)==0) R[0] &= 0x0000FFFF;
else R[0] |= 0xFFFF0000;
PC += 2;
}
MOVLL4(long m, long d, long n) /* MOV.L @(disp,Rm),Rn */
{
long disp;
disp = (0x0000000F & (long)d);
R[n] = Read_Long(R[m]+(disp<<2));
PC += 2;
}
Example:
MOV.L @(2*,R0),R1 ;Before execution (R0+8) = H'12345670
;After execution R1 = H'12345670
MOV.L R0,@(H'F,R1) ;Before execution R0 = H'FFFF7F80
;After execution (R1+60) = H'FFFF7F80
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Possible Exceptions:
• Data TLB multiple-hit exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
• Initial page write exception (only write operation)
Rev. 1.50, 10/04, page 367 of 610
11.1.34 MOVA (Move Effective Address): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVA
@(disp*,PC),R0
disp × 4 + PC & H'FFFFFFFC
+ 4 → R0
11000111dddddddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Description: This instruction stores the source operand effective address in general register R0.
The 8-bit displacement is multiplied by four after zero-extension. The PC value is the address of
this instruction, but a value with the lower 2 bits adjusted to B'00 is used in address calculation.
Notes: If this instruction is executed in a delay slot, a slot illegal instruction exception will be
generated.
Operation:
MOVA(int d) /* MOVA @(disp,PC),R0 */
{
unsigned int disp;
disp = (unsigned int)(0x000000FF & d);
R[0] = (PC&0xFFFFFFFC) + 4 + (disp<<2);
PC += 2;
}
Example:
Address .org H'1006
1006 MOVA STR*,R0 ;STR address → R0
1008 MOV.B @R0,R1 ;R1 = "X" ← Position after adjustment of lower 2 bits of PC
100A ADD R4,R5
.align 4
100C STR:.sdata "XYZP12"
Note: * The assembler of Renesas Technology uses the value after scaling (×1, ×2, or ×4) as
the displacement (disp).
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 368 of 610
11.1.35 MOVCA.L (Move with Cache Block Allocation): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVCA.L R0,@Rn R0 → (Rn)
(without fetching cache block)
0000nnnn11000011 1 —
Description: This instruction stores the contents of general register R0 in the memory location
indicated by effective address Rn. This instruction differs from other store instructions as follows.
If write-back is selected for the accessed memory, and a cache miss occurs, the cache block will
be allocated but an R0 data write will be performed to that cache block without performing a block
read. Other cache block contents are undefined.
Notes: None
Operation:
MOVCAL(int n) /*MOVCA.L R0,@Rn */
{
if ((is_write_back_memory(R[n]))
&& (look_up_in_operand_cache(R[n]) == MISS))
allocate_operand_cache_block(R[n]);
Write_Long(R[n], R[0]);
PC += 2;
}
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Rev. 1.50, 10/04, page 369 of 610
11.1.36 MOVCO (Move Conditional): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVCO.L R0,@Rn LDST → T
if (T==1) R0 → (Rn)
0 → LDST
0000nnnn01110011 1 LDST
Description: MOVCO is used in combination with MOVLI to realize an atomic read-modifywrite operation in a single processor.
This instruction copies the value of the LDST flag to the T bit. When the T bit is set to 1, the value
of R0 is stored at the address in Rm. If the T bit is cleared to 0, the value is not stored at the
address in Rm. Finally, the LDST flag is cleared to 0. Since the LDST flag is cleared by an
instruction or exception, storage by the MOVCO instruction only proceeds when no interrupt or
exception has occurred between the execution of the MOVLI and MOVCO instructions.
Notes: None
Operation:
MOVCO(long n) /* MOVCO Rn,@Rn */
{
T = LDST;
if(T==1)
Write_Long(R[n],R[0]);
LDST = 0;
PC += 2
}
Rev. 1.50, 10/04, page 370 of 610
Example:
Retry: MOVLI.L @Rn,R0 ; Atomic incrementation
ADD #1,R0
MOVCO.L R0,@Rn
BF Retry ; Reexecute if an interrupt or other
exception occurs between the MOVLI and
MOVCO instructions
NOP
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Rev. 1.50, 10/04, page 371 of 610
11.1.37 MOVLI (Move Linked): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVLI.L @Rm,R0 1 → LDST
(Rm) → R0
If an interrupt or exception has
occurred
0 → LDST
0000nnnn01100011 1 —
Description: MOVLI is used in combination with MOVCO to realize an atomic read-modifywrite operation in a single processor.
This instruction sets the LDST flag to 1 and reads the four bytes of data indicated by Rm into R0.
If, however, an interrupt or exception occurs, LDST is cleared to 0.
Storage by the MOVCO instruction only proceeds when the instruction is executed after the LDST
bit has been set by the MOVLI instruction and not cleared by an interrupt or other exception.
When LDST has been cleared to 0, the MOVCO instruction clears the T bit and does not proceed
with storage.
Notes: None
Operation:
MOVLINK(long m) /* MOVLI Rm,@Rn */
{
LDST = 1;
R[0] = Read_Long(R[m]);
PC += 2
}
Example:
See the examples for the MOVCO instruction.
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 372 of 610
11.1.38 MOVT (Move T Bit): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVT Rn T → Rn 0000nnnn00101001 1 —
Description: This instruction stores the T bit in general register Rn. When T = 1, Rn = 1; when T
= 0, Rn = 0.
Notes: None
Operation:
MOVT(long n) /* MOVT Rn */
{
R[n] = (0x00000001 & SR);
PC += 2;
}
Example:
XOR R2,R2 ;R2 = 0
CMP/PZ R2 ;T = 1
MOVT R0 ;R0 = 1
CLRT ;T = 0
MOVT R1 ;R1 = 0
Rev. 1.50, 10/04, page 373 of 610
11.1.39 MOVUA (Move Unaligned): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
MOVUA.L @Rm,R0 (Rm) → R0
Load non-boundary-aligned
data
0100nnnn10101001 2 —
MOVUA.L @Rm+,R0 (Rm) → R0, Rm + 4 → Rm
Load non-boundary-aligned
data
0100nnnn11101001 2 —
Description: This instruction loads the longword of data from the effective address indicated by
the contents of Rm in memory to R0. The address is not restricted to longword boundaries address
(4n); this instruction allows loading from non-longword-boundary addresses (4n + 1, 4n + 2, and
4n + 3). Data address error exceptions do not occur when access is to non-longword-boundary
addresses (4n + 1, 4n + 2, and 4n + 3).
Notes: None
Operation:
MOVUAL(int n) /* MOVUA.L Rm,R0*/
{
Read_Unaligned_Long(R0,R[n]);
PC += 2;
}
MOVUALP(int n) /* MOVUA.L Rm+,R0*/
{
Read_Unaligned_Long(R0,R[n]);
if(n != 0) R[n] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 374 of 610
Example:
MOVUA.L @R1,R0 ;Before execution R1=H'00001001, R0=H'00000000
;After execution R0=(H'00001001)
MOVUA.L @R1+,R0 ;Before execution R1=H'00001007, R0=H'00000000
;After execution R1=H'0000100B, R0=(H'00001007)
; Special case in which the source operand is @R0
MOVUA.L @R0,R0 ;Before execution R0=H'00001001
;After execution R0=(H'00001001)
MOVUA.L @R0+,R0 ;Before execution R0=H'00001001
;After execution R0=(H'00001001)
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error (when the privileged area is accessed from user)
Rev. 1.50, 10/04, page 375 of 610
11.1.40 MUL.L (Multiply Long): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
MUL.L Rm,Rn Rn × Rm → MACL 0000nnnnmmmm0111 2 —
Description: This instruction performs 32-bit multiplication of the contents of general registers
Rn and Rm, and stores the lower 32 bits of the result in the MACL register. The contents of
MACH are not changed.
Notes: None
Operation:
MULL(long m, long n) /* MUL.L Rm,Rn */
{
MACL = R[n]*R[m];
PC += 2;
}
Example:
MUL.L R0,R1 ;Before execution R0 = H'FFFFFFFE, R1 = H'00005555
;After execution MACL = H'FFFF5556
STS MACL,R0 ;Get operation result
Rev. 1.50, 10/04, page 376 of 610
11.1.41 MULS.W (Multiply as Signed Word): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
MULS.W Rm,Rn Signed, Rn × Rm → MACL 0010nnnnmmmm1111 1 —
Description: This instruction performs 16-bit multiplication of the contents of general registers
Rn and Rm, and stores the 32-bit result in the MACL register. The multiplication is performed as a
signed arithmetic operation. The contents of MACH are not changed.
Notes: None
Operation:
MULS(long m, long n) /* MULS Rm,Rn */
{
MACL = ((long)(short)R[n]*(long)(short)R[m]);
PC += 2;
}
Example:
MULS.W R0,R1 ;Before execution R0 = H'FFFFFFFE, R1 = H'00005555
;After execution MACL = H'FFFF5556
STS MACL,R0 ;Get operation result
Rev. 1.50, 10/04, page 377 of 610
11.1.42 MULU.W (Multiply as Unsigned Word): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
MULU.W Rm,Rn Unsigned, Rn × Rm → MACL 0010nnnnmmmm1110 1 —
Description: This instruction performs 16-bit multiplication of the contents of general registers
Rn and Rm, and stores the 32-bit result in the MACL register. The multiplication is performed as
an unsigned arithmetic operation. The contents of MACH are not changed.
Notes: None
Operation:
MULU(long m, long n) /* MULU Rm,Rn */
{
MACL = (unsigned long)(unsigned short)R[n]*
(unsigned long)(unsigned short)R[m];
PC += 2;
}
Example:
MULU.W R0,R1 ;Before execution R0 = H'00000002, R1 = H'FFFFAAAA
;After execution MACL = H'00015554
STS MACL,R0 ;Get operation result
Rev. 1.50, 10/04, page 378 of 610
11.1.43 NEG (Negate): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
NEG Rm,Rn 0 - Rm → Rn 0110nnnnmmmm1011 1 —
Description: This instruction finds the two's complement of the contents of general register Rm
and stores the result in Rn. That is, it subtracts Rm from 0 and stores the result in Rn.
Notes: None
Operation:
NEG(long m, long n) /* NEG Rm,Rn */
{
R[n] = 0-R[m];
PC += 2;
}
Example:
NEG R0,R1 ;Before execution R0 = H'00000001
;After execution R1 = H'FFFFFFFF
Rev. 1.50, 10/04, page 379 of 610
11.1.44 NEGC (Negate with Carry): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
NEGC Rm,Rn 0 Rm T → Rn,
borrow → T
0110nnnnmmmm1010 1 Borrow
Description: This instruction subtracts the contents of general register Rm and the T bit from 0
and stores the result in Rn. A borrow resulting from the operation is reflected in the T bit. The
NEGC instruction is used for sign inversion of a value exceeding 32 bits.
Notes: None
Operation:
NEGC(long m, long n) /* NEGC Rm,Rn */
{
unsigned long temp;
temp = 0-R[m];
R[n] = temp-T;
if (0<temp) T = 1;
else T = 0;
if (temp<R[n]) T = 1;
PC += 2;
}
Example:
CLRT ;Sign inversion of R0:R1 (64 bits)
NEGC R1,R1 ;Before execution R1 = H'00000001, T = 0
;After execution R1 = H'FFFFFFFF, T = 1
NEGC R0,R0 ;Before execution R0 = H'00000000, T = 1
;After execution R0 = H'FFFFFFFF, T = 1
Rev. 1.50, 10/04, page 380 of 610
11.1.45 NOP (No Operation): System Control Instruction
Format Operation Instruction Code Cycle T Bit
NOP No operation 0000000000001001 1 —
Description: This instruction simply increments the program counter (PC), advancing the
processing flow to execution of the next instruction.
Notes: None
Operation:
NOP( ) /* NOP */
{
PC += 2;
}
Example:
NOP ;Time equivalent to one execution state elapses.
Rev. 1.50, 10/04, page 381 of 610
11.1.46 NOT (Not-logical Complement): Logical Instruction
Format Operation Instruction Code Cycle T Bit
NOT Rm,Rn Rm → Rn 0110nnnnmmmm0111 1 —
Description: This instruction finds the one's complement of the contents of general register Rm
and stores the result in Rn. That is, it inverts the Rm bits and stores the result in Rn.
Notes: None
Operation:
NOT(long m, long n) /* NOT Rm,Rn */
{
R[n] = R[m];
PC += 2;
}
Example:
NOT R0,R1 ;Before execution R0 = H'AAAAAAAA
;After execution R1 = H'55555555
Rev. 1.50, 10/04, page 382 of 610
11.1.47 OCBI (Operand Cache Block Invalidate): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
OCBI @Rn Operand cache block
invalidation
0000nnnn10010011 1 —
Description: This instruction accesses data using the contents indicated by effective address Rn.
In the case of a hit in the cache, the corresponding cache block is invalidated (the V bit is cleared
to 0). If there is unwritten information (U bit = 1), write-back is not performed even if write-back
mode is selected. No operation is performed in the case of a cache miss or an access to a noncache area.
Notes: None
Operation:
OCBI(int n) /* OCBI @Rn */
{
invalidate_operand_cache_block(R[n]);
PC += 2;
}
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Note that the above exceptions are generated even if OCBI does not operate.
Rev. 1.50, 10/04, page 383 of 610
11.1.48 OCBP (Operand Cache Block Purge): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
OCBP @Rn Writes back and invalidates
operand cache block
0000nnnn10100011 1 —
Description: This instruction accesses data using the contents indicated by effective address Rn. If
the cache is hit and there is unwritten information (U bit = 1), the corresponding cache block is
written back to external memory and that block is invalidated (the V bit is cleared to 0). If there is
no unwritten information (U bit = 0), the block is simply invalidated. No operation is performed in
the case of a cache miss or an access to a non-cache area.
Notes: None
Operation:
OCBP(int n) /* OCBP @Rn */
{
if(is_dirty_block(R[n])) write_back(R[n])
invalidate_operand_cache_block(R[n]);
PC += 2;
}
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Note that the above exceptions are generated even if OCBP does not operate.
Rev. 1.50, 10/04, page 384 of 610
11.1.49 OCBWB (Operand Cache Block Write Back): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
OCBWB @Rn Writes back operand cache
block
0000nnnn10110011 1 —
Description: This instruction accesses data using the contents indicated by effective address Rn. If
the cache is hit and there is unwritten information (U bit = 1), the corresponding cache block is
written back to external memory and that block is cleaned (the U bit is cleared to 0). In other cases
(i.e. in the case of a cache miss or an access to a non-cache area, or if the block is already clean),
no operation is performed.
Notes: None
Operation:
OCBWB(int n) /* OCBWB @Rn */
{
if(is_dirty_block(R[n])) write_back(R[n]);
PC += 2;
}
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Note that the above exceptions are generated even if OCBWB does not operate.
Rev. 1.50, 10/04, page 385 of 610
11.1.50 OR (OR Logical): Logical Instruction
Format Operation Instruction Code Cycle T Bit
OR Rm,Rn Rn | Rm → Rn 0010nnnnmmmm1011 1 —
OR #imm,R0 R0 | imm → R0 11001011iiiiiiii 1 —
OR.B #imm,@(R0,GBR) (R0 + GBR) | imm
→ (R0 + GBR)
11001111iiiiiiii 3 —
Description:This instruction ORs the contents of general registers Rn and Rm and stores the
result in Rn.
This instruction can be used to OR general register R0 contents with zero-extended 8-bit
immediate data, or, in indexed GBR indirect addressing mode, to OR 8-bit memory with 8-bit
immediate data.
Notes: None
Rev. 1.50, 10/04, page 386 of 610
Operation:
OR(long m, long n) /* OR Rm,Rn */
{
R[n] |= R[m];
PC += 2;
}
ORI(long i) /* OR #imm,R0 */
{
R[0] |= (0x000000FF & (long)i);
PC += 2;
}
ORM(long i) /* OR.B #imm,@(R0,GBR) */
{
long temp;
temp = (long)Read_Byte(GBR+R[0]);
temp |= (0x000000FF & (long)i);
Write_Byte(GBR+R[0],temp);
PC += 2;
}
Example:
OR R0,R1 ;Before execution R0 = H'AAAA5555, R1 = H'55550000
;After execution R1 = H'FFFF5555
OR #H'F0,R0 ;Before execution R0 = H'00000008
;After execution R0 = H'000000F8
OR.B #H'50,@(R0,GBR) ;Before execution (R0,GBR) = H'A5
;After execution (R0,GBR) = H'F5
Rev. 1.50, 10/04, page 387 of 610
Possible Exceptions: Exceptions may occur when OR.B instruction is executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Exceptions are checked taking a data access by this instruction as a byte load and a byte store.
Rev. 1.50, 10/04, page 388 of 610
11.1.51 PREF (Prefetch Data to Cache): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
PREF @Rn (Rn) → operand cache 0000nnnn10000011 1 —
Description: This instruction reads a 32-byte data block starting at a 32-byte boundary into the
operand cache. The lower 5 bits of the address specified by Rn are masked to zero.
This instruction does not generate data address error and MMU exceptions except data TLB
multiple-hit exception. In the event of an error, the PREF instruction is treated as an NOP (no
operation) instruction.
Notes: None
Operation:
PREF(int n) /* PREF @Rn */
{
PC += 2;
}
Example:
MOV.L #SOFT_PF,R1 ;R1 address is SOFT_PF
PREF @R1 ;Load SOFT_PF data into on-chip cache
.align 32
SOFT_PF: .data.l H'12345678
.data.l H'9ABCDEF0
.data.l H'AAAA5555
.data.l H'5555AAAA
.data.l H'11111111
.data.l H'22222222
.data.l H'33333333
.data.l H'44444444
Possible Exceptions:
• Data TLB multiple-hit exception
Rev. 1.50, 10/04, page 389 of 610
11.1.52 PREFI (Prefetch Instruction Cache Block): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
PREFI @Rn Invalidation of instruction
cache indicated by logical
address Rn
0000nnnn11010011 10 —
Description: This instruction reads a 32-byte block of data starting at a 32-byte boundary within
the instruction cache. The lower 5 bits of the address specified by Rn are masked by zeroes.
This instruction does not generate data address error and MMU exceptions. In the event of an
error, the PREFI instruction is treated as an NOP (no operation) instruction.
When the address to be prefetched is missing from UTLB or is protected, the PREFI instruction is
treated as an NOP instruction and a TLB exception does not occur.
Notes: None
Operation:
PREFI(int n) /* PREFI @Rn*/
{
prefetch_instruction_cache_block(R[n]);
PC += 2;
}
Example:
MOVA WakeUp,R0 ; Wakeup address
PREFI @R0 ; Prefetching of instructions to be
executed after release from the SLEEP state
SLEEP
WakeUp:
NOP
This instruction is used, before the SLEEP command is issued, to
prefetch instructions for execution on return from the SLEEP state.
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 390 of 610
11.1.53 ROTCL (Rotate with Carry Left): Shift Instruction
Format Operation Instruction Code Cycle T Bit
ROTCL Rn T ← Rn ← T 0100nnnn00100100 1 MSB
Description: This instruction rotates the contents of general register Rn one bit to the left through
the T bit, and stores the result in Rn. The bit rotated out of the operand is transferred to the T bit.
MSB LSB
ROTCL T
Notes: None
Operation:
ROTCL(long n) /* ROTCL Rn */
{
long temp;
if ((R[n] & 0x80000000)==0) temp=0;
else temp = 1;
R[n] <<= 1;
if (T==1) R[n] |= 0x00000001;
else R[n] &= 0xFFFFFFFE;
if (temp==1) T = 1;
else T = 0;
PC += 2;
}
Example:
ROTCL R0 ;Before execution R0 = H'80000000, T = 0
;After execution R0 = H'00000000, T = 1
Rev. 1.50, 10/04, page 391 of 610
11.1.54 ROTCR (Rotate with Carry Right): Shift Instruction
Format Operation Instruction Code Cycle T Bit
ROTCR Rn T → Rn → T 0100nnnn00100101 1 LSB
Description: This instruction rotates the contents of general register Rn one bit to the right
through the T bit, and stores the result in Rn. The bit rotated out of the operand is transferred to
the T bit.
T
MSB LSB
ROTCR
Notes: None
Operation:
ROTCR(long n) /* ROTCR Rn */
{
long temp;
if ((R[n] & 0x00000001)==0) temp = 0;
else temp = 1;
R[n] >>= 1;
if (T==1) R[n] |= 0x80000000;
else R[n] &= 0x7FFFFFFF;
if (temp==1) T = 1;
else T = 0;
PC += 2;
}
Example:
ROTCR R0 ;Before execution R0 = H'00000001, T = 1
;After execution R0 = H'80000000, T = 1
Rev. 1.50, 10/04, page 392 of 610
11.1.55 ROTL (Rotate Left): Shift Instruction
Format Operation Instruction Code Cycle T Bit
ROTL Rn T ← Rn ← MSB 0100nnnn00000100 1 MSB
Description: This instruction rotates the contents of general register Rn one bit to the left, and
stores the result in Rn. The bit rotated out of the operand is transferred to the T bit.
MSB LSB
ROTL T
Notes: None
Operation:
ROTL(long n) /* ROTL Rn */
{
if ((R[n]&0x80000000)==0) T = 0;
else T = 1;
R[n] <<= 1;
if (T==1) R[n] |= 0x00000001;
else R[n] &= 0xFFFFFFFE;
PC += 2;
}
Example:
ROTL R0 ;Before execution R0 = H'80000000, T = 0
;After execution R0 = H'00000001, T = 1
Rev. 1.50, 10/04, page 393 of 610
11.1.56 ROTR (Rotate Right): Shift Instruction
Format Operation Instruction Code Cycle T Bit
ROTR Rn LSB → Rn → T 0100nnnn00000101 1 LSB
Description: This instruction rotates the contents of general register Rn one bit to the right, and
stores the result in Rn. The bit rotated out of the operand is transferred to the T bit.
MSB LSB
ROTR T
Notes: None
Operation:
ROTR(long n) /* ROTR Rn */
{
if ((R[n] & 0x00000001)==0) T = 0;
else T = 1;
R[n] >>= 1;
if (T==1) R[n] |= 0x80000000;
else R[n] &= 0x7FFFFFFF;
PC += 2;
}
Example:
ROTR R0 ;Before execution R0 = H'00000001, T = 0
;After execution R0 = H'80000000, T = 1
Rev. 1.50, 10/04, page 394 of 610
11.1.57 RTE (Return from Exception): System Control Instruction
Format Operation Instruction Code Cycle T Bit
RTE SSR → SR, SPC→ PC 0000000000101011 4 —
Description: This instruction returns from an exception or interrupt handling routine by restoring
the PC and SR values from SPC and SSR. Program execution continues from the address specified
by the restored PC value.
RTE is a privileged instruction, and can only be used in privileged mode. Use of this instruction in
user mode will cause an illegal instruction exception.
Notes: As this is a delayed branch instruction, the instruction following the RTE instruction is
executed before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. An exception
must not be generated by the instruction in this instruction's delay slot. If the following instruction
is a branch instruction, it is identified as a slot illegal instruction.
If this instruction is located in the delay slot immediately following a delayed branch instruction, it
is identified as a slot illegal instruction.
The SR value accessed by the instruction in the RTE delay slot is the value restored from SSR by
the RTE instruction. The SR and MD values defined prior to RTE execution are used to fetch the
instruction in the RTE delay slot.
Operation:
RTE( ) /* RTE */
{
unsigned int temp;
temp = PC;
SR = SSR;
PC = SPC;
Delay_Slot(temp+2);
}
Example:
RTE ;Return to original routine.
ADD #8,R14 ;Executed before branch.
Rev. 1.50, 10/04, page 395 of 610
Note: In a delayed branch, the actual branch operation occurs after execution of the slot
instruction, but instruction execution (register updating, etc.) is in fact performed in
delayed branch instruction → delay slot instruction order. For example, even if the register
holding the branch destination address is modified in the delay slot, the branch destination
address will still be the register contents prior to the modification.
Possible Exceptions:
• General illugal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 396 of 610
11.1.58 RTS (Return from Subroutine): Branch Instruction
Format Operation Instruction Code Cycle T Bit
RTS PR → PC 0000000000001011 1 —
Description: This instruction returns from a subroutine procedure by restoring the PC from PR.
Processing continues from the address indicated by the restored PC value. This instruction can be
used to return from a subroutine procedure called by a BSR or JSR instruction to the source of the
call.
Notes: As this is a delayed branch instruction, the instruction following this instruction is executed
before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. If the following
instruction is a branch instruction, it is identified as a slot illegal instruction.
The instruction that restores PR must be executed before the RTS instruction. This restore
instruction cannot be in the RTS delay slot.
Operation:
RTS( ) /* RTS */
{
unsigned int temp;
temp = PC;
PC = PR;
Delay_Slot(temp+2);
}
Rev. 1.50, 10/04, page 397 of 610
Example:
MOV.L TABLE,R3 ;R3 = TRGET address
JSR @R3 ; Branch to TRGET.
NOP ;NOP executed before branch.
ADD R0,R1 ;← Subroutine procedure return destination (PR contents)
........
TABLE: .data.l TRGET ;Jump table
........
TRGET: MOV R1,R0 ;← Entry to procedure
RTS ;PR contents → PC
MOV #12,R0 ;MOV executed before branch.
Possible Exceptions:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 398 of 610
11.1.59 SETS (Set S Bit): System Control Instruction
Format Operation Instruction Code Cycle T Bit
SETS 1 → S 0000000001011000 1 —
Description: This instruction sets the S bit to 1.
Notes: None
Operation:
SETS( ) /* SETS */
{
S = 1;
PC += 2;
}
Example:
SETS ;Before execution S = 0
;After execution S = 1
Rev. 1.50, 10/04, page 399 of 610
11.1.60 SETT (Set T Bit): System Control Instruction
Format Operation Instruction Code Cycle T Bit
SETT 1 → T 0000000000011000 1 1
Description: This instruction sets the T bit to 1.
Notes: None
Operation:
SETT( ) /* SETT */
{
T = 1;
PC += 2;
}
Example:
SETT ;Before execution T = 0
;After execution T = 1
Rev. 1.50, 10/04, page 400 of 610
11.1.61 SHAD (Shift Arithmetic Dynamically): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHAD Rm, Rn When Rm ≥ 0,
Rn << Rm → Rn
When Rm < 0,
Rn >> Rm → [MSB → Rn]
0100nnnnmmmm1100 1 —
Description: This instruction arithmetically shifts the contents of general register Rn. General
register Rm specifies the shift direction and the number of bits to be shifted.
Rn register contents are shifted to the left if the Rm register value is positive, and to the right if
negative. In a shift to the right, the MSB is added at the upper end.
The number of bits to be shifted is specified by the lower 5 bits (bits 4 to 0) of the Rm register. If
the value is negative (MSB = 1), the Rm register is represented as a two's complement. The left
shift range is 0 to 31, and the right shift range, 1 to 32.
MSB LSB
0
MSB
Rm ≥ 0
Rm < 0
MSB LSB
Notes: None
Rev. 1.50, 10/04, page 401 of 610
Operation:
SHAD(int m, int n) /*SHAD Rm,Rn */
{
int sgn = R[m] & 0x80000000;
if (sgn==0)
R[n] <<= (R[m] & 0x1F);
else if ((R[m] & 0x1F) == 0) {
if ((R[n] & 0x80000000) == 0)
R[n] = 0;
else
R[n] = 0xFFFFFFFF;
}
else
R[n] = (long)R[n] >> ((~R[m] & 0x1F)+1);
PC += 2;
}
Example:
SHAD R1,R2 ;Before execution R1 = H'FFFFFFEC, R2 = H'80180000
;After execution R1 = H'FFFFFFEC, R2 = H'FFFFF801
SHAD R3,R4 ;Before execution R3 = H'00000014, R4 = H'FFFFF801
;After execution R3 = H'00000014, R4 = H'80100000
Rev. 1.50, 10/04, page 402 of 610
11.1.62 SHAL (Shift Arithmetic Left): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHAL Rn T ← Rn ← 0 0100nnnn00100000 1 MSB
Description:
This instruction arithmetically shifts the contents of general register Rn one bit to the left, and
stores the result in Rn. The bit shifted out of the operand is transferred to the T bit.
MSB LSB
SHAL T 0
Notes: None
Operation:
SHAL(long n) /* SHAL Rn (Same as SHLL) */
{
if ((R[n]&0x80000000)==0) T = 0;
else T = 1;
R[n] <<= 1;
PC += 2;
}
Example:
SHAL R0 ;Before execution R0 = H'80000001, T = 0
;After execution R0 = H'00000002, T = 1
Rev. 1.50, 10/04, page 403 of 610
11.1.63 SHAR (Shift Arithmetic Right): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHAR Rn MSB → Rn → T 0100nnnn00100001 1 LSB
Description:
This instruction arithmetically shifts the contents of general register Rn one bit to the right, and
stores the result in Rn. The bit shifted out of the operand is transferred to the T bit.
MSB LSB
SHAR T
Notes: None
Operation:
SHAR(long n) /* SHAR Rn */
{
long temp;
if ((R[n]&0x00000001)==0) T = 0;
else T = 1;
if ((R[n]&0x80000000)==0) temp = 0;
else temp = 1;
R[n] >>= 1;
if (temp==1) R[n] |= 0x80000000;
else R[n] &= 0x7FFFFFFF;
PC += 2;
}
Example:
SHAR R0 ;Before execution R0 = H'80000001, T = 0
;After execution R0 = H'C0000000, T = 1
Rev. 1.50, 10/04, page 404 of 610
11.1.64 SHLD (Shift Logical Dynamically): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHLD Rm, Rn When Rm ≥ 0,
Rn << Rm → Rn
When Rm < 0,
Rn >> Rm → [0 → Rn]
0100nnnnmmmm1101 1 —
Description: This instruction logically shifts the contents of general register Rn. General register
Rm specifies the shift direction and the number of bits to be shifted.
Rn register contents are shifted to the left if the Rm register value is positive, and to the right if
negative. In a shift to the right, 0s are added at the upper end.
The number of bits to be shifted is specified by the lower 5 bits (bits 4 to 0) of the Rm register. If
the value is negative (MSB = 1), the Rm register is represented as a two's complement. The left
shift range is 0 to 31, and the right shift range, 1 to 32.
MSB LSB
MSB
0
LSB
0
Rm ≥ 0
Rm < 0
Notes: None
Rev. 1.50, 10/04, page 405 of 610
Operation:
SHLD(int m, int n)/*SHLD Rm,Rn */
{
int sgn = R[m] & 0x80000000;
if (sgn == 0)
R[n] <<= (R[m] & 0x1F);
else if ((R[m] & 0x1F) == 0)
R[n] = 0;
else
R[n] = (unsigned)R[n] >> ((~R[m] & 0x1F)+1);
PC += 2;
}
Example:
SHLD R1, R2 ;Before execution R1 = H'FFFFFFEC, R2 = H'80180000
;After execution R1 = H'FFFFFFEC, R2 = H'00000801
SHLD R3, R4 ;Before execution R3 = H'00000014, R4 = H'FFFFF801
;After execution R3 = H'00000014, R4 = H'80100000
Rev. 1.50, 10/04, page 406 of 610
11.1.65 SHLL (Shift Logical Left ): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHLL Rn T ← Rn ← 0 0100nnnn00000000 1 MSB
Description: This instruction logically shifts the contents of general register Rn one bit to the left,
and stores the result in Rn. The bit shifted out of the operand is transferred to the T bit.
MSB LSB
SHLL T 0
Notes: None
Operation:
SHLL(long n) /* SHLL Rn (Same as SHAL) */
{
if ((R[n]&0x80000000)==0) T = 0;
else T = 1;
R[n] <<= 1;
PC += 2;
}
Example:
SHLL R0 ;Before execution R0 = H'80000001, T = 0
;After execution R0 = H'00000002, T = 1
Rev. 1.50, 10/04, page 407 of 610
11.1.66 SHLLn (n bits Shift Logical Left): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHLL2 Rn Rn<<2 → Rn 0100nnnn00001000 1 —
SHLL8 Rn Rn<<8 → Rn 0100nnnn00011000 1 —
SHLL16 Rn Rn<<16 → Rn 0100nnnn00101000 1 —
Description: This instruction logically shifts the contents of general register Rn 2, 8, or 16 bits to
the left, and stores the result in Rn. The bits shifted out of the operand are discarded.
MSB LSB
0
SHLL8
SHLL16 MSB LSB
0
MSB LSB
0
SHLL2
Notes: None
Rev. 1.50, 10/04, page 408 of 610
Operation:
SHLL2(long n) /* SHLL2 Rn */
{
R[n] <<= 2;
PC += 2;
}
SHLL8(long n) /* SHLL8 Rn */
{
R[n] <<= 8;
PC += 2;
}
SHLL16(long n) /* SHLL16 Rn */
{
R[n] <<= 16;
PC += 2;
}
Example:
SHLL2 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'48D159E0
SHLL8 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'34567800
SHLL16 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'56780000
Rev. 1.50, 10/04, page 409 of 610
11.1.67 SHLR (Shift Logical Right): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHLR Rn 0 → Rn → T 0100nnnn00000001 1 LSB
Description: This instruction logically shifts the contents of general register Rn one bit to the
right, and stores the result in Rn. The bit shifted out of the operand is transferred to the T bit.
MSB LSB
SHLR 0 T
Notes: None
Operation:
SHLR(long n) /* SHLR Rn */
{
if ((R[n] & 0x00000001)==0) T = 0;
else T = 1;
R[n] >>= 1;
R[n] &= 0x7FFFFFFF;
PC += 2;
}
Example:
SHLR R0 ;Before execution R0 = H'80000001, T = 0
;After execution R0 = H'40000000, T = 1
Rev. 1.50, 10/04, page 410 of 610
11.1.68 SHLRn (n bits Shift Logical Right): Shift Instruction
Format Operation Instruction Code Cycle T Bit
SHLR2 Rn Rn>>2 → Rn 0100nnnn00001001 1 —
SHLR8 Rn Rn>>8 → Rn 0100nnnn00011001 1 —
SHLR16 Rn Rn>>16 → Rn 0100nnnn00101001 1 —
Description: This instruction logically shifts the contents of general register Rn 2, 8, or 16 bits to
the right, and stores the result in Rn. The bits shifted out of the operand are discarded.
MSB LSB
0
SHLR8
SHLR16 MSB LSB
0
MSB LSB
0
SHLR2
Notes: None
Rev. 1.50, 10/04, page 411 of 610
Operation:
SHLR2(long n) /* SHLR2 Rn */
{
R[n] >>= 2;
R[n] &= 0x3FFFFFFF;
PC += 2;
}
SHLR8(long n) /* SHLR8 Rn */
{
R[n] >>= 8;
R[n] &= 0x00FFFFFF;
PC += 2;
}
SHLR16(long n) /* SHLR16 Rn */
{
R[n] >>= 16;
R[n] &= 0x0000FFFF;
PC += 2;
}
Example:
SHLR2 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'048D159E
SHLR8 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'00123456
SHLR16 R0 ;Before execution R0 = H'12345678
;After execution R0 = H'00001234
Rev. 1.50, 10/04, page 412 of 610
11.1.69 SLEEP (Sleep): System Control Instruction (Privileged Instruction)
Format Operation Instruction Code Cycle T Bit
SLEEP Sleep or standby 0000000000011011 Undefine
d
Description: This instruction places the CPU in the power-down state.
In power-down mode, the CPU retains its internal state, but immediately stops executing
instructions and waits for an interrupt request. When it receives an interrupt request, the CPU exits
the power-down state.
SLEEP is a privileged instruction, and can only be used in privileged mode. Use of this instruction
in user mode will cause an illegal instruction exception.
Notes: SLEEP performance depends on the standby control register (STBCR). See Power-Down
Modes in the target product's hardware manual, for details.
Operation:
SLEEP( ) /* SLEEP */
{
Sleep_standby();
}
Example:
SLEEP ;Transition to power-down mode
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 413 of 610
11.1.70 STC (Store Control Register): System Control Instruction (Privileged Instruction)
Format Operation Instruction Code Cycle T Bit
STC GBR, Rn GBR → Rn 0000nnnn00010010 1 —
STC VBR, Rn VBR → Rn 0000nnnn00100010 1 —
STC SSR, Rn SSR → Rn 0000nnnn00110010 1 —
STC SPC, Rn SPC → Rn 0000nnnn01000010 1 —
STC SGR, Rn SGR → Rn 0000nnnn00111010 1 —
STC DBR, Rn DBR → Rn 0000nnnn11111010 1 —
STC R0_BANK, Rn R0_BANK → Rn 0000nnnn10000010 1 —
STC R1_BANK, Rn R1_BANK → Rn 0000nnnn10010010 1 —
STC R2_BANK, Rn R2_BANK → Rn 0000nnnn10100010 1 —
STC R3_BANK, Rn R3_BANK → Rn 0000nnnn10110010 1 —
STC R4_BANK, Rn R4_BANK → Rn 0000nnnn11000010 1 —
STC R5_BANK, Rn R5_BANK → Rn 0000nnnn11010010 1 —
STC R6_BANK, Rn R6_BANK → Rn 0000nnnn11100010 1 —
STC R7_BANK, Rn R7_BANK → Rn 0000nnnn11110010 1 —
STC.L GBR, @-Rn Rn-4 → Rn, GBR → (Rn) 0100nnnn00010011 1 —
STC.L VBR, @-Rn Rn-4 → Rn, VBR → (Rn) 0100nnnn00100011 1 —
STC.L SSR, @-Rn Rn-4 → Rn, SSR → (Rn) 0100nnnn00110011 1 —
STC.L SPC, @-Rn Rn-4 → Rn, SPC → (Rn) 0100nnnn01000011 1 —
STC.L SGR, @-Rn Rn-4 → Rn, SGR → (Rn) 0100nnnn00110010 1 —
STC.L DBR, @-Rn Rn-4 → Rn, DBR → (Rn) 0100nnnn11110010 1 —
STC.L R0_BANK, @-Rn Rn-4 → Rn, R0_BANK → (Rn) 0100nnnn10000011 1 —
STC.L R1_BANK, @-Rn Rn-4 → Rn, R1_BANK → (Rn) 0100nnnn10010011 1 —
STC.L R2_BANK, @-Rn Rn-4 → Rn, R2_BANK → (Rn) 0100nnnn10100011 1 —
STC.L R3_BANK, @-Rn Rn-4 → Rn, R3_BANK → (Rn) 0100nnnn10110011 1 —
STC.L R4_BANK, @-Rn Rn-4 → Rn, R4_BANK → (Rn) 0100nnnn11000011 1 —
STC.L R5_BANK, @-Rn Rn-4 → Rn, R5_BANK → (Rn) 0100nnnn11010011 1 —
STC.L R6_BANK, @-Rn Rn-4 → Rn, R6_BANK → (Rn) 0100nnnn11100011 1 —
STC.L R7_BANK, @-Rn Rn-4 → Rn, R7_BANK → (Rn) 0100nnnn11110011 1 —
Description: This instruction stores control register GBR, VBR, SSR, SPC, SGR, DBR or
Rm_BANK (m = 07) in the destination.
Rm_BANK operands are specified by the RB bit of the SR register:
when the RB bit is 1 Rm_BANK0 is accessed,
when the RB bit is 0 Rm_BANK1 is accessed.
Rev. 1.50, 10/04, page 414 of 610
Notes: STC/STC.L can only be used in privileged mode excepting STC GBR, Rn/STC.L GBR,
@-Rn. Use of these instructions in user mode will cause illegal instruction exceptions.
Operation:
STCGBR(int n) /* STC GBR,Rn */
{
R[n] = GBR;
PC += 2;
}
STCVBR(int n) /* STC VBR,Rn : Privileged */
{
R[n] = VBR;
PC += 2;
}
STCSSR(int n) /* STC SSR,Rn : Privileged */
{
R[n] = SSR;
PC += 2;
}
STCSPC(int n) /* STC SPC,Rn : Privileged */
{
R[n] = SPC;
PC += 2;
}
STCSGR(int n) /* STC SGR,Rn : Privileged */
{
R[n] = SGR;
PC += 2;
}
Rev. 1.50, 10/04, page 415 of 610
STCDBR(int n) /* STC DBR,Rn : Privileged */
{
R[n] = DBR;
PC += 2;
}
STCRm_BANK(int n) /* STC Rm_BANK,Rn : Privileged */
/* m=07 */
{
R[n] = Rm_BANK;
PC += 2;
}
STCMGBR(int n) /* STC.L GBR,@Rn */
{
R[n] = 4;
Write_Long(R[n],GBR);
PC += 2;
}
STCMVBR(int n) /* STC.L VBR,@-Rn : Privileged */
{
R[n] = 4;
Write_Long(R[n],VBR);
PC += 2;
}
STCMSSR(int n) /* STC.L SSR,@-Rn : Privileged */
{
R[n] = 4;
Write_Long(R[n],SSR);
PC += 2;
}
Rev. 1.50, 10/04, page 416 of 610
STCMSPC(int n) /* STC.L SPC,@-Rn : Privileged */
{
R[n] = 4;
Write_Long(R[n],SPC);
PC += 2;
}
STCMSGR(int n) /* STC.L SGR,@-Rn : Privileged */
{
R[n] = 4;
Write_Long(R[n],SGR);
PC += 2;
}
STCMDBR(int n) /* STC.L DBR,@-Rn : Privileged */
{
R[n] = 4;
Write_Long(R[n],DBR);
PC += 2;
}
STCMRm_BANK(int n) /* STC.L Rm_BANK,@-Rn : Privileged */
/* m=07 */
{
R[n] = 4;
Write_Long(R[n],Rm_BANK);
PC += 2;
}
Possible Exceptions:
• Data TLB multiple-hit exception
• General illegal instruction exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Rev. 1.50, 10/04, page 417 of 610
11.1.71 STS (Store System Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
STS MACH,Rn MACH → Rn 0000nnnn00001010 1 —
STS MACL,Rn MACL → Rn 0000nnnn00011010 1 —
STS PR,Rn PR → Rn 0000nnnn00101010 1 —
STS.L MACH,@-Rn Rn - 4 → Rn, MACH → (Rn) 0100nnnn00000010 1 —
STS.L MACL,@-Rn Rn - 4 → Rn, MACL → (Rn) 0100nnnn00010010 1 —
STS.L PR,@-Rn Rn - 4 → Rn, PR → (Rn) 0100nnnn00100010 1 —
Description: This instruction stores system register MACH, MACL, or PR in the destination.
Notes: None
Operation:
STSMACH(int n) /* STS MACH,Rn */
{
R[n] = MACH;
PC += 2;
}
STSMACL(int n) /* STS MACL,Rn */
{
R[n] = MACL;
PC += 2;
}
STSPR(int n) /* STS PR,Rn */
{
R[n] = PR;
PC += 2;
}
Rev. 1.50, 10/04, page 418 of 610
STSMMACH(int n) /* STS.L MACH,@-Rn */
{
R[n] = 4;
Write_Long(R[n],MACH);
PC += 2;
}
STSMMACL(int n) /* STS.L MACL,@-Rn */
{
R[n] = 4;
Write_Long(R[n],MACL);
PC += 2;
}
STSMPR(int n) /* STS.L PR,@-Rn */
{
R[n] = 4;
Write_Long(R[n],PR);
PC += 2;
}
Example:
STS MACH,R0 ; Before execution R0 = H'FFFFFFFF, MACH = H'00000000
; After execution R0 = H'00000000
STS.L PR,@-R15 ; Before execution R15 = H'10000004
; After execution R15 = H'10000000, (R15) = PR
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Rev. 1.50, 10/04, page 419 of 610
11.1.72 SUB (Subtract Binary): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
SUB Rm,Rn Rn - Rm → Rn 0011nnnnmmmm1000 1 —
Description: This instruction subtracts the contents of general register Rm from the contents of
general register Rn and stores the result in Rn. For immediate data subtraction, ADD #imm,Rn
should be used.
Notes: None
Operation:
SUB(long m, long n) /* SUB Rm,Rn */
{
R[n] -= R[m];
PC += 2;
}
Example:
SUB R0,R1 ;Before execution R0 = H'00000001, R1 = H'80000000
;After execution R1 = H'7FFFFFFF
Rev. 1.50, 10/04, page 420 of 610
11.1.73 SUBC (Subtract with Carry): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
SUBC Rm,Rn Rn - Rm-T → Rn, borrow → T 0011nnnnmmmm1010 1 Borrow
Description: This instruction subtracts the contents of general register Rm and the T bit from the
contents of general register Rn, and stores the result in Rn. A borrow resulting from the operation
is reflected in the T bit. This instruction is used for subtractions exceeding 32 bits.
Notes: None
Operation:
SUBC(long m, long n) /* SUBC Rm,Rn */
{
unsigned long tmp0,tmp1;
tmp1 = R[n] - R[m];
tmp0 = R[n];
R[n] = tmp1 - T;
if (tmp0<tmp1) T = 1;
else T = 0;
if (tmp1<R[n]) T = 1;
PC += 2;
}
Example:
CLRT ;R0:R1(64 bits) R2:R3(64 bits) = R0:R1(64 bits)
SUBC R3,R1 ;Before execution T = 0, R1 = H'00000000, R3 = H'00000001
;After execution T = 1, R1 = H'FFFFFFFF
SUBC R2,R0 ;Before execution T = 1, R0 = H'00000000, R2 = H'00000000
;After execution T = 1, R0 = H'FFFFFFFF
Rev. 1.50, 10/04, page 421 of 610
11.1.74 SUBV (Subtract with (V flag) Underflow Check): Arithmetic Instruction
Format Operation Instruction Code Cycle T Bit
SUBV Rm,Rn Rn - Rm → Rn, underflow → T 0011nnnnmmmm1011 1 Underflow
Description: This instruction subtracts the contents of general register Rm from the contents of
general register Rn, and stores the result in Rn. If underflow occurs, the T bit is set.
Notes: None
Operation:
SUBV(long m, long n) /* SUBV Rm,Rn */
{
long dest,src,ans;
if ((long)R[n]>=0) dest = 0;
else dest = 1;
if ((long)R[m]>=0) src = 0;
else src = 1;
src += dest;
R[n] -= R[m];
if ((long)R[n]>=0) ans = 0;
else ans = 1;
ans += dest;
if (src==1) {
if (ans==1) T = 1;
else T = 0;
}
else T = 0;
PC += 2;
}
Example:
SUBV R0,R1 ;Before execution R0 = H'00000002, R1 = H'80000001
;After execution R1 = H'7FFFFFFF, T = 1
SUBV R2,R3 ;Before execution R2 = H'FFFFFFFE, R3 = H'7FFFFFFE
;After execution R3 = H'80000000, T = 1
Rev. 1.50, 10/04, page 422 of 610
11.1.75 SWAP (Swap Register Halves): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
SWAP.B Rm,Rn Rm → lower-2-byte upper-/
lower-byte swap → Rn
0110nnnnmmmm1000 1 —
SWAP.W Rm,Rn Rm → upper-/
lower-word swap → Rn
0110nnnnmmmm1001 1
Description: This instruction swaps the upper and lower parts of the contents of general register
Rm, and stores the result in Rn.
In the case of a byte specification, the 8 bits from bit 15 to bit 8 of Rm are swapped with the 8 bits
from bit 7 to bit 0. The upper 16 bits of Rm are transferred directly to the upper 16 bits of Rn.
In the case of a word specification, the 16 bits from bit 31 to bit 16 of Rm are swapped with the 16
bits from bit 15 to bit 0.
Notes: None
Operation:
SWAPB(long m, long n) /* SWAP.B Rm,Rn */
{
unsigned long temp0,temp1;
temp0 = R[m] & 0xFFFF0000;
temp1 = (R[m] & 0x000000FF) << 8;
R[n] = (R[m] & 0x0000FF00) >> 8;
R[n] = R[n] | temp1 | temp0;
PC += 2;
}
SWAPW(long m, long n) /* SWAP.W Rm,Rn */
{
unsigned long temp;
temp = (R[m]>>16)&0x0000FFFF;
R[n] = R[m]<<16;
R[n] |= temp;
PC += 2;
}
Rev. 1.50, 10/04, page 423 of 610
Example:
SWAP.B R0,R1 ;Before execution R0 = H'12345678
;After execution R1 = H'12347856
SWAP.W R0,R1 ;Before execution R0 = H'12345678
;After execution R1 = H'56781234
Rev. 1.50, 10/04, page 424 of 610
11.1.76 SYNCO (Synchronize Data Operation): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
SYNCO Data accesses invoked by the
following instruction are not
executed until execution of data
accesses which precede this
instruction has been completed.
0000000010101011 Undefined —
Description: This instruction is used to synchronize data operations. When this instruction is
executed, the subsequent bus accesses are not executed until the execution of all preceding bus
accesses has been completed.
Notes: The SYNCO instruction can not guarantee the ordering of receipt timing which is notified
by the memory-mapped peripheral resources through the method except bus when the register is
changed by bus accesses. Refer to the description of each registers to guarantee this ordering.
Operation:
SYNCO() /* SYNCO*/
{
synchronize_data_operaiton();
PC += 2;
}
Example:
1. Ordering access to memory areas which are shared with other memory users
2. Flushing all write buffers
3. Stopping memory-access operations from merging and becoming ineffective
4. Waiting for the completion of cache-control instructions
Rev. 1.50, 10/04, page 425 of 610
11.1.77 TAS (Test And Set): Logical Instruction
Format Operation Instruction Code Cycle T Bit
TAS.B @Rn If (Rn) = 0, 1 → T, else 0 → T
1 → MSB of (Rn)
0100nnnn00011011 4 Test
result
Description: This instruction purges the cache block corresponding to the memory area specified
by the contents of general register Rn, reads the byte data indicated by that address, and sets the T
bit to 1 if that data is zero, or clears the T bit to 0 if the data is nonzero. The instruction then sets
bit 7 to 1 and writes to the same address. The bus is not released during this period.
The purge operation is executed as follows.
In a purge operation, data is accessed using the contents of general register Rn as the effective
address. If there is a cache hit and the corresponding cache block is dirty (U bit = 1), the contents
of that cache block are written back to external memory, and the cache block is then invalidated
(by clearing the V bit to 0). If there is a cache hit and the corresponding cache block is clean (U bit
= 0), the cache block is simply invalidated (by clearing the V bit to 0). A purge is not executed in
the event of a cache miss, or if the accessed memory location is non-cacheable.
The two TAS.B memory accesses are executed automatically. Another memory access is not
executed between the two TAS.B accesses.
Notes: None
Operation:
TAS(int n) /* TAS.B @Rn */
{
int temp;
temp = (int)Read_Byte(R[n]); /* Bus Lock */
if (temp==0) T = 1;
else T = 0;
temp |= 0x00000080;
Write_Byte(R[n],temp); /* Bus unlock */
PC += 2;
}
Rev. 1.50, 10/04, page 426 of 610
Possible Exceptions:
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Exceptions are checked taking a data access by this instruction as a byte load and a byte store.
Rev. 1.50, 10/04, page 427 of 610
11.1.78 TRAPA (Trap Always): System Control Instruction
Format Operation Instruction Code Cycle T Bit
TRAPA #imm Imm<<2 → TRA, PC + 2 → SPC,
SR → SSR, R15 → SGR,
1 → SR.MD/BL/RB,
H'160 → EXPEVT,
VBR + H'00000100 → PC
11000011iiiiiiii 13 —
Description: This instruction starts trap exception handling. The values of (PC + 2), SR, and R15
are saved to SPC, SSR and SGR, and 8-bit immediate data is stored in the TRA register (bits 9 to
2). The processor mode is switched to privileged mode (the MD bit in SR is set to 1), and the BL
bit and RB bit in SR are set to 1. As a result, exception and interrupt requests are masked (not
accepted), and the BANK1 registers (R0_BANK1 to R7_BANK1) are selected. Exception code
H'160 is written to the EXPEVT register (bits 11 to 0). The program branches to address (VBR +
H'00000100), indicated by the sum of the VBR register contents and offset H'00000100.
Notes: None
Operation:
TRAPA(int i) /* TRAPA #imm */
{
int imm;
imm = (0x000000FF & i);
TRA = imm<<2;
SSR = SR;
SPC = PC+2;
SGR = R15;
SR.MD = 1;
SR.BL = 1;
SR.RB=1;
EXPEVT = 0x00000160;
PC = VBR + 0x00000100;
}
Possible Exceptions:
• Unconditional trap
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 428 of 610
11.1.79 TST (Test Logical): Logical Instruction
Format Operation Instruction Code Cycle T Bit
TST Rm,Rn Rn & Rm; if result is 0,
1 → T, else 0 → T
0010nnnnmmmm1000 1 Test
result
TST #imm,R0 R0 & imm; if result is 0,
1 → T, else 0 → T
11001000iiiiiiii 1 Test
result
TST.B #imm,@(R0,GBR) (R0 + GBR) & imm;
if result is 0, 1 → T,
else 0 → T
11001100iiiiiiii 3 Test
result
Description: This instruction ANDs the contents of general registers Rn and Rm, and sets the T
bit if the result is zero. If the result is nonzero, the T bit is cleared. The contents of Rn are not
changed.
This instruction can be used to AND general register R0 contents with zero-extended 8-bit
immediate data, or, in indexed GBR indirect addressing mode, to AND 8-bit memory with 8-bit
immediate data. The contents of R0 or the memory are not changed.
Notes: None
Operation:
TST(long m, long n) /* TST Rm,Rn */
{
if ((R[n]&R[m])==0) T = 1;
else T = 0;
PC += 2;
}
TSTI(long i) /* TST #imm,R0 */
{
long temp;
temp = R[0]&(0x000000FF & (long)i);
if (temp==0) T = 1;
else T = 0;
PC += 2;
}
Rev. 1.50, 10/04, page 429 of 610
TSTM(long i) /* TST.B #imm,@(R0,GBR) */
{
long temp;
temp = (long)Read_Byte(GBR+R[0]);
temp &= (0x000000FF & (long)i);
if (temp==0) T = 1;
else T = 0;
PC += 2;
}
Example:
TST R0,R0 ;Before execution R0 = H'00000000
;After execution T = 1
TST #H'80,R0 ;Before execution R0 = H'FFFFFF7F
;After execution T = 1
TST.B #H'A5,@(R0,GBR) ;Before execution (R0,GBR) = H'A5
;After execution T = 0
Possible Exceptions: Exceptions may occur when TST.B instruction is executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Exceptions are checked taking a data access by this instruction as a byte load and a byte store.
Rev. 1.50, 10/04, page 430 of 610
11.1.80 XOR (Exclusive OR Logical): Logical Instruction
Format Operation Instruction Code Cycle T Bit
XOR Rm,Rn Rn ^ Rm → Rn 0010nnnnmmmm1010 1 —
XOR #imm,R0 R0 ^ imm → R0 11001010iiiiiiii 1 —
XOR.B #imm,@(R0,GBR) (R0 + GBR)^imm →
(R0 + GBR)
11001110iiiiiiii 3 —
Description: This instruction exclusively ORs the contents of general registers Rn and Rm, and
stores the result in Rn.
This instruction can be used to exclusively OR register R0 contents with zero-extended 8-bit
immediate data, or, in indexed GBR indirect addressing mode, to exclusively OR 8-bit memory
with 8-bit immediate data.
Notes: None
Operation:
XOR(long m, long n) /* XOR Rm,Rn */
{
R[n] ^= R[m];
PC += 2;
}
XORI(long i) /* XOR #imm,R0 */
{
R[0] ^= (0x000000FF & (long)i);
PC += 2;
}
XORM(long i) /* XOR.B #imm,@(R0,GBR) */
{
int temp;
temp = (long)Read_Byte(GBR+R[0]);
temp ^= (0x000000FF &(long)i);
Write_Byte(GBR+R[0],temp);
PC += 2;
}
Rev. 1.50, 10/04, page 431 of 610
Example:
XOR R0,R1 ;Before execution R0 = H'AAAAAAAA, R1 = H'55555555
;After execution R1 = H'FFFFFFFF
XOR #H'F0,R0 ;Before execution R0 = H'FFFFFFFF
;After execution R0 = H'FFFFFF0F
XOR.B #H'A5,@(R0,GBR) ;Before execution (R0,GBR) = H'A5
;After execution (R0,GBR) = H'00
Possible Exceptions: Exceptions may occur when XOR.B instruction is executed.
• Data TLB multiple-hit exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Exceptions are checked taking a data access by this instruction as a byte load and a byte store.
Rev. 1.50, 10/04, page 432 of 610
11.1.81 XTRCT (Extract): Data Transfer Instruction
Format Operation Instruction Code Cycle T Bit
XTRCT Rm,Rn Middle 32 bits of Rm:Rn → Rn 0010nnnnmmmm1101 1 —
Description: This instruction extracts the middle 32 bits from the 64-bit contents of linked general
registers Rm and Rn, and stores the result in Rn.
MSB
Rm Rn
Rn
MSB LSB LSB
Notes: None
Operation:
XTRCT(long m, long n) /* XTRCT Rm,Rn */
{
unsigned long temp;
temp = (R[m]<<16) & 0xFFFF0000;
R[n] = (R[n]>>16) & 0x0000FFFF;
R[n] |= temp;
PC += 2;
}
Example:
XTRCT R0,R1 ;Before execution R0 = H'01234567, R1 = H'89ABCDEF
;After execution R1 = H'456789AB
Rev. 1.50, 10/04, page 433 of 610
11.2 CPU Instructions (DSP related)
Of the SH4AL-DSP's CPU instructions, those which support the DSP or differ functionally from
those of the SH-4A are described in this section.
Rev. 1.50, 10/04, page 434 of 610
11.2.1 BSR (Branch to Subroutine): Branch Instruction (Delayed Branch Instruction)
Format Operation Instruction Code Cycle T Bit
BSR label PC + 4/6 → PR,
PC + 4 + disp × 2 → PC
1011dddddddddddd 1 
Description: This instruction branches to the address (PC + 4 + displacement × 2) and stores the
address (PC + 4) or (PC + 6) in the PR. When the delay-slot instruction of a BSR is a 32-bit DSP
instruction, 6 is added; in other cases, 4 is added. The PC's source value is the address of the BSR
instruction. The 12-bit displacement is sign-extended and doubled. Consequently, the relative
interval from the branch destination is 4096 to +4094 bytes. If this displacement is too small to
reach the branch destination, the JSR instruction must be used instead.
Note: Since this is a delayed branch instruction, the instruction after BSR is executed before
branching. No interrupts are accepted between this instruction and the next instruction. If the next
instruction is a branch instruction, it is acknowledged as an illegal slot instruction.
Operation:
BSR(int d) /* BSR disp */
{
int disp;
unsigned int temp;
temp = PC;
if((d&0x800) == 0)
disp = (0x00000FFF & d);
else disp = (0xFFFFF000 | d);
if(is_32bit_instruction(temp+2))
PR = PC + 6;
else PR = PC + 4;
PC = PC + 4 + (disp << 1);
Delay_Slot(temp + 2);
}
Rev. 1.50, 10/04, page 435 of 610
Examples:
BSR TRGET ;Branches to TRGET
MOV R3,R4 ;Executes the MOV instruction before branching
ADD R0,R1 ;← Return address for when the subroutine procedure is
completed (PR data))
.......
.......
TRGET: ;← Procedure entrance
MOV R2,R3
RTS ;Returns to the above ADD instruction
MOV #1,R0 ;Executes MOV before branching
Possible Exception:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 436 of 610
11.2.2 BSRF (Branch to Subroutine Far): Branch Instruction (Derayed Branch
Instruction)
Format Operation Instruction Code Cycle T Bit
BSRF Rn PC + 4/6 → PR,
PC + 4 + Rn → PC
0000nnnn00000011 1 
Description: This instruction branches to the address (PC + 4 + Rn) and stores the address (PC +
4) or (PC + 6) in the PR. When the delay-slot instruction of a BSRF is a 32-bit DSP instruction, 6
is added; in other cases, 4 is added. The PC's source value is the address of the BSRF instruction.
The branch destination is the address (PC + 4) + (32 bits of general register Rn).
Note: Since this is a delayed branch instruction, the instruction after BSR is executed before
branching. No interrupts are accepted between this instruction and the next instruction. If the next
instruction is a branch instruction, it is acknowledged as an illegal slot instruction.
Operation:
BSRF(int n) /* BSRF Rn */
{
unsigned int temp;
temp = PC;
if(is_32bit_instruction(temp+2))
PR = PC +6;
else PR = PC + 4;
PC = PC + 4 + R[n];
Delay_Slot(temp+2);
}
Rev. 1.50, 10/04, page 437 of 610
Examples:
MOV.L #(TARGET-BSRF_PC),R0 ;Sets displacement.
BRSF @R0 ;Branches to TARGET
MOV R3,R4 ;Executes the MOV instruction before
BSRF_PC: ;
ADD R0,R1
.....
TARGET: ;←Procedure entrance
MOV R2,R3
RTS ;Returns to the above ADD instruction
MOV #1,R0 ;Executes MOV before branching
Possible Exception:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 438 of 610
11.2.3 CLRDMXY (Clear DMX DMY): System Control Instruction
Format Operation Instruction Code Cycle T Bit
CLRDMXY 0 → DMX (SR[10])
0 → DMY (SR[11])
0000000010001000 1 
Description: This instruction resets the DMX and DMY bits of the SR, and cancels X pointer
modulo addressing mode.
Note: When SR.DSP = 0, general illegal instruction exception occurs if CLRDMXY is executed
not in a delay slot, and slot illegal instruction occurs if CLRDMXY is executed in a delay slot.
Operation:
CLRDMXY( ) /* CLRDMXY */
{
SR.DMX=0;
SR.DMY=0;
PC += 2;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 439 of 610
11.2.4 JSR (Jump to Subroutine): Branch Instruction (Delayed Branch Instruction)
Format Operation Instruction Code Cycle T Bit
JSR @Rn PC + 4/6 → PR, Rn → PC 0100nnnn00001011 1 —
Description: This instruction makes a delayed branch to the subroutine procedure at the specified
address after execution of the following instruction. Return address (PC + 4) or (PC + 6) is saved
in PR, and a branch is made to the address indicated by general register Rn. JSR is used in
combination with RTS for subroutine procedure calls.
Notes: As this is a delayed branch instruction, the instruction following this instruction is executed
before the branch destination instruction.
Interrupts are not accepted between this instruction and the following instruction. If the following
instruction is a branch instruction, it is identified as a slot illegal instruction.
Operation:
JSR(int n) /* JSR @Rn */
{
unsigned int temp;
temp = PC;
if(is_32bit_instruction(temp+2))
PR = PC +6;
else PR = PC + 4;
PC = R[n];
Delay_Slot(temp+2);
}
Rev. 1.50, 10/04, page 440 of 610
Example:
MOV.L JSR_TABLE,R0 ;R0 = TRGET address
JSR @R0 ;Branch to TRGET.
XOR R1,R1 ;XOR executed before branch.
ADD R0,R1 ;← Procedure return destination (PR contents)
.......
.align 4
JSR_TABLE: .data.l TRGET ;Jump table
TRGET: NOP ;← Entry to procedure
MOV R2,R3 ;
RTS ;Return to above ADD instruction.
MOV #70,R1 ;MOV executed before RTS.
Possible Exception:
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 441 of 610
11.2.5 LDC (Load to Control Register): System Control Instruction (Some of these
instructions are usable as privileged instructions.Privileged Only)
Format Operation Instruction Code Cycle T Bit
LDC Rm,SR Rm → SR 0100mmmm00001110 4 LSB
LDC Rm,MOD Rm → MOD 0100mmmm01011110 1 —
LDC Rm,RE Rm → RE 0100mmmm01111110 1 —
LDC Rm,RS Rm → RS 0100mmmm01101110 1 —
LDC.L @Rm+,SR (Rm) → SR, Rm + 4 → Rm 0100mmmm00000111 4 LSB
LDC.L @Rm+,MOD (Rm) → MOD, Rm + 4 → Rm 0100mmmm01010111 1 —
LDC.L @Rm+,RE (Rm) → RE, Rm + 4 → Rm 0100mmmm01110111 1 —
LDC.L @Rm+,RS (Rm) → RS, Rm + 4 → Rm 0100mmmm01100111 1 —
Description: Stores source operand in control registers SR.
Notes: When the DSP bit of the SR register is cleared to 0, LDC Rm,SR and LDC.L @Rm,SR
become privileged instructions; this allows updating of all bits in the SR register. When the DSP
bit is set to 1 (in privileged DSP or user DSP mode) these instructions are not privileged and can
then be executed in user DSP mode. Note that only some bits (DSP-related bits) of the SR register
are writable in user DSP mode.
The other six instructions are executable in user mode.
When the LDC Rm,SR instruction or LDC.L @Rm+,SR instruction is placed in the delay-slot
immediately after a delayed branch instruction, the instructions are treated as slot illegal
instructions.
Operation:
LDCSR(long m) /* LDC Rm,SR : Privileged conditionally */
{
if(SR.MD==1)
{
SR = R[m] & 0x7FFF1FFF;
}
else if(SR.DSP==1)
{
SR = SR & 700003F3 | R[m] & 0x0FFF1C0C;
}
Rev. 1.50, 10/04, page 442 of 610
PC += 2;
}
LDCMOD(long m) /* LDC Rm,MOD */
{
MOD = R[m];
PC += 2;
}
LDCRE(long m) /* LDC Rm,RE */
{
RE = R[m];
PC += 2;
}
LDCRS(long m) /* LDC Rm,RS */
{
RS = R[m];
PC += 2;
}
LDCMSR(long m)/* LDC.L @Rm+,SR : Privileged conditionally */
{
if(SR.MD==1)
{
SR = Read_Long(R[m]) & 0x7FFF1FFF
}
else if(SR.DSP==1)
{
SR = SR & 700003F3 | Read_Long(R[m]) & 0x0FFF1C0C;
}
R[m] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 443 of 610
LDCMMOD(long m)/*LDC.L @Rm+,MOD */
{
MOD = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMRE(long m) /*LDC.L @Rm+,RE */
{
RE = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDCMRS(long m) /*LDC.L @Rm+,RS */
{
RS = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
Examples:
LDC R0,SR ;Before execution R0 = H'FFFFFFFF, SR = H'00000000
;After execution SR = H'70001FFF, T = 1
LDC.L @R15+,GBR ;Before execution R15 = H'10000000, @R15 + H'12345678,
GBR = H'EDCBA987
;After execution R15 = H'10000004, GBR = @H'10000000
Possible Exceptins:
• Data TLB multiple-hit exception
• General illegal instruction exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 444 of 610
11.2.6 LDRC (Load RC register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDRC
Rm
Rm[11:0] → RC (SR[27:16]),
1 → RE[0]
0100mmmm00110100
LDRC
#imm
0 → RC (SR[27:24])
imm → RC (SR[23:16])
1 → RE[0]
10001010iiiiiiii
2
2
Description: This instruction sets the repeat number to RC bits in SR register. If the operand is
register, the lower 12-bit of the register is set to the RC. If the operand is immediate number, the
8-bit immediate data is set to the RC and the upper 4-bit is filled with zeros. And the repeat
control flag is set to RF1 and RF0 bit in SR register. After LDRC instruction is executed, the LSB
of RE register is set to 1, and the next instructions are targeted as the extended repeat. For details,
see 6.3.2 Extended Repeat control Instructions.
Note: LDRC instruction has some restrictions. Refer to 6.3.2 Extended Repeat control Instructions
for more information.
Rev. 1.50, 10/04, page 445 of 610
Operation:
LDRC(long m) /* LDRC Rm*/
{
long temp;
temp = (R[m] & 0x00000FFF)<<16;
SR &= 0xF000FFFF;
SR |= temp;
RF1 = Repeat_Control_Flag1;
RF0 = Repeat_Control_Flag0;
PC += 2;
RE[0] = 1;
}
LDRCI(long i) /* LDRC #imm*/
{
long temp;
temp = (R[m] & 0x000000FF)<<16;
SR &= 0xF000FFFF;
SR |= temp;
RF1 = Repeat_Control_Flag1;
RF0 = Repeat_Control_Flag0;
PC += 2;
RE[0] = 1;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 446 of 610
11.2.7 LDRE (Load Effective Address to RE Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDRE @(disp*,PC) disp × 2 + PC → RE 10001110dddddddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (x1, x2, or x4) as
the displacement (disp).
Description: Stores the effective address of the source operand in the repeat end register RE. The
effective address is an address specified by PC + displacement. The PC is the address four bytes
after this instruction. The 8-bit displacement is sign-extended and doubled. Consequently, the
relative interval from the branch destination is 256 to +254 bytes.
Note: The effective address value designated for the RE reregister is different from the actual
repeat end address. Refer to table 6.5, RS and RE Setting Rule for the Convertion Repeat Control
in section 6, DSP Unit, for more information. When this instruction is arranged immediately after
the delayed branch instruction, PC becomes the "first address +2" of the branch destination.
If this instruction is executed in a delay slot, a slot illegal instruction exception occurs. And there
are some restrictions to use this instruction in a repeat loop. Refer to 6.3.1 DSP Convertion Repeat
Control Instructions and 6.3.2 Extended Repeat Control Instructions for more information.
Operation:
LDRE(long d) /* LDRE @(disp, PC) */
{
long disp;
if ((d&0x80)==0) disp = (0x000000FF & (long)d);
else disp = (0xFFFFFF00 | (long)d);
RE = PC + (disp<<1);
PC += 2;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 447 of 610
11.2.8 LDS (Load to DSP System Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDS Rm,DSR Rm → DSR 0100mmmm01101010 1 —
LDS Rm,A0 Rm → A0 0100mmmm01111010 1 —
LDS Rm,X0 Rm → X0 0100mmmm10001010 1 —
LDS Rm,X1 Rm → X1 0100mmmm10011010 1 —
LDS Rm,Y0 Rm → Y0 0100mmmm10101010 1 —
LDS Rm,Y1 Rm → Y1 0100mmmm10111010 1 —
LDS.L @Rm+,DSR (Rm) → DSR, Rm + 4 → Rm 0100mmmm01100110 1 —
LDS.L @Rm+,A0 (Rm) → A0, Rm + 4 → Rm 0100mmmm01110110 1 —
LDS.L @Rm+,X0 (Rm) → X0,Rm + 4 → Rm 0100nnnn10000110 1 —
LDS.L @Rm+,X1 (Rm) → X1,Rm + 4 → Rm 0100nnnn10010110 1 —
LDS.L @Rm+,Y0 (Rm) → Y0,Rm + 4 → Rm 0100nnnn10100110 1 —
LDS.L @Rm+,Y1 (Rm) → Y1,Rm + 4 → Rm 0100nnnn10110110 1 —
Description: Stores the source operand into the DSP system register DSR, and the DSP data
registers A0, X0, X1, Y0, and Y1.
Note: None
Operation:
LDSDSR(long m) /* LDS Rm,DSR */
{
DSR = R[m] & 0x0000000F;
PC += 2;
}
LDSA0(long m) /* LDS Rm,A0 */
{
A0 = R[m];
if((A0&0x80000000) == 0) A0G = 0x00;
else A0G = 0xFF;
PC += 2;
}
Rev. 1.50, 10/04, page 448 of 610
LDSX0(long m) /* LDS Rm,X0 */
{
X0 = R[m];
PC += 2;
}
LDSX1(long m) /* LDS Rm,X1 */
{
X1 = R[m];
PC += 2;
}
LDSY0(long m) /* LDS Rm,Y0 */
{
Y0 = R[m];
PC += 2;
}
LDSY1(long m) /* LDS Rm,Y1 */
{
Y1 = R[m];
PC += 2;
}
LDSMDSR(long m) /* LDS.L @Rm+,DSR */
{
DSR = Read_Long(R[m])&0x0000000F;
R[m] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 449 of 610
LDSMA0(long m) /* LDS.L @Rm+,A0 */
{
A0 = Read_Long(R[m]);
if ((A0&0x80000000) == 0) A0G = 0x00;
else A0G = 0xFF;
R[m] += 4;
PC += 2;
}
LDSMX0(long m) /* LDS.L @Rm+,X0 */
{
X0 = Read_Long (R[m]);
R[m] += 4;
PC += 2;
}
LDSMX1(long m) /* LDS.L @Rm+,X1 */
{
X1 = Read_Long (R[m]);
R[m] += 4;
PC += 2;
}
LDSMY0(long m) /* LDS.L @Rm+,Y0 */
{
Y0 = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
LDSMY1(long m) /* LDS.L @Rm+,Y1 */
{
Y1 = Read_Long(R[m]);
R[m] += 4;
PC += 2;
}
Rev. 1.50, 10/04, page 450 of 610
Examples:
LDS R0,PR ;Before execution R0 = H'12345678, PR = H'00000000
;After execution PR = H'12345678
LDS.L @R15+,MACL ;Before execution R15 = H'10000000
;After execution R15 = H'10000004, MACL = (H'10000000)
Possible Exceptions:
• Data TLB multiple-hit exception
• General illegal instruction exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Data address error
Rev. 1.50, 10/04, page 451 of 610
11.2.9 LDRS (Load Effective Address to RS Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
LDRS @(disp*,PC) disp × 2 + PC → RS 10001100dddddddd 1 —
Note: * The assembler of Renesas Technology uses the value after scaling (x1,x2, or x4) as
the displacement (disp).
Description: Stores the effective address of the source operand in the repeat start register RS. The
effective address is an address specified by PC + displacement. The PC is the address four bytes
after this instruction. The 8-bit displacement is sign-extended and doubled. Consequently, the
relative interval from the branch destination is 256 to +254 bytes.
Note: When the instructions of the repeat (loop) program are below 3, the effective address value
designated for the RS register is different from the actual repeat start address. Refer to Table 6.5,
RS and RE setting rule for the convertion repeat control, for more information. If this instruction
is arranged immediately after the delayed branch instruction, the PC becomes "the first address
+2" of the branch destination.
If this instruction is executed in a delay slot, a slot illegal instruction exception occurs. And there
are some restrictions to use this instruction in a repeat loop. Refer to 6.3.1 DSP Conventional
Repeat Control Instructions and 6.3.2 Extended Repeat Control Instructions for more information.
Operation:
LDRS(long d) /* LDRS @(disp, PC) */
{
long disp;
if ((d&0x80)==0) disp = (0x000000FF & (long)d);
else disp = (0xFFFFFF00 | (long)d);
RS = PC + (disp<<1);
PC += 2;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 452 of 610
11.2.10 SETDMX (Set DMX): System Control Instruction
Format Operation Instruction Code Cycle T Bit
SETDMX 1 → DMX (SR[10])
0 → DMY (SR[11])
0000000010011000 1 
Description: This instruction enables the X pointer modulo addressing mode by setting the DMX
bit and resetting the DMY bit of the SR register.
Note: When SR.DSP = 0, general illegal instruction exception occurs if SETDMX is executed not
in a delay slot, and slot illegal instruction occurs if SETDMX is executed in a delay slot.
Operation:
SETDMX( ) /* SETDMX */
{
SR.DMX = 1;
SR.DMY = 0;
PC += 2;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 453 of 610
11.2.11 SETDMY (Set DMY): System Control Instruction
Format Operation Instruction Code Cycle T Bit
SETDMX 0 → DMX (SR[10])
1 → DMY (SR[11])
0000000011001000 1 
Description: This instruction enables the Y pointer modulo addressing mode by setting the DMY
bit and resetting the DMX bit of the SR register.
Note: When SR.DSP = 0, general illegal instruction exception occurs if SETDMY is executed not
in a delay slot, and slot illegal instruction occurs if SETDMY is executed in a delay slot.
Operation:
SETDMY( ) /* SETDMY */
{
SR.DMX = 0;
SR.DMY = 1;
PC += 2;
}
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 454 of 610
11.2.12 SETRC (Set Repeat Count to RC): System Control Instruction
Format Operation Instruction Code Cycle T Bit
SETRC Rm Rm[11:0] → RC (SR[27:16]) 0100mmmm00010100 2 —
SETRC #imm imm → RC (SR[23:16]),
0 → RC (SR[27:24])
10000010iiiiiiii 2 —
Description: Sets the repeat count to the SR register's RC counter. When the operand is a register,
the bottom 12 bits are used as the repeat count. When the operand is an immediate data value, 8
bits are used as the repeat count. At this time, the upper 4 bits are filled with 0s. Set repeat control
flags to RF1, RF0 bits of the SR register. Use of the SETRC instruction is subject to any
limitations. Refer to section 6.3.1, DSP Conventional Repeat Control Instruction, for more
information.
Note: None
Operation:
SETRC(long m) /* SETRC Rm */
{
long temp;
temp = (R[m] & 0x00000FFF)<<16;
SR &= 0xF000FFFF;
SR |= temp;
RF1 = Repeat_Control_Flag1;
RF0 = Repeat_Control_Flag0;
PC += 2;
}
Rev. 1.50, 10/04, page 455 of 610
SETRCI(long i) /* SETRC #imm */
{
long temp;
temp = ((long)i & 0x000000FF) << 16;
SR &= 0xF000FFFF;
SR |= temp;
RF1 = Repeat_Control_Flag1;
RF0 = Repeat_Control_Flag0;
PC += 2;
}
SETRC #imm
7 0
SETRC Rm
imm
SR
8 bits
31 12 11 0
Rm
SR
1 ≤ imm ≤ 255 1 ≤ Rm [11:0] ≤ 4095
12 bits
31 27 23 16 15 0
0 8 bits 12 bits
31 27 16 15 0
Repeat control flag Repeat control flag
3 2 3 2
Possible Exceptions:
• General illegal instruction exception
• Slot illegal instruction exception
Rev. 1.50, 10/04, page 456 of 610
11.2.13 STC (Store Control Register): System Control Instruction (Some of these
instructions are usable as privileged instructions.Privileged Only)
Format Operation Instruction Code Cycle T Bit
STC SR,Rn SR → Rn 0000nnnn00000010 1 —
STC MOD,Rn MOD → Rn 0000nnnn01010010 1 —
STC RE,Rn RE → Rn 0000nnnn01110010 1 —
STC RS,Rn RS → Rn 0000nnnn01100010 1 —
STC.L SR,@-Rn Rn 4 → Rn, SR → (Rn) 0100nnnn00000011 1 —
STC.L MOD,@-Rn Rn 4 → Rn, MOD → (Rn) 0100nnnn01010011 1 —
STC.L RE,@-Rn Rn 4 → Rn, RE → (Rn) 0100nnnn01110011 1 —
STC.L RS,@-Rn Rn 4 → Rn, RS → (Rn) 0100nnnn01100011 1 —
Description: Stores data from control registers SR, MOD, RE and RS to a specified destination.
Notes: When the DSP bit of the SR register is clear (0), STC SR,Rn and STC.L SR,@Rn are
privileged instructions. When the DSP bit is set (1), the instructions are not privileged, so all bits
are readable. The other six instructions are only executable in user mode.
Operation:
STCSR(long n) /*STC SR,Rn */
{
R[n] = SR;
PC += 2;
}
STCMOD(long n) /* STC MOD,Rn */
{
R[n] = MOD
PC += 2;
}
STCRE(long n) /* STC RE, Rn */
{
R[n] = RE;
PC += 2;
}
Rev. 1.50, 10/04, page 457 of 610
STCRS(long n) /* STC RS,Rn */
{
R[n] = RS;
PC += 2;
}
STCMSR(long n) /* STC.L SR,@-Rn */
{
R[n] -= 4;
Write_Long (R[n],SR);
PC += 2;
}
STCMMOD(long n) /* STC.L MOD,@-Rn */
{
R[n] -= 4;
Write_Long (R[n],MOD);
PC += 2;
}
STCMRE(long n) /* STC.L RE,@-Rn */
{
R[n] -= 4;
Write_Long (R[n],RE);
PC += 2;
}
STCMRS(long n) /* STC.L RS, @-Rn */
{
R[n] -= 4;
Write_Long (R[n],RS);
PC += 2;
}
Rev. 1.50, 10/04, page 458 of 610
Examples:
STC SR,R0 ;Before execution R0 = H'FFFFFFFF, SR = H'00000000
;After execution R0 = H'00000000
STC.L GBR,@-R15 ;Before execution R15 = H'10000004, GBR = H'12345678
;After execution R15 = H'10000000, (R15) = H'12345678
Possible Exceptions:
• Data TLB multiple-hit exception
• General illegal instruction exception
• Slot illegal instruction exception
• Data TLB miss exception
• Data TLB protection violation exception
• Initial page write exception
• Data address error
Rev. 1.50, 10/04, page 459 of 610
11.2.14 STS (Store from DSP System Register): System Control Instruction
Format Operation Instruction Code Cycle T Bit
STS DSR,Rn DSR → Rn 0000nnnn01101010 1 —
STS A0,Rn A0 → Rn 0000nnnn01111010 1 —
STS X0,Rn X0 → Rn 0000nnnn10001010 1 —
STS X1,Rn X1 → Rn 0000nnnn10011010 1 —
STS Y0,Rn Y0 → Rn 0000nnnn10101010 1 —
STS Y1,Rn Y1 → Rn 0000nnnn10111010 1 —
STS.L DSR,@Rn Rn 4 → Rn, DSR → (Rn) 0100nnnn01100010 1 —
STS.L A0,@Rn Rn 4 → Rn, A0 → (Rn) 0100nnnn01110010 1 —
STS.L X0,@-Rn Rn 4 → Rn,X0 → (Rn) 0100nnnn10000010 1 —
STS.L X1,@-Rn Rn 4 → Rn,X1 → (Rn) 0100nnnn10010010 1 —
STS.L Y0,@-Rn Rn 4 → Rn,Y0 → (Rn) 0100nnnn10100010 1 —
STS.L Y1,@-Rn Rn 4 → Rn,Y1 → (Rn) 0100nnnn10110010 1 —
Description: Stores DSP system register DSR and DSP data registers A0, X0, X1, Y0, and Y1
data into a specified destination.
Note: None
Operation:
STSDSR (long n) /* STS DSR,Rn */
{
R[n] = DSR;
PC += 2;
}
STSA0 (long n) /* STS A0,Rn */
{
R[n] = A0;
PC += 2;
}
Rev. 1.50, 10/04, page 460 of 610
STSX0 (long n) /* STS X0,Rn */
{
R[n] = X0;
PC += 2;
}
STSX1(long n) /* STS X1,Rn */
{
R[n] = X1;
PC += 2;
}
STSY0(long n) /* STS Y0,Rn */
{
R[n] = Y0;
PC += 2;
}
STSY1(long n) /* STS Y1,Rn */
{
R[n] = Y1;
PC += 2;
}
STSMDSR(long n) /* STS.L DSR,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],DSR);
PC += 2;
}
Rev. 1.50, 10/04, page 461 of 610
STSMA0(long n) /* STS.L A0,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],A0);
PC += 2;
}
STSMX0(long n) /* STS.L X0,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],X0);
PC += 2;
}
STSMX1(long n) /* STS.L X1,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],X1);
PC += 2;
}
STSMY0(long n) /* STS.L Y0,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],Y0);
PC += 2;
}
STSMY1(long n) /* STS.L Y1,@-Rn */
{
R[n] -= 4;
Write_Long(R[n],Y1);
PC += 2;
}