Instruction Syntax
Mnemonic | Format | Flags |
lfsux | 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 | 567 (Extended opcode) |
Rc | 31 | Reserved (0) |
Operation
EA ← (rA) + (rB) frD ← DOUBLE(MEM(EA, 4)) rA ← EA
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. After the load, the effective address is stored back into register rA.
Note: This instruction cannot be used with rA=0. The update form requires a valid base register. The loaded single-precision value is automatically converted to double-precision before being stored in the FPR. This indexed update form is particularly useful for traversing single-precision floating-point data structures with dynamic stride patterns while maintaining automatic pointer advancement.
Affected Registers
rA - Updated with the effective address after the load operation.
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 DSP - Variable Rate Resampling
# Resample audio with time-varying sample rate lis r3, input_audio@ha addi r3, r3, input_audio@l lis r4, rate_control@ha addi r4, r4, rate_control@l lwz r5, num_output_samples(r0) li r6, 0 # Input position (fixed-point) resample_loop: # Load rate control value (determines advance) lwz r7, 0(r4) # Load rate multiplier lfsux f1, r3, r7 # Load audio sample and advance by rate # Apply anti-aliasing filter bl apply_antialiasing # Process sample in f1 # Store resampled output bl store_output_sample addi r4, r4, 4 # Next rate control value subi r5, r5, 1 # Decrement output counter cmpwi r5, 0 bne resample_loop # Continue resampling
Scientific Computing - Sparse Matrix Operations
# Process sparse matrix with compressed storage lis r3, sparse_values@ha addi r3, r3, sparse_values@l lis r4, offset_array@ha addi r4, r4, offset_array@l lwz r5, num_nonzero(r0) # Number of non-zero elements sparse_matrix_loop: lwz r6, 0(r4) # Load offset to next element lfsux f1, r3, r6 # Load sparse value and advance by offset # Apply matrix operation (e.g., scaling, transformation) lfs f2, scale_factor(r0) fmul f3, f1, f2 # Scale the sparse element # Store processed value back stfs f3, 0(r3) # Store back to current position addi r4, r4, 4 # Next offset subi r5, r5, 1 # Decrement element counter cmpwi r5, 0 bne sparse_matrix_loop # Continue processing
Game Engine - Particle System
# Update particle system with variable time steps lis r3, particle_array@ha addi r3, r3, particle_array@l lis r4, timestep_array@ha addi r4, r4, timestep_array@l lwz r5, num_particles(r0) # Number of active particles particle_update_loop: # Load variable timestep for this particle lwz r6, 0(r4) # Load timestep offset # Load particle velocity lfsux f1, r3, r6 # Load velocity_x and advance lwz r7, 4 # Standard advance for next component lfsux f2, r3, r7 # Load velocity_y and advance lfsux f3, r3, r7 # Load velocity_z and advance # Load particle position (will be updated) lfsux f4, r3, r7 # Load position_x and advance lfsux f5, r3, r7 # Load position_y and advance lfsux f6, r3, r7 # Load position_z and advance # Load time delta for this particle lfsux f7, r3, r7 # Load time_delta and advance # Update position: position += velocity * time_delta fmadd f8, f1, f7, f4 # new_x = old_x + velocity_x * delta_t fmadd f9, f2, f7, f5 # new_y = old_y + velocity_y * delta_t fmadd f10, f3, f7, f6 # new_z = old_z + velocity_z * delta_t # Store updated position (move pointer back to overwrite) stfs f8, -12(r3) # Store new position_x stfs f9, -8(r3) # Store new position_y stfs f10, -4(r3) # Store new position_z addi r4, r4, 4 # Next timestep subi r5, r5, 1 # Decrement particle counter cmpwi r5, 0 bne particle_update_loop # Continue updating particles
Neural Network - Variable Architecture
# Process neural network with variable layer sizes lis r3, weight_matrix@ha addi r3, r3, weight_matrix@l lis r4, layer_sizes@ha addi r4, r4, layer_sizes@l lis r5, input_vector@ha addi r5, r5, input_vector@l lwz r6, num_layers(r0) # Number of layers neural_layer_loop: lwz r7, 0(r4) # Load current layer size lwz r8, 4(r4) # Load next layer size # Calculate weight stride for this layer transition slwi r9, r8, 2 # next_layer_size * 4 (bytes per float) mr r10, r7 # Input neuron counter li r11, 0 # Output neuron index output_neuron_loop: lfs f10, zero_constant(r0) # Initialize accumulator mr r12, r10 # Reset input counter mr r13, r5 # Reset input pointer input_neuron_loop: lfs f1, 0(r13) # Load input activation lfsux f2, r3, r9 # Load weight and advance by stride # Multiply-accumulate fmadd f10, f1, f2, f10 # sum += input * weight addi r13, r13, 4 # Next input subi r12, r12, 1 # Decrement input counter cmpwi r12, 0 bne input_neuron_loop # Continue inputs # Apply activation function (e.g., sigmoid) bl apply_activation # Process activation in f10 # Store output activation lis r14, output_vector@ha addi r14, r14, output_vector@l slwi r15, r11, 2 # Convert output index to byte offset stfsx f10, r14, r15 # Store activation addi r11, r11, 1 # Next output neuron cmpw r11, r8 # Check if done with layer blt output_neuron_loop # Continue layer # Move to next layer addi r4, r4, 4 # Next layer size subi r6, r6, 1 # Decrement layer counter cmpwi r6, 0 bne neural_layer_loop # Continue layers
Image Processing - Adaptive Filtering
# Apply adaptive filter based on local image properties lis r3, image_data@ha addi r3, r3, image_data@l lis r4, filter_offsets@ha addi r4, r4, filter_offsets@l lwz r5, image_width(r0) # Image width lwz r6, image_height(r0) # Image height adaptive_filter_loop: # Analyze local image properties to determine filter type bl analyze_local_properties # Returns filter type in r7 # Calculate filter offset based on properties slwi r8, r7, 2 # Convert filter type to offset lwzx r9, r4, r8 # Load filter offset # Apply adaptive filter lfsux f1, r3, r9 # Load pixel and advance by filter-specific offset # Process based on filter type cmpwi r7, EDGE_FILTER beq apply_edge_filter cmpwi r7, SMOOTH_FILTER beq apply_smooth_filter cmpwi r7, SHARPEN_FILTER beq apply_sharpen_filter apply_edge_filter: bl enhance_edges # Apply edge enhancement b store_result apply_smooth_filter: bl smooth_noise # Apply noise reduction b store_result apply_sharpen_filter: bl sharpen_details # Apply detail enhancement store_result: stfs f1, 0(r3) # Store processed pixel # Continue to next pixel bl check_image_bounds # Check if more pixels to process bne adaptive_filter_loop # Continue filtering
Financial Computing - Portfolio Optimization
# Optimize portfolio with dynamic weight adjustment lis r3, asset_returns@ha addi r3, r3, asset_returns@l lis r4, weight_adjustments@ha addi r4, r4, weight_adjustments@l lis r5, portfolio_weights@ha addi r5, r5, portfolio_weights@l lwz r6, num_assets(r0) # Number of assets in portfolio portfolio_optimization_loop: # Load current weight adjustment lwz r7, 0(r4) # Load adjustment offset # Load asset return with dynamic advancement lfsux f1, r3, r7 # Load return and advance by adjustment # Load current portfolio weight lfs f2, 0(r5) # Load current weight # Calculate new weight based on return performance # new_weight = old_weight + return * adjustment_factor lfs f3, adjustment_factor(r0) fmadd f4, f1, f3, f2 # new_weight = old_weight + return * factor # Apply weight constraints (0 <= weight <= 1) lfs f5, zero_constant(r0) lfs f6, one_constant(r0) fcmpu cr0, f4, f5 # Compare with 0 bge check_upper_bound fmr f4, f5 # Clamp to 0 check_upper_bound: fcmpu cr0, f4, f6 # Compare with 1 ble weight_ok fmr f4, f6 # Clamp to 1 weight_ok: # Store updated weight stfs f4, 0(r5) # Store new weight # Calculate contribution to portfolio performance fmul f7, f1, f4 # return * weight lfs f8, portfolio_value(r0) fadd f9, f8, f7 # Add to portfolio value stfs f9, portfolio_value(r0) addi r4, r4, 4 # Next weight adjustment addi r5, r5, 4 # Next portfolio weight subi r6, r6, 1 # Decrement asset counter cmpwi r6, 0 bne portfolio_optimization_loop # Continue optimization
Robotics - Sensor Fusion
# Fuse sensor data with variable sampling rates lis r3, sensor_data@ha addi r3, r3, sensor_data@l lis r4, sample_intervals@ha addi r4, r4, sample_intervals@l lis r5, fusion_weights@ha addi r5, r5, fusion_weights@l lwz r6, num_sensors(r0) # Number of sensors sensor_fusion_loop: # Load sampling interval for this sensor lwz r7, 0(r4) # Load interval offset # Load sensor reading with time-based advancement lfsux f1, r3, r7 # Load sensor value and advance by interval # Load fusion weight for this sensor lfs f2, 0(r5) # Load weight # Apply sensor-specific calibration bl calibrate_sensor # Apply calibration to f1 # Weight the sensor contribution fmul f3, f1, f2 # weighted_value = sensor_value * weight # Add to fused estimate lfs f4, fused_estimate(r0) fadd f5, f4, f3 # Add weighted contribution stfs f5, fused_estimate(r0) # Update confidence based on sensor reliability lfs f6, sensor_confidence(r0) fmul f7, f2, f2 # weight² fadd f8, f6, f7 # Add to total confidence stfs f8, sensor_confidence(r0) addi r4, r4, 4 # Next sample interval addi r5, r5, 4 # Next fusion weight subi r6, r6, 1 # Decrement sensor counter cmpwi r6, 0 bne sensor_fusion_loop # Continue fusion # Normalize fused estimate by total confidence lfs f9, fused_estimate(r0) lfs f10, sensor_confidence(r0) fdiv f11, f9, f10 # normalized_estimate = sum / total_confidence stfs f11, final_estimate(r0)