August 7th, 2019

The SuperH-3, part 3: Status flags and miscellaneous instructions

Only four of the bits in the status register are available to user-mode:

Bit Meaning Notes
M Modulus Used by division instructions
Q Quotient Used by division instructions
S Saturate Used by multiply-add instructions
T Test Multi-purpose flag

(There was no official meaning for the names of the registers, so I made up mnemonics for them.)

Aside from the flags used by special-purpose instructions (multiplication and division), there is basically only one flag: T. Each instructions decides how it wishes to consume and produce the T flag.

    CLRT        ; T = 0
    SETT        ; T = 1

    CLRS        ; S = 0
    SETS        ; S = 1

There are four instructions which directly set or clear two of the bits in the status register. We’ll learn more about the M and Q registers when we study integer division.

    MOVT    Rn  ; Rn = T (0 or 1)

There is also a special instruction to copy the T flag into a register. There is no converse instruction, but we’ll see later how we could try to synthesize one.

Windows CE requires that the S flag be clear at function entry and exit.

Since there wasn’t much to be said about flags, I’ll use the rest of my time to cover various miscellaneous instructions.

    MOVA @(disp, PC), r0    ; r0 = PC + disp

The move address instruction calculates the effective address of @(disp, PC) and stores it into r0. The displacement can be a multiple of 4 up to 255 × 4 = 1020.

    SWAP.B Rm, Rn           ; Rn = Rm with bottom two bytes swapped
    SWAP.W Rm, Rn           ; Rn = Rm with top and bottom words swapped
    XTRCT  Rm, Rn           ; Rn = (Rn << 16) | (Rm >> 16)

These instructions are for byte swapping or extracting the middle 32 bits of a 64-bit value.

    PREF  @Rn               ; prefetch memory at Rn

The prefetch instruction has no effect if the memory at Rn is inaccessible.

    TRAPA #imm              ; trap to kernel mode

The TRAPA instruction traps to kernel mode. It carries an 8-bit unsigned immediate payload which kernel mode can use to signify anything it wishes.

    NOP                     ; do nothing

Fortunately, the instruction 0000 is invalid, rather than being a nop.

    STC     GBR, Rn         ; Rn = GBR
    LDC     Rn, GBR         ; GBR = Rn
    STC     PR, Rn          ; Rn = PR
    LDC     Rn, PR          ; PR = Rn

These instructions let you move data into and out of the special registers gbr and pr. We saw gbr when we learned about addressing modes. We’ll learn about pr when we get to control transfer.

Well, that wasn’t very exciting yet. Let’s start doing math. Next time.

Topics
History

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.