parameters: (emitter, registers, aggregators, lhs, rhs,
                                        count)
docstring: Emit inner loop for 3 rows x 3 cols multiplication.
docstring_summary: Emit inner loop for 3 rows x 3 cols multiplication.
docstring_tokens: Emit inner loop for 3 rows x 3 cols multiplication .
function: def _Generate3x3LoadMultiplyAggregate(emitter, registers, aggregators, lhs, rhs,
                                        count):
    """Emit inner loop for 3 rows x 3 cols multiplication."""
    emitter.EmitNewline()
    emitter.EmitComment('3x3 lanes loop.')
    emitter.EmitNumericalLabel(1)
    emitter.EmitNewline()
  
    lhs_load = [registers.DoubleRegister() for unused_i in range(3)]
    rhs_load = [registers.DoubleRegister() for unused_i in range(3)]
    temp = [registers.QuadRegister() for unused_i in range(4)]
  
    emitter.EmitVLoadA(1, 8, rhs_load, emitter.DereferenceIncrement(rhs, 64))
    emitter.EmitVLoad(1, 8, lhs_load[0], emitter.DereferenceIncrement(lhs, 64))
  
    emitter.EmitVMull('u8', temp[0], lhs_load[0], rhs_load[0])
    emitter.EmitVLoad(1, 8, lhs_load[1], emitter.DereferenceIncrement(lhs, 64))
  
    emitter.EmitVMull('u8', temp[1], lhs_load[0], rhs_load[1])
    emitter.EmitVLoad(1, 8, lhs_load[2], emitter.DereferenceIncrement(lhs, 64))
  
    emitter.EmitVMull('u8', temp[2], lhs_load[0], rhs_load[2])
    emitter.EmitPldOffset(lhs, emitter.ImmediateConstant(64))
  
    emitter.EmitVMull('u8', temp[3], lhs_load[1], rhs_load[0])
    emitter.EmitPldOffset(rhs, emitter.ImmediateConstant(64))
  
    emitter.EmitVPadal('u16', aggregators[0], temp[0])
    emitter.EmitVPadal('u16', aggregators[1], temp[1])
    emitter.EmitVPadal('u16', aggregators[2], temp[2])
    emitter.EmitVPadal('u16', aggregators[3], temp[3])
  
    emitter.EmitVMull('u8', temp[0], lhs_load[1], rhs_load[1])
    emitter.EmitVMull('u8', temp[1], lhs_load[1], rhs_load[2])
  
    registers.FreeRegisters([lhs_load[0], lhs_load[1]])
    temp.append(registers.QuadRegister())
  
    emitter.EmitVMull('u8', temp[2], lhs_load[2], rhs_load[0])
    emitter.EmitVMull('u8', temp[3], lhs_load[2], rhs_load[1])
  
    emitter.EmitNewline()
    emitter.EmitComment('Subtract counter.')
    emitter.EmitSubs(count, count, emitter.ImmediateConstant(8))
    emitter.EmitNewline()
  
    emitter.EmitVMull('u8', temp[4], lhs_load[2], rhs_load[2])
  
    emitter.EmitVPadal('u16', aggregators[4], temp[0])
    emitter.EmitVPadal('u16', aggregators[5], temp[1])
    emitter.EmitVPadal('u16', aggregators[6], temp[2])
    emitter.EmitVPadal('u16', aggregators[7], temp[3])
    emitter.EmitVPadal('u16', aggregators[8], temp[4])
  
    emitter.EmitNewline()
    emitter.EmitComment('Loop break.')
    emitter.EmitBgtBack(1)
  
    registers.FreeRegisters(temp + [lhs_load[2]] + rhs_load)
function_tokens: def _Generate3x3LoadMultiplyAggregate ( emitter , registers , aggregators , lhs , rhs , count ) : emitter . EmitNewline ( ) emitter . EmitComment ( '3x3 lanes loop.' ) emitter . EmitNumericalLabel ( 1 ) emitter . EmitNewline ( ) lhs_load = [ registers . DoubleRegister ( ) for unused_i in range ( 3 ) ] rhs_load = [ registers . DoubleRegister ( ) for unused_i in range ( 3 ) ] temp = [ registers . QuadRegister ( ) for unused_i in range ( 4 ) ] emitter . EmitVLoadA ( 1 , 8 , rhs_load , emitter . DereferenceIncrement ( rhs , 64 ) ) emitter . EmitVLoad ( 1 , 8 , lhs_load [ 0 ] , emitter . DereferenceIncrement ( lhs , 64 ) ) emitter . EmitVMull ( 'u8' , temp [ 0 ] , lhs_load [ 0 ] , rhs_load [ 0 ] ) emitter . EmitVLoad ( 1 , 8 , lhs_load [ 1 ] , emitter . DereferenceIncrement ( lhs , 64 ) ) emitter . EmitVMull ( 'u8' , temp [ 1 ] , lhs_load [ 0 ] , rhs_load [ 1 ] ) emitter . EmitVLoad ( 1 , 8 , lhs_load [ 2 ] , emitter . DereferenceIncrement ( lhs , 64 ) ) emitter . EmitVMull ( 'u8' , temp [ 2 ] , lhs_load [ 0 ] , rhs_load [ 2 ] ) emitter . EmitPldOffset ( lhs , emitter . ImmediateConstant ( 64 ) ) emitter . EmitVMull ( 'u8' , temp [ 3 ] , lhs_load [ 1 ] , rhs_load [ 0 ] ) emitter . EmitPldOffset ( rhs , emitter . ImmediateConstant ( 64 ) ) emitter . EmitVPadal ( 'u16' , aggregators [ 0 ] , temp [ 0 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 1 ] , temp [ 1 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 2 ] , temp [ 2 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 3 ] , temp [ 3 ] ) emitter . EmitVMull ( 'u8' , temp [ 0 ] , lhs_load [ 1 ] , rhs_load [ 1 ] ) emitter . EmitVMull ( 'u8' , temp [ 1 ] , lhs_load [ 1 ] , rhs_load [ 2 ] ) registers . FreeRegisters ( [ lhs_load [ 0 ] , lhs_load [ 1 ] ] ) temp . append ( registers . QuadRegister ( ) ) emitter . EmitVMull ( 'u8' , temp [ 2 ] , lhs_load [ 2 ] , rhs_load [ 0 ] ) emitter . EmitVMull ( 'u8' , temp [ 3 ] , lhs_load [ 2 ] , rhs_load [ 1 ] ) emitter . EmitNewline ( ) emitter . EmitComment ( 'Subtract counter.' ) emitter . EmitSubs ( count , count , emitter . ImmediateConstant ( 8 ) ) emitter . EmitNewline ( ) emitter . EmitVMull ( 'u8' , temp [ 4 ] , lhs_load [ 2 ] , rhs_load [ 2 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 4 ] , temp [ 0 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 5 ] , temp [ 1 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 6 ] , temp [ 2 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 7 ] , temp [ 3 ] ) emitter . EmitVPadal ( 'u16' , aggregators [ 8 ] , temp [ 4 ] ) emitter . EmitNewline ( ) emitter . EmitComment ( 'Loop break.' ) emitter . EmitBgtBack ( 1 ) registers . FreeRegisters ( temp + [ lhs_load [ 2 ] ] + rhs_load )