mflr
Move from Link Register - 7C 08 02 A6
mflr
Instruction Syntax
| Mnemonic | Format | Flags |
| mflr | rD | None |
Instruction Encoding
0
1
1
1
1
1
D
D
D
D
D
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
| Field | Bits | Description |
| Primary Opcode | 0-5 | 011111 (0x1F) |
| rD | 6-10 | Destination register |
| Reserved | 11-20 | Should be zero |
| XO | 21-30 | 0101000111 (0x287) - Extended opcode |
| Reserved | 31 | Should be zero |
Operation
rD ← LR
The contents of the Link Register (LR) are copied to general-purpose register rD. The LR contains the return address for the current function or subroutine.
Note: This instruction provides a way to save the current return address. This is particularly useful for function prologues, context switching, or when implementing complex calling conventions that require preserving the return address.
Affected Registers
General Purpose Register
(always)
- rD - Loaded with Link Register contents
Link Register (LR)
(read only)
- LR - Source register (read only)
For more information on the Link Register see Section 2.1.6, "Link Register (LR)," in the PowerPC Microprocessor Family: The Programming Environments manual.
Examples
Basic Link Register Save
# Save current return address mflr r3 # Copy LR to r3 # ... perform operations that might modify LR ... mtlr r3 # Restore LR from r3
Function Prologue
# Standard function prologue
function_prologue:
mflr r0 # Save return address
stw r0, 4(r1) # Store on stack
stwu r1, -16(r1) # Allocate stack frame
# ... function code ...
lwz r0, 20(r1) # Restore return address
mtlr r0 # Restore LR
addi r1, r1, 16 # Deallocate stack frame
blr # Return
Context Switching
# Save context before function call mflr r10 # Save return address # ... save other registers ... bl some_function # Function call # Restore context after function call mtlr r10 # Restore return address # ... restore other registers ...
Interrupt Handler
# Interrupt handler entry
interrupt_handler:
mflr r20 # Save return address
# ... handle interrupt ...
mtlr r20 # Restore return address
rfi # Return from interrupt
Nested Function Calls
# Handle nested function calls
outer_function:
mflr r4 # Save outer return address
bl inner_function # Call inner function
mtlr r4 # Restore outer return address
blr # Return from outer function
inner_function:
# Inner function code
blr # Return to outer function
Exception Handler
# Exception handler setup
exception_handler:
mflr r5 # Save return address
# ... handle exception ...
mtlr r5 # Restore return address
rfi # Return from exception
Debugging Return Address
# Debug return address
debug_point:
mflr r6 # Save current return address
# ... perform operations ...
# Debug: check if return address changed unexpectedly
mflr r7 # Get current return address
cmpw r6, r7 # Compare saved vs current
beq lr_ok # Branch if unchanged
# Handle unexpected LR change
Custom Calling Convention
# Custom calling convention
custom_call:
mflr r8 # Save return address
# ... custom calling logic ...
mtlr r8 # Restore return address
blr # Return