user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<nnp_conv1x1_upto_2x4__scalar>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x74(%rbp)
  mov    %esi,-0x78(%rbp)
  mov    %rdx,-0x80(%rbp)
  mov    %rcx,-0x88(%rbp)
  mov    %r8,-0x90(%rbp)
  mov    %r9,-0x98(%rbp)
  mov    -0x90(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x98(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  cmpl   $0x1,-0x74(%rbp)
  jle    L135
  mov    -0x98(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x68(%rbp)
L135:
  cmpl   $0x1,-0x78(%rbp)
  jle    L82
  mov    -0x80(%rbp),%rax
  shl    $0x2,%rax
  add    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x64(%rbp)
  cmpl   $0x1,-0x74(%rbp)
  jle    L21
  mov    -0x98(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x60(%rbp)
L21:
  cmpl   $0x2,-0x78(%rbp)
  jle    L82
  mov    -0x80(%rbp),%rax
  shl    $0x2,%rax
  add    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x5c(%rbp)
  cmpl   $0x1,-0x74(%rbp)
  jle    L13
  mov    -0x98(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x58(%rbp)
L13:
  cmpl   $0x3,-0x78(%rbp)
  jle    L82
  mov    -0x80(%rbp),%rax
  shl    $0x2,%rax
  add    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x54(%rbp)
  cmpl   $0x1,-0x74(%rbp)
  jle    L82
  mov    -0x98(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x50(%rbp)
L82:
  mov    0x10(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
L25:
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x4c(%rbp)
  cmpl   $0x1,-0x78(%rbp)
  jle    L52
  mov    -0x18(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x48(%rbp)
  cmpl   $0x2,-0x78(%rbp)
  jle    L52
  mov    -0x10(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x44(%rbp)
  cmpl   $0x3,-0x78(%rbp)
  jle    L52
  mov    -0x8(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x40(%rbp)
L52:
  mov    -0x30(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movss  (%rax),%xmm0
  movss  %xmm0,-0x38(%rbp)
  movss  -0x3c(%rbp),%xmm0
  mulss  -0x38(%rbp),%xmm0
  movss  -0x4c(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x64(%rbp),%xmm0
  mulss  -0x38(%rbp),%xmm0
  movss  -0x48(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x5c(%rbp),%xmm0
  mulss  -0x38(%rbp),%xmm0
  movss  -0x44(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x44(%rbp)
  movss  -0x54(%rbp),%xmm0
  mulss  -0x38(%rbp),%xmm0
  movss  -0x40(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x40(%rbp)
  cmpl   $0x1,-0x74(%rbp)
  jle    L53
  mov    -0x28(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movss  (%rax),%xmm0
  movss  %xmm0,-0x34(%rbp)
  movss  -0x68(%rbp),%xmm0
  mulss  -0x34(%rbp),%xmm0
  movss  -0x4c(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x60(%rbp),%xmm0
  mulss  -0x34(%rbp),%xmm0
  movss  -0x48(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x58(%rbp),%xmm0
  mulss  -0x34(%rbp),%xmm0
  movss  -0x44(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x44(%rbp)
  movss  -0x50(%rbp),%xmm0
  mulss  -0x34(%rbp),%xmm0
  movss  -0x40(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x40(%rbp)
L53:
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movss  -0x4c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  cmpl   $0x1,-0x78(%rbp)
  jle    L85
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movss  -0x48(%rbp),%xmm0
  movss  %xmm0,(%rax)
  cmpl   $0x2,-0x78(%rbp)
  jle    L85
  mov    -0x10(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movss  -0x44(%rbp),%xmm0
  movss  %xmm0,(%rax)
  cmpl   $0x3,-0x78(%rbp)
  jle    L85
  mov    -0x8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
L85:
  subq   $0x1,-0x88(%rbp)
  cmpq   $0x0,-0x88(%rbp)
  jne    L25
  nop
  nop
  leave
  ret
```

assistant: ```c
void nnp_conv1x1_upto_2x4__scalar(uint32_t input_channels_subblock_size, uint32_t output_channels_subblock_size, size_t input_channels, size_t image_size, const float *input, const float *kernel, float *output) {
  const float *pinput0 = input;
  const float *pinput1 = input + image_size;
  float kernel00, kernel01, kernel10, kernel11, kernel20, kernel21, kernel30, kernel31;
  kernel00 = kernel[0];
  if (input_channels_subblock_size > 1) {
    kernel01 = kernel[1];
  }
  if (output_channels_subblock_size > 1) {
    kernel += input_channels;
    kernel10 = kernel[0];
    if (input_channels_subblock_size > 1) {
      kernel11 = kernel[1];
    }
    if (output_channels_subblock_size > 2) {
      kernel += input_channels;
      kernel20 = kernel[0];
      if (input_channels_subblock_size > 1) {
        kernel21 = kernel[1];
      }
      if (output_channels_subblock_size > 3) {
        kernel += input_channels;
        kernel30 = kernel[0];
        if (input_channels_subblock_size > 1) {
          kernel31 = kernel[1];
        }
      }
    }
  }
  float *poutput0 = output;
  float *poutput1 = poutput0 + image_size;
  float *poutput2 = poutput1 + image_size;
  float *poutput3 = poutput2 + image_size;
  do {
    float output0, output1, output2, output3;
    output0 = *poutput0;
    if (output_channels_subblock_size > 1) {
      output1 = *poutput1;
      if (output_channels_subblock_size > 2) {
        output2 = *poutput2;
        if (output_channels_subblock_size > 3) {
          output3 = *poutput3;
        }
      }
    }
    const float input0 = *pinput0++;
    output0 += kernel00 * input0;
    output1 += kernel10 * input0;
    output2 += kernel20 * input0;
    output3 += kernel30 * input0;
    if (input_channels_subblock_size > 1) {
      const float input1 = *pinput1++;
      output0 += kernel01 * input1;
      output1 += kernel11 * input1;
      output2 += kernel21 * input1;
      output3 += kernel31 * input1;
    }
    *poutput0++ = output0;
    if (output_channels_subblock_size > 1) {
      *poutput1++ = output1;
      if (output_channels_subblock_size > 2) {
        *poutput2++ = output2;
        if (output_channels_subblock_size > 3) {
          *poutput3++ = output3;
        }
      }
    }
  } while (--image_size != 0);
}
```