Instruction Syntax
| Mnemonic | Format | Flags | 
| lfsx | frD,rA,rB | - | 
Instruction Encoding
| 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 | 535 (Extended opcode) | 
| Rc | 31 | Reserved (0) | 
Operation
if rA = 0 then EA ← (rB) else EA ← (rA) + (rB) frD ← DOUBLE(MEM(EA, 4))
A single-precision floating-point value (32 bits) is loaded from memory, converted to double-precision format, 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 single-precision data. The loaded single-precision value is automatically converted to double-precision before being stored in the FPR. The effective address should be word-aligned (divisible by 4) 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
Audio Sample Array Processing
# Process audio samples with dynamic indexing
lis r3, audio_samples@ha
addi r3, r3, audio_samples@l
lwz r4, sample_rate(r0)     # Sample rate (e.g., 44100)
li r5, 1000                 # Process 1000 samples
li r6, 0                    # Sample index
audio_loop:
    slwi r7, r6, 2          # Convert index to byte offset (* 4)
    lfsx f1, r3, r7         # Load audio sample
    
    # Apply audio effects (e.g., reverb, EQ)
    bl apply_audio_effects  # Process sample in f1
    
    addi r6, r6, 1          # Next sample
    cmpw r6, r5             # Check if done
    blt audio_loop          # Continue processing
		3D Graphics Texture Sampling
# Sample texture data with computed coordinates lis r3, texture_data@ha addi r3, r3, texture_data@l lwz r4, texture_width(r0) # Texture width lfs f1, tex_u(r0) # U coordinate (0.0-1.0) lfs f2, tex_v(r0) # V coordinate (0.0-1.0) # Convert normalized coordinates to pixel coordinates stw r4, temp_width(r1) lfs f3, temp_width(r1) # Convert width to float fmul f4, f1, f3 # u * width fctiwz f5, f4 # Convert to integer stfd f5, temp_u(r1) lwz r5, temp_u+4(r1) # Integer u coordinate # Calculate texel offset slwi r6, r5, 2 # u * 4 (bytes per texel) lfsx f6, r3, r6 # Load texture sample # Apply texture filtering bl apply_texture_filter # Process texel value
Scientific Data Visualization
# Visualize scientific data with color mapping
lis r3, data_values@ha
addi r3, r3, data_values@l
lis r4, color_map@ha
addi r4, r4, color_map@l
lwz r5, data_points(r0)     # Number of data points
visualize_loop:
    li r6, 0                # Data point index
    slwi r7, r6, 2          # Convert to byte offset
    lfsx f1, r3, r7         # Load data value
    
    # Normalize data value to color map index (0-255)
    lfs f2, data_min(r0)    # Minimum data value
    lfs f3, data_max(r0)    # Maximum data value
    fsub f4, f1, f2         # value - min
    fsub f5, f3, f2         # max - min
    fdiv f6, f4, f5         # normalized value (0.0-1.0)
    
    lfs f7, color_scale(r0) # 255.0
    fmul f8, f6, f7         # * 255
    fctiwz f9, f8           # Convert to integer
    stfd f9, temp_index(r1)
    lwz r8, temp_index+4(r1) # Color map index
    
    # Load color from color map
    slwi r9, r8, 2          # Convert to byte offset
    lfsx f10, r4, r9        # Load color value
    
    # Apply color to visualization
    bl set_pixel_color      # Set visualization pixel
    
    addi r6, r6, 1          # Next data point
    cmpw r6, r5             # Check if done
    blt visualize_loop      # Continue visualization
		Machine Learning - Feature Vector Processing
# Process feature vectors with dynamic dimension access
lis r3, feature_vectors@ha
addi r3, r3, feature_vectors@l
lwz r4, vector_dimension(r0) # Feature vector dimension
lwz r5, num_vectors(r0)     # Number of vectors
li r6, 0                    # Vector index
ml_vector_loop:
    li r7, 0                # Feature index
    lfs f10, zero_constant(r0) # Initialize feature sum
feature_loop:
    # Calculate feature address: base + (vector_index * dimension + feature_index) * 4
    mullw r8, r6, r4        # vector_index * dimension
    add r9, r8, r7          # + feature_index
    slwi r10, r9, 2         # * 4 (bytes per float)
    lfsx f1, r3, r10        # Load feature value
    
    # Apply feature processing (e.g., normalization)
    lfs f2, feature_scale(r0) # Scaling factor
    fmul f3, f1, f2         # Scale feature
    fadd f10, f10, f3       # Add to feature sum
    
    addi r7, r7, 1          # Next feature
    cmpw r7, r4             # Check if done with vector
    blt feature_loop        # Continue features
    
    # Process completed feature vector
    bl process_feature_vector # Process accumulated features
    
    addi r6, r6, 1          # Next vector
    cmpw r6, r5             # Check if done
    blt ml_vector_loop      # Continue vectors
		Image Processing - Convolution Filter
# Apply convolution filter to single-precision image data
lis r3, image_data@ha
addi r3, r3, image_data@l
lis r4, filter_kernel@ha
addi r4, r4, filter_kernel@l
lwz r5, image_width(r0)     # Image width
lwz r6, image_height(r0)    # Image height
li r7, 3                    # Filter size (3x3)
# Process each pixel (excluding border)
li r8, 1                    # Start row (skip border)
subi r9, r6, 1              # End row (skip border)
convolution_row_loop:
    li r10, 1               # Start column (skip border)
    subi r11, r5, 1         # End column (skip border)
convolution_col_loop:
    lfs f10, zero_constant(r0) # Initialize convolution sum
    
    # Apply 3x3 filter kernel
    li r12, -1              # Kernel row offset (-1, 0, 1)
kernel_row_loop:
    li r13, -1              # Kernel column offset (-1, 0, 1)
kernel_col_loop:
    # Calculate source pixel position
    add r14, r8, r12        # source_row = current_row + kernel_row_offset
    add r15, r10, r13       # source_col = current_col + kernel_col_offset
    
    # Calculate pixel offset
    mullw r16, r14, r5      # source_row * image_width
    add r17, r16, r15       # + source_col
    slwi r18, r17, 2        # Convert to byte offset
    lfsx f1, r3, r18        # Load pixel value
    
    # Load kernel coefficient
    addi r19, r12, 1        # Convert offset to index (0-2)
    mulli r20, r19, 3       # kernel_row_index * 3
    addi r21, r13, 1        # Convert col offset to index
    add r22, r20, r21       # kernel_index
    slwi r23, r22, 2        # Convert to byte offset
    lfsx f2, r4, r23        # Load kernel coefficient
    
    # Multiply and accumulate
    fmadd f10, f1, f2, f10  # sum += pixel * kernel_coeff
    
    addi r13, r13, 1        # Next kernel column
    cmpwi r13, 2            # Check if done with kernel row
    ble kernel_col_loop     # Continue kernel column
    
    addi r12, r12, 1        # Next kernel row
    cmpwi r12, 2            # Check if done with kernel
    ble kernel_row_loop     # Continue kernel row
    
    # Store convolution result
    mullw r24, r8, r5       # current_row * image_width
    add r25, r24, r10       # + current_col
    slwi r26, r25, 2        # Convert to byte offset
    stfsx f10, r3, r26      # Store filtered pixel
    
    addi r10, r10, 1        # Next column
    cmpw r10, r11           # Check if done with row
    ble convolution_col_loop # Continue row
    
    addi r8, r8, 1          # Next row
    cmpw r8, r9             # Check if done with image
    ble convolution_row_loop # Continue image