lfdx
Load Floating-Point Double Indexed - 7C 00 04 AE
lfdx
Instruction Syntax
Mnemonic | Format | Flags |
lfdx | frD,rA,rB | - |
Instruction Encoding
0
1
1
1
1
1
D
D
D
D
D
A
A
A
A
A
B
B
B
B
B
1
0
0
1
0
1
0
1
1
1
/
Field | Bits | Description |
Primary Opcode | 0-5 | 011111 (0x1F) |
frD | 6-10 | Destination floating-point register |
rA | 11-15 | Source register A |
rB | 16-20 | Source register B |
XO | 21-30 | 599 (Extended opcode) |
Rc | 31 | Reserved (0) |
Operation
if rA = 0 then EA ← (rB) else EA ← (rA) + (rB) frD ← MEM(EA, 8)
A double-precision floating-point value (64 bits) is loaded from memory and placed in floating-point register frD. The effective address is computed by adding the contents of registers rA and rB, or just rB if rA is 0.
Note: This indexed form is essential for array access and dynamic addressing with double-precision data. The effective address should be doubleword-aligned (divisible by 8) for optimal performance. If rA=0, it is treated as the value 0, not the contents of register r0.
Affected Registers
None (load instruction does not affect condition registers).
For more information on floating-point operations see Section 2.1.4, "Floating-Point Status and Control Register (FPSCR)," in the PowerPC Microprocessor Family: The Programming Environments manual.
Examples
Matrix Operations with Dynamic Indexing
# Access matrix elements using computed indices lis r3, matrix_data@ha addi r3, r3, matrix_data@l lwz r4, matrix_width(r0) # Matrix width li r5, 2 # Row index li r6, 3 # Column index # Calculate element address: base + (row * width + col) * 8 mullw r7, r5, r4 # row * width add r8, r7, r6 # + column slwi r9, r8, 3 # * 8 (bytes per double) lfdx f1, r3, r9 # Load matrix[row][col]
Scientific Array Processing
# Process arrays with stride patterns lis r3, data_array@ha addi r3, r3, data_array@l li r4, 16 # Stride (every 2nd element) li r5, 10 # Number of elements process_loop: lfdx f1, r3, r4 # Load strided element # Apply scientific computation bl compute_function # Process value in f1 add r4, r4, r4 # Double stride for next element subi r5, r5, 1 # Decrement counter cmpwi r5, 0 bne process_loop # Continue processing
Sparse Data Structure Access
# Access sparse matrix using index arrays lis r3, sparse_values@ha addi r3, r3, sparse_values@l lis r4, row_indices@ha addi r4, r4, row_indices@l lis r5, col_indices@ha addi r5, r5, col_indices@l lwz r6, num_nonzero(r0) # Number of non-zero elements sparse_loop: lwz r7, 0(r4) # Load row index lwz r8, 0(r5) # Load column index # Calculate sparse element offset slwi r9, r7, 3 # Convert index to byte offset lfdx f1, r3, r9 # Load sparse value # Process sparse element bl process_sparse_element addi r4, r4, 4 # Next row index addi r5, r5, 4 # Next column index subi r6, r6, 1 # Decrement counter cmpwi r6, 0 bne sparse_loop # Continue processing
Digital Signal Processing - FFT
# FFT butterfly operations with indexed access lis r3, complex_data@ha addi r3, r3, complex_data@l lwz r4, fft_size(r0) # FFT size li r5, 0 # Butterfly index fft_butterfly_loop: # Calculate butterfly pair indices add r6, r5, r4 # Second element index slwi r7, r5, 4 # First element offset (* 16 for complex double) slwi r8, r6, 4 # Second element offset # Load complex pairs lfdx f1, r3, r7 # Load real part of first element addi r9, r7, 8 lfdx f2, r3, r9 # Load imaginary part of first element lfdx f3, r3, r8 # Load real part of second element addi r10, r8, 8 lfdx f4, r3, r10 # Load imaginary part of second element # Perform butterfly computation bl fft_butterfly # Process complex pairs addi r5, r5, 1 # Next butterfly srwi r11, r4, 1 # Half FFT size cmpw r5, r11 # Check if done with stage blt fft_butterfly_loop # Continue butterflies
Financial Time Series Analysis
# Analyze financial data with irregular time stamps lis r3, price_data@ha addi r3, r3, price_data@l lis r4, timestamp_offsets@ha addi r4, r4, timestamp_offsets@l lwz r5, num_datapoints(r0) # Number of data points analysis_loop: lwz r6, 0(r4) # Load timestamp offset lfdx f1, r3, r6 # Load price at timestamp # Calculate moving average over variable window bl calculate_moving_average # Process price data # Detect trend changes bl detect_trend_change addi r4, r4, 4 # Next timestamp offset subi r5, r5, 1 # Decrement counter cmpwi r5, 0 bne analysis_loop # Continue analysis
3D Graphics Vertex Array
# Process 3D vertices with attribute arrays lis r3, vertex_positions@ha addi r3, r3, vertex_positions@l lis r4, vertex_normals@ha addi r4, r4, vertex_normals@l lis r5, vertex_texcoords@ha addi r5, r5, vertex_texcoords@l lwz r6, num_vertices(r0) # Number of vertices vertex_loop: li r7, 0 # Vertex index slwi r8, r7, 5 # Vertex offset (* 32 for 4 doubles per vertex) # Load vertex position (x, y, z, w) lfdx f1, r3, r8 # Load x coordinate addi r9, r8, 8 lfdx f2, r3, r9 # Load y coordinate addi r10, r8, 16 lfdx f3, r3, r10 # Load z coordinate addi r11, r8, 24 lfdx f4, r3, r11 # Load w coordinate # Load vertex normal slwi r12, r7, 4 # Normal offset (* 16 for 2 doubles) lfdx f5, r4, r12 # Load normal x addi r13, r12, 8 lfdx f6, r4, r13 # Load normal y # Transform vertex bl transform_vertex # Apply transformation matrices addi r7, r7, 1 # Next vertex cmpw r7, r6 # Check if done blt vertex_loop # Continue processing