mfspr
Move from Special Purpose Register - 7C 00 00 A6
mfspr
Instruction Syntax
Mnemonic | Format | Flags |
mfspr | rD,SPR | None |
Instruction Encoding
0
1
1
1
1
1
D
D
D
D
D
S
P
R
S
P
R
S
P
R
S
P
R
S
P
R
S
P
R
S
P
R
1
0
1
0
0
0
1
1
1
1
0
Field | Bits | Description |
Primary Opcode | 0-5 | 011111 (0x1F) |
rD | 6-10 | Destination register |
SPR | 11-20 | Special Purpose Register number |
XO | 21-30 | 0101000111 (0x287) |
Reserved | 31 | Should be zero |
Operation
rD ← SPR[SPR]
The contents of the specified Special Purpose Register (SPR) are copied to general-purpose register rD. The SPR number identifies which special purpose register to read.
Note: This instruction provides access to various system registers. Common SPR numbers include 8 (LR - Link Register), 9 (CTR - Count Register), and others for processor-specific functionality.
Affected Registers
General Purpose Registers (GPRs)
(always)
- rD - Destination register (loaded with SPR contents)
Special Purpose Registers (SPRs)
(read only)
- SPR - Source Special Purpose Register (read only)
Examples
Read Link Register
# Read current Link Register value mfspr r3, 8 # Copy LR (SPR 8) to r3 # r3 now contains return address
Read Count Register
# Read current Count Register value mfspr r4, 9 # Copy CTR (SPR 9) to r4 # r4 now contains loop counter value
Save Return Address
# Save return address before function call mfspr r5, 8 # Save current LR bl some_function # Function call mtspr 8, r5 # Restore original LR
Loop Counter Management
# Save and restore loop counter mfspr r6, 9 # Save current CTR li r7, 100 # Set new counter value mtspr 9, r7 # Load new value into CTR # ... perform loop operations ... mtspr 9, r6 # Restore original CTR
Context Switching
# Save special purpose registers mfspr r8, 8 # Save LR mfspr r9, 9 # Save CTR # ... save other registers ... bl context_switch # Switch context # Restore special purpose registers mtspr 8, r8 # Restore LR mtspr 9, r9 # Restore CTR # ... restore other registers ...
Interrupt Handler
# Interrupt handler entry interrupt_handler: mfspr r10, 8 # Save LR mfspr r11, 9 # Save CTR # ... handle interrupt ... mtspr 8, r10 # Restore LR mtspr 9, r11 # Restore CTR rfi # Return from interrupt
Function Prologue
# Function prologue function_prologue: mfspr r12, 8 # Save return address stw r12, -4(r1) # Store on stack # ... function code ... lwz r12, -4(r1) # Restore return address mtspr 8, r12 # Restore LR blr # Return
Debugging Register State
# Debug special purpose register state debug_point: mfspr r13, 8 # Save LR for debugging mfspr r14, 9 # Save CTR for debugging # ... perform operations ... # Debug: check if registers changed unexpectedly mfspr r15, 8 # Get current LR cmpw r13, r15 # Compare saved vs current LR beq lr_ok # Branch if unchanged # Handle unexpected LR change
Loop Optimization
# Optimize loop with CTR mfspr r16, 9 # Save original CTR li r17, 1000 # Loop count mtspr 9, r17 # Set CTR for loop loop: # ... loop body ... bdnz loop # Decrement CTR and branch if non-zero mtspr 9, r16 # Restore original CTR
System Call Wrapper
# System call wrapper syscall_wrapper: mfspr r18, 8 # Save return address # ... prepare system call parameters ... sc # System call mtspr 8, r18 # Restore return address blr # Return to caller