mftb
Move from Time Base - 7C 00 00 E6
mftb
Instruction Syntax
| Mnemonic | Format | Flags |
| mftb | 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
1
0
1
0
0
1
1
1
1
1
0
| Field | Bits | Description |
| Primary Opcode | 0-5 | 011111 (0x1F) |
| rD | 6-10 | Destination register |
| Reserved | 11-20 | Should be zero |
| XO | 21-30 | 0101001111 (0x29F) |
| Reserved | 31 | Should be zero |
Operation
rD ← TB
The contents of the Time Base register are copied to general-purpose register rD. The Time Base is a 64-bit counter that increments at a fixed frequency, providing a high-resolution timing source.
Note: This instruction provides access to the processor's time base for timing measurements and performance analysis. The time base frequency is implementation-specific but typically runs at a multiple of the processor clock frequency.
Affected Registers
General Purpose Registers (GPRs)
(always)
- rD - Destination register (loaded with Time Base contents)
Time Base (TB)
(read only)
- TB - Source Time Base register (read only)
Examples
Basic Time Measurement
# Measure time between two points mftb r3 # Get start time # ... perform operation to measure ... mftb r4 # Get end time subf r5, r3, r4 # Calculate elapsed time
Performance Timing
# Time a function call mftb r6 # Start time bl function_to_time # Call function mftb r7 # End time subf r8, r6, r7 # Function execution time
Loop Timing
# Time a loop execution
mftb r9 # Start time
li r10, 1000 # Loop count
loop:
# ... loop body ...
addi r10, r10, -1 # Decrement counter
cmpwi r10, 0 # Check if done
bne loop # Continue if not done
mftb r11 # End time
subf r12, r9, r11 # Total loop time
High-Resolution Delay
# Implement precise delay
mftb r13 # Get current time
li r14, 1000 # Delay count (in time base units)
delay_loop:
mftb r15 # Get current time
subf r16, r13, r15 # Calculate elapsed time
cmpw r16, r14 # Compare with desired delay
blt delay_loop # Continue if not enough time passed
Benchmarking
# Benchmark multiple operations mftb r17 # Start benchmark # ... first operation ... mftb r18 # Time after first operation # ... second operation ... mftb r19 # Time after second operation # ... third operation ... mftb r20 # End time # Calculate individual operation times subf r21, r17, r18 # First operation time subf r22, r18, r19 # Second operation time subf r23, r19, r20 # Third operation time
System Timing
# System timing for scheduling mftb r24 # Get current system time # Use for task scheduling or timeout calculations
Profiling
# Profile code sections mftb r25 # Profile start time # ... code section 1 ... mftb r26 # Section 1 end time # ... code section 2 ... mftb r27 # Section 2 end time # ... code section 3 ... mftb r28 # Profile end time # Calculate section times subf r29, r25, r26 # Section 1 time subf r30, r26, r27 # Section 2 time subf r31, r27, r28 # Section 3 time
Timeout Implementation
# Implement timeout mechanism
mftb r3 # Start time
li r4, 5000 # Timeout value (in time base units)
timeout_loop:
# ... check for condition ...
mftb r5 # Current time
subf r6, r3, r5 # Elapsed time
cmpw r6, r4 # Compare with timeout
bge timeout_expired # Branch if timeout expired
b timeout_loop # Continue checking
Real-Time Timing
# Real-time timing for periodic tasks
mftb r7 # Get current time
# Calculate next execution time
addi r8, r7, 1000 # Next execution in 1000 time base units
# Wait until next execution time
wait_loop:
mftb r9 # Current time
cmpw r9, r8 # Check if time to execute
blt wait_loop # Wait if not yet time
# Execute periodic task
Performance Monitoring
# Monitor performance over time
mftb r10 # Initial time
li r11, 0 # Performance counter
monitor_loop:
# ... monitor operation ...
addi r11, r11, 1 # Increment counter
mftb r12 # Current time
subf r13, r10, r12 # Total elapsed time
# Check if monitoring period complete
cmpwi r13, 10000 # 10,000 time base units
blt monitor_loop # Continue if not complete
# Calculate performance metrics
# r11 contains operation count
# r13 contains total time