
/* WARNING: Unknown calling convention */

void flonum_multip(FLONUM_TYPE *a,FLONUM_TYPE *b,FLONUM_TYPE *product)

{
  int iVar1;
  ushort uVar2;
  LITTLENUM_TYPE *pLVar3;
  LITTLENUM_TYPE *pLVar4;
  ushort *puVar5;
  int iVar6;
  ushort *puVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  ushort *puVar11;
  int iVar12;
  int iVar13;
  uint local_38;
  int local_34;
  int local_28;
  uint local_20;
  int local_1c;
  int local_18;
  
  if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {
    product->sign = '\0';
    return;
  }
  local_28 = 0;
  product->sign = (a->sign != b->sign) * '\x02' + '+';
  pLVar3 = a->low;
  pLVar4 = b->low;
  iVar13 = (int)a->leader - (int)pLVar3 >> 1;
  iVar8 = (int)b->leader - (int)pLVar4 >> 1;
  puVar5 = product->low;
  local_1c = a->exponent + b->exponent;
  iVar1 = iVar13 + iVar8;
  local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1;
  if (local_18 < 0) {
    local_1c = local_1c - local_18;
    local_28 = local_18;
  }
  if (-1 < iVar1) {
    local_34 = 0;
    local_20 = 0;
    uVar10 = 0;
    do {
      iVar12 = 0;
      local_38 = 0;
      iVar6 = local_34;
      do {
        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {
          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];
          uVar10 = uVar9 & 0xffff;
          local_38 = local_38 + (uVar9 >> 0x10);
        }
        iVar6 = iVar6 + -1;
        iVar12 = iVar12 + 1;
      } while (iVar6 != -1);
      local_20 = local_20 | uVar10;
      if ((local_20 == 0) && (-1 < local_28)) {
        local_18 = local_18 + 1;
        local_1c = local_1c + 1;
      }
      else {
        if (-1 < local_28) {
          puVar5[local_28] = (ushort)uVar10;
        }
        local_28 = local_28 + 1;
      }
      local_34 = local_34 + 1;
      uVar10 = local_38;
    } while (iVar1 + 1 != local_34);
    if (local_38 != 0) {
      if (local_18 < 1) {
        local_1c = local_1c + 1;
        puVar11 = puVar5 + local_28 + -1;
        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {
          uVar2 = *puVar7;
          *puVar7 = (ushort)local_38;
          local_38 = (uint)uVar2;
        }
      }
      else {
        puVar11 = puVar5 + local_28;
        *puVar11 = (ushort)local_38;
      }
      goto LAB_000245a3;
    }
  }
  puVar11 = puVar5 + local_28 + -1;
LAB_000245a3:
  product->leader = puVar11;
  product->exponent = local_1c;
  return;
}



void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)

{
  int iVar1;
  ushort uVar2;
  int iVar3;
  int iVar4;
  ushort *puVar5;
  int iVar6;
  ushort *puVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  ushort *puVar11;
  int iVar12;
  int iVar13;
  uint local_38;
  int local_34;
  int local_28;
  uint local_20;
  int local_1c;
  int local_18;
  
  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {
    *(undefined1 *)(param_3 + 4) = 0;
    return;
  }
  local_28 = 0;
  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';
  iVar3 = *param_1;
  iVar4 = *param_2;
  iVar13 = param_1[2] - iVar3 >> 1;
  iVar8 = param_2[2] - iVar4 >> 1;
  puVar5 = (ushort *)*param_3;
  local_1c = param_1[3] + param_2[3];
  iVar1 = iVar13 + iVar8;
  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;
  if (local_18 < 0) {
    local_1c = local_1c - local_18;
    local_28 = local_18;
  }
  if (-1 < iVar1) {
    local_34 = 0;
    local_20 = 0;
    uVar10 = 0;
    do {
      iVar12 = 0;
      local_38 = 0;
      iVar6 = local_34;
      do {
        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {
          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *
                           (uint)*(ushort *)(iVar4 + iVar6 * 2);
          uVar10 = uVar9 & 0xffff;
          local_38 = local_38 + (uVar9 >> 0x10);
        }
        iVar6 = iVar6 + -1;
        iVar12 = iVar12 + 1;
      } while (iVar6 != -1);
      local_20 = local_20 | uVar10;
      if ((local_20 == 0) && (-1 < local_28)) {
        local_18 = local_18 + 1;
        local_1c = local_1c + 1;
      }
      else {
        if (-1 < local_28) {
          puVar5[local_28] = (ushort)uVar10;
        }
        local_28 = local_28 + 1;
      }
      local_34 = local_34 + 1;
      uVar10 = local_38;
    } while (iVar1 + 1 != local_34);
    if (local_38 != 0) {
      if (local_18 < 1) {
        local_1c = local_1c + 1;
        puVar11 = puVar5 + local_28 + -1;
        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {
          uVar2 = *puVar7;
          *puVar7 = (ushort)local_38;
          local_38 = (uint)uVar2;
        }
      }
      else {
        puVar11 = puVar5 + local_28;
        *puVar11 = (ushort)local_38;
      }
      goto LAB_000245a3;
    }
  }
  puVar11 = puVar5 + local_28 + -1;
LAB_000245a3:
  param_3[2] = puVar11;
  param_3[3] = local_1c;
  return;
}


PUSH EBP
PUSH EDI
PUSH ESI
PUSH EBX
SUB ESP,0x28
MOV EAX,dword ptr [ESP + 0x3c]
MOV EDX,dword ptr [ESP + 0x40]
MOVZX ECX,byte ptr [EAX + 0x10]
LEA EBX,[ECX + -0x2b]
AND EBX,0xfd
JNZ 0x00024568
MOVZX EBX,byte ptr [EDX + 0x10]
LEA ESI,[EBX + -0x2b]
AND ESI,0xfd
JNZ 0x00024568
CMP CL,BL
MOV ESI,dword ptr [ESP + 0x44]
MOV dword ptr [ESP + 0x10],0x0
SETNZ CL
LEA ECX,[ECX + ECX*0x1 + 0x2b]
MOV byte ptr [ESI + 0x10],CL
MOV ESI,dword ptr [EAX]
MOV ECX,ESI
MOV dword ptr [ESP + 0x8],ESI
MOV ESI,dword ptr [EAX + 0x8]
SUB ESI,ECX
MOV ECX,dword ptr [EDX]
SAR ESI,0x1
MOV EDI,ECX
MOV dword ptr [ESP + 0xc],ECX
MOV ECX,dword ptr [EDX + 0x8]
MOV EDX,dword ptr [EDX + 0xc]
SUB ECX,EDI
SAR ECX,0x1
MOV EBP,ECX
MOV ECX,dword ptr [EAX + 0xc]
MOV EAX,dword ptr [ESP + 0x44]
MOV EDI,dword ptr [EAX]
MOV EAX,dword ptr [EAX + 0x4]
ADD ECX,EDX
LEA EDX,[ESI + EBP*0x1]
MOV dword ptr [ESP + 0x1c],ECX
MOV dword ptr [ESP],EAX
SUB EAX,EDI
SAR EAX,0x1
MOV dword ptr [ESP + 0x24],EDI
SUB EAX,EDX
MOV dword ptr [ESP + 0x20],EAX
JNS 0x000244b2
SUB ECX,EAX
MOV dword ptr [ESP + 0x10],EAX
MOV dword ptr [ESP + 0x1c],ECX
TEST EDX,EDX
JS 0x00024597
LEA EAX,[EDX + 0x1]
MOV dword ptr [ESP + 0x4],0x0
XOR EDI,EDI
MOV dword ptr [ESP + 0x14],EAX
MOV dword ptr [ESP + 0x18],0x0
LEA ESI,[ESI]
NOP
MOV ECX,EDI
XOR EDI,EDI
MOV EAX,dword ptr [ESP + 0x4]
XOR EDX,EDX
MOV dword ptr [ESP],EDI
LEA ESI,[ESI]
CMP ESI,EDX
JL 0x00024510
CMP EBP,EAX
JL 0x00024510
MOV EBX,dword ptr [ESP + 0x8]
MOV EDI,dword ptr [ESP + 0xc]
MOVZX EBX,word ptr [EBX + EDX*0x2]
MOVZX EDI,word ptr [EDI + EAX*0x2]
IMUL EBX,EDI
ADD ECX,EBX
MOV EBX,ECX
MOVZX ECX,CX
SHR EBX,0x10
ADD dword ptr [ESP],EBX
SUB EAX,0x1
ADD EDX,0x1
CMP EAX,-0x1
JNZ 0x000244e8
OR dword ptr [ESP + 0x18],ECX
MOV EDI,dword ptr [ESP]
JNZ 0x00024580
MOV EDX,dword ptr [ESP + 0x10]
TEST EDX,EDX
JS 0x00024580
ADD dword ptr [ESP + 0x20],0x1
ADD dword ptr [ESP + 0x1c],0x1
ADD dword ptr [ESP + 0x4],0x1
MOV EAX,dword ptr [ESP + 0x4]
CMP dword ptr [ESP + 0x14],EAX
JNZ 0x000244d8
TEST EDI,EDI
JZ 0x00024597
MOV EAX,dword ptr [ESP + 0x20]
TEST EAX,EAX
JLE 0x000245b9
MOV EAX,dword ptr [ESP + 0x24]
MOV ESI,dword ptr [ESP + 0x10]
LEA ECX,[EAX + ESI*0x2]
MOV word ptr [ECX],DI
JMP 0x000245a3
MOV EAX,dword ptr [ESP + 0x44]
MOV byte ptr [EAX + 0x10],0x0
ADD ESP,0x28
POP EBX
POP ESI
POP EDI
POP EBP
RET
MOV EAX,dword ptr [ESP + 0x10]
TEST EAX,EAX
JS 0x00024590
MOV EDX,dword ptr [ESP + 0x24]
MOV word ptr [EDX + EAX*0x2],CX
ADD dword ptr [ESP + 0x10],0x1
JMP 0x00024536
MOV EAX,dword ptr [ESP + 0x24]
MOV ESI,dword ptr [ESP + 0x10]
LEA ECX,[EAX + ESI*0x2 + -0x2]
MOV EAX,dword ptr [ESP + 0x44]
MOV ESI,dword ptr [ESP + 0x1c]
MOV dword ptr [EAX + 0x8],ECX
MOV dword ptr [EAX + 0xc],ESI
ADD ESP,0x28
POP EBX
POP ESI
POP EDI
POP EBP
RET
MOV EBX,dword ptr [ESP + 0x24]
MOV ESI,dword ptr [ESP + 0x10]
ADD dword ptr [ESP + 0x1c],0x1
LEA ECX,[EBX + ESI*0x2 + -0x2]
CMP EBX,ECX
JA 0x000245a3
MOV EAX,ECX
MOVZX EDX,word ptr [EAX]
MOV word ptr [EAX],DI
SUB EAX,0x2
MOV EDI,EDX
CMP EBX,EAX
JBE 0x000245d0
JMP 0x000245a3
(translation_unit "void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)\n\n{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}\n\n" (function_definition "void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)\n\n{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" primitive_type (function_declarator "FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)" identifier (parameter_list "(int *param_1,int *param_2,undefined4 *param_3)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int *param_2" primitive_type (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "undefined4 *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) ))) (compound_statement "{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "ushort uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "ushort *puVar5;" type_identifier (pointer_declarator "*puVar5" * identifier) ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "ushort *puVar7;" type_identifier (pointer_declarator "*puVar7" * identifier) ;) (declaration "int iVar8;" primitive_type identifier ;) (declaration "uint uVar9;" type_identifier identifier ;) (declaration "uint uVar10;" type_identifier identifier ;) (declaration "ushort *puVar11;" type_identifier (pointer_declarator "*puVar11" * identifier) ;) (declaration "int iVar12;" primitive_type identifier ;) (declaration "int iVar13;" primitive_type identifier ;) (declaration "uint local_38;" type_identifier identifier ;) (declaration "int local_34;" primitive_type identifier ;) (declaration "int local_28;" primitive_type identifier ;) (declaration "uint local_20;" type_identifier identifier ;) (declaration "int local_1c;" primitive_type identifier ;) (declaration "int local_18;" primitive_type identifier ;) (if_statement "if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" if (parenthesized_expression "((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0))" ( (binary_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)" (parenthesized_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0)" ( (binary_expression "((char)param_1[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_1[4] - 0x2bU & 0xfd)" ( (binary_expression "(char)param_1[4] - 0x2bU & 0xfd" (binary_expression "(char)param_1[4] - 0x2bU" (cast_expression "(char)param_1[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_1[4]" identifier [ number_literal ])) - number_literal) & number_literal) )) != number_literal) )) || (parenthesized_expression "(((char)param_2[4] - 0x2bU & 0xfd) != 0)" ( (binary_expression "((char)param_2[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_2[4] - 0x2bU & 0xfd)" ( (binary_expression "(char)param_2[4] - 0x2bU & 0xfd" (binary_expression "(char)param_2[4] - 0x2bU" (cast_expression "(char)param_2[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_2[4]" identifier [ number_literal ])) - number_literal) & number_literal) )) != number_literal) ))) )) (compound_statement "{\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" { (expression_statement "*(undefined1 *)(param_3 + 4) = 0;" (assignment_expression "*(undefined1 *)(param_3 + 4) = 0" (pointer_expression "*(undefined1 *)(param_3 + 4)" * (cast_expression "(undefined1 *)(param_3 + 4)" ( (type_descriptor "undefined1 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 4)" ( (binary_expression "param_3 + 4" identifier + number_literal) )))) = number_literal) ;) (return_statement "return;" return ;) })) (expression_statement "local_28 = 0;" (assignment_expression "local_28 = 0" identifier = number_literal) ;) (expression_statement "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';" (assignment_expression "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (pointer_expression "*(char *)(param_3 + 4)" * (cast_expression "(char *)(param_3 + 4)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 4)" ( (binary_expression "param_3 + 4" identifier + number_literal) )))) = (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02'" (parenthesized_expression "((char)param_1[4] != (char)param_2[4])" ( (binary_expression "(char)param_1[4] != (char)param_2[4]" (cast_expression "(char)param_1[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_1[4]" identifier [ number_literal ])) != (cast_expression "(char)param_2[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_2[4]" identifier [ number_literal ]))) )) * (char_literal "'\x02'" ' escape_sequence ')) + (char_literal "'+'" ' character '))) ;) (expression_statement "iVar3 = *param_1;" (assignment_expression "iVar3 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "iVar4 = *param_2;" (assignment_expression "iVar4 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "iVar13 = param_1[2] - iVar3 >> 1;" (assignment_expression "iVar13 = param_1[2] - iVar3 >> 1" identifier = (binary_expression "param_1[2] - iVar3 >> 1" (binary_expression "param_1[2] - iVar3" (subscript_expression "param_1[2]" identifier [ number_literal ]) - identifier) >> number_literal)) ;) (expression_statement "iVar8 = param_2[2] - iVar4 >> 1;" (assignment_expression "iVar8 = param_2[2] - iVar4 >> 1" identifier = (binary_expression "param_2[2] - iVar4 >> 1" (binary_expression "param_2[2] - iVar4" (subscript_expression "param_2[2]" identifier [ number_literal ]) - identifier) >> number_literal)) ;) (expression_statement "puVar5 = (ushort *)*param_3;" (assignment_expression "puVar5 = (ushort *)*param_3" identifier = (cast_expression "(ushort *)*param_3" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier))) ;) (expression_statement "local_1c = param_1[3] + param_2[3];" (assignment_expression "local_1c = param_1[3] + param_2[3]" identifier = (binary_expression "param_1[3] + param_2[3]" (subscript_expression "param_1[3]" identifier [ number_literal ]) + (subscript_expression "param_2[3]" identifier [ number_literal ]))) ;) (expression_statement "iVar1 = iVar13 + iVar8;" (assignment_expression "iVar1 = iVar13 + iVar8" identifier = (binary_expression "iVar13 + iVar8" identifier + identifier)) ;) (expression_statement "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;" (assignment_expression "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1" identifier = (binary_expression "(param_3[1] - (int)puVar5 >> 1) - iVar1" (parenthesized_expression "(param_3[1] - (int)puVar5 >> 1)" ( (binary_expression "param_3[1] - (int)puVar5 >> 1" (binary_expression "param_3[1] - (int)puVar5" (subscript_expression "param_3[1]" identifier [ number_literal ]) - (cast_expression "(int)puVar5" ( (type_descriptor "int" primitive_type) ) identifier)) >> number_literal) )) - identifier)) ;) (if_statement "if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" if (parenthesized_expression "(local_18 < 0)" ( (binary_expression "local_18 < 0" identifier < number_literal) )) (compound_statement "{\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" { (expression_statement "local_1c = local_1c - local_18;" (assignment_expression "local_1c = local_1c - local_18" identifier = (binary_expression "local_1c - local_18" identifier - identifier)) ;) (expression_statement "local_28 = local_18;" (assignment_expression "local_28 = local_18" identifier = identifier) ;) })) (if_statement "if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" if (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" { (expression_statement "local_34 = 0;" (assignment_expression "local_34 = 0" identifier = number_literal) ;) (expression_statement "local_20 = 0;" (assignment_expression "local_20 = 0" identifier = number_literal) ;) (expression_statement "uVar10 = 0;" (assignment_expression "uVar10 = 0" identifier = number_literal) ;) (do_statement "do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);" do (compound_statement "{\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    }" { (expression_statement "iVar12 = 0;" (assignment_expression "iVar12 = 0" identifier = number_literal) ;) (expression_statement "local_38 = 0;" (assignment_expression "local_38 = 0" identifier = number_literal) ;) (expression_statement "iVar6 = local_34;" (assignment_expression "iVar6 = local_34" identifier = identifier) ;) (do_statement "do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);" do (compound_statement "{\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      }" { (if_statement "if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" if (parenthesized_expression "((iVar12 <= iVar13) && (iVar6 <= iVar8))" ( (binary_expression "(iVar12 <= iVar13) && (iVar6 <= iVar8)" (parenthesized_expression "(iVar12 <= iVar13)" ( (binary_expression "iVar12 <= iVar13" identifier <= identifier) )) && (parenthesized_expression "(iVar6 <= iVar8)" ( (binary_expression "iVar6 <= iVar8" identifier <= identifier) ))) )) (compound_statement "{\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" { (expression_statement "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);" (assignment_expression "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" identifier = (binary_expression "uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" identifier + (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2)" (parenthesized_expression "(uint)" ( identifier )) * (cast_expression "(ushort *)(iVar3 + iVar12 * 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar12 * 2)" ( (binary_expression "iVar3 + iVar12 * 2" identifier + (binary_expression "iVar12 * 2" identifier * number_literal)) )))) * (parenthesized_expression "(uint)" ( identifier ))) * (cast_expression "(ushort *)(iVar4 + iVar6 * 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar4 + iVar6 * 2)" ( (binary_expression "iVar4 + iVar6 * 2" identifier + (binary_expression "iVar6 * 2" identifier * number_literal)) )))))) ;) (expression_statement "uVar10 = uVar9 & 0xffff;" (assignment_expression "uVar10 = uVar9 & 0xffff" identifier = (binary_expression "uVar9 & 0xffff" identifier & number_literal)) ;) (expression_statement "local_38 = local_38 + (uVar9 >> 0x10);" (assignment_expression "local_38 = local_38 + (uVar9 >> 0x10)" identifier = (binary_expression "local_38 + (uVar9 >> 0x10)" identifier + (parenthesized_expression "(uVar9 >> 0x10)" ( (binary_expression "uVar9 >> 0x10" identifier >> number_literal) )))) ;) })) (expression_statement "iVar6 = iVar6 + -1;" (assignment_expression "iVar6 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "iVar12 = iVar12 + 1;" (assignment_expression "iVar12 = iVar12 + 1" identifier = (binary_expression "iVar12 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar6 != -1)" ( (binary_expression "iVar6 != -1" identifier != number_literal) )) ;) (expression_statement "local_20 = local_20 | uVar10;" (assignment_expression "local_20 = local_20 | uVar10" identifier = (binary_expression "local_20 | uVar10" identifier | identifier)) ;) (if_statement "if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" if (parenthesized_expression "((local_20 == 0) && (-1 < local_28))" ( (binary_expression "(local_20 == 0) && (-1 < local_28)" (parenthesized_expression "(local_20 == 0)" ( (binary_expression "local_20 == 0" identifier == number_literal) )) && (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) ))) )) (compound_statement "{\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }" { (expression_statement "local_18 = local_18 + 1;" (assignment_expression "local_18 = local_18 + 1" identifier = (binary_expression "local_18 + 1" identifier + number_literal)) ;) (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) }) (else_clause "else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" else (compound_statement "{\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" { (if_statement "if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }" if (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) )) (compound_statement "{\n          puVar5[local_28] = (ushort)uVar10;\n        }" { (expression_statement "puVar5[local_28] = (ushort)uVar10;" (assignment_expression "puVar5[local_28] = (ushort)uVar10" (subscript_expression "puVar5[local_28]" identifier [ identifier ]) = (cast_expression "(ushort)uVar10" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) (expression_statement "local_28 = local_28 + 1;" (assignment_expression "local_28 = local_28 + 1" identifier = (binary_expression "local_28 + 1" identifier + number_literal)) ;) }))) (expression_statement "local_34 = local_34 + 1;" (assignment_expression "local_34 = local_34 + 1" identifier = (binary_expression "local_34 + 1" identifier + number_literal)) ;) (expression_statement "uVar10 = local_38;" (assignment_expression "uVar10 = local_38" identifier = identifier) ;) }) while (parenthesized_expression "(iVar1 + 1 != local_34)" ( (binary_expression "iVar1 + 1 != local_34" (binary_expression "iVar1 + 1" identifier + number_literal) != identifier) )) ;) (if_statement "if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" if (parenthesized_expression "(local_38 != 0)" ( (binary_expression "local_38 != 0" identifier != number_literal) )) (compound_statement "{\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" { (if_statement "if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" if (parenthesized_expression "(local_18 < 1)" ( (binary_expression "local_18 < 1" identifier < number_literal) )) (compound_statement "{\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }" { (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (for_statement "for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" for ( (assignment_expression "puVar7 = puVar11" identifier = identifier) ; (binary_expression "puVar5 <= puVar7" identifier <= identifier) ; (assignment_expression "puVar7 = puVar7 + -1" identifier = (binary_expression "puVar7 + -1" identifier + number_literal)) ) (compound_statement "{\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" { (expression_statement "uVar2 = *puVar7;" (assignment_expression "uVar2 = *puVar7" identifier = (pointer_expression "*puVar7" * identifier)) ;) (expression_statement "*puVar7 = (ushort)local_38;" (assignment_expression "*puVar7 = (ushort)local_38" (pointer_expression "*puVar7" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (expression_statement "local_38 = (uint)uVar2;" (assignment_expression "local_38 = (uint)uVar2" identifier = (cast_expression "(uint)uVar2" ( (type_descriptor "uint" type_identifier) ) identifier)) ;) })) }) (else_clause "else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" else (compound_statement "{\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" { (expression_statement "puVar11 = puVar5 + local_28;" (assignment_expression "puVar11 = puVar5 + local_28" identifier = (binary_expression "puVar5 + local_28" identifier + identifier)) ;) (expression_statement "*puVar11 = (ushort)local_38;" (assignment_expression "*puVar11 = (ushort)local_38" (pointer_expression "*puVar11" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) }))) (goto_statement "goto LAB_000245a3;" goto statement_identifier ;) })) })) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (labeled_statement "LAB_000245a3:\n  param_3[2] = puVar11;" statement_identifier : (expression_statement "param_3[2] = puVar11;" (assignment_expression "param_3[2] = puVar11" (subscript_expression "param_3[2]" identifier [ number_literal ]) = identifier) ;)) (expression_statement "param_3[3] = local_1c;" (assignment_expression "param_3[3] = local_1c" (subscript_expression "param_3[3]" identifier [ number_literal ]) = identifier) ;) (return_statement "return;" return ;) })))
(translation_unit "/* WARNING: Unknown calling convention */\n\nvoid flonum_multip(FLONUM_TYPE *a,FLONUM_TYPE *b,FLONUM_TYPE *product)\n\n{\n  int iVar1;\n  ushort uVar2;\n  LITTLENUM_TYPE *pLVar3;\n  LITTLENUM_TYPE *pLVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {\n    product->sign = '\0';\n    return;\n  }\n  local_28 = 0;\n  product->sign = (a->sign != b->sign) * '\x02' + '+';\n  pLVar3 = a->low;\n  pLVar4 = b->low;\n  iVar13 = (int)a->leader - (int)pLVar3 >> 1;\n  iVar8 = (int)b->leader - (int)pLVar4 >> 1;\n  puVar5 = product->low;\n  local_1c = a->exponent + b->exponent;\n  iVar1 = iVar13 + iVar8;\n  local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  product->leader = puVar11;\n  product->exponent = local_1c;\n  return;\n}\n\n" comment (function_definition "void flonum_multip(FLONUM_TYPE *a,FLONUM_TYPE *b,FLONUM_TYPE *product)\n\n{\n  int iVar1;\n  ushort uVar2;\n  LITTLENUM_TYPE *pLVar3;\n  LITTLENUM_TYPE *pLVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {\n    product->sign = '\0';\n    return;\n  }\n  local_28 = 0;\n  product->sign = (a->sign != b->sign) * '\x02' + '+';\n  pLVar3 = a->low;\n  pLVar4 = b->low;\n  iVar13 = (int)a->leader - (int)pLVar3 >> 1;\n  iVar8 = (int)b->leader - (int)pLVar4 >> 1;\n  puVar5 = product->low;\n  local_1c = a->exponent + b->exponent;\n  iVar1 = iVar13 + iVar8;\n  local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  product->leader = puVar11;\n  product->exponent = local_1c;\n  return;\n}" primitive_type (function_declarator "flonum_multip(FLONUM_TYPE *a,FLONUM_TYPE *b,FLONUM_TYPE *product)" identifier (parameter_list "(FLONUM_TYPE *a,FLONUM_TYPE *b,FLONUM_TYPE *product)" ( (parameter_declaration "FLONUM_TYPE *a" type_identifier (pointer_declarator "*a" * identifier)) , (parameter_declaration "FLONUM_TYPE *b" type_identifier (pointer_declarator "*b" * identifier)) , (parameter_declaration "FLONUM_TYPE *product" type_identifier (pointer_declarator "*product" * identifier)) ))) (compound_statement "{\n  int iVar1;\n  ushort uVar2;\n  LITTLENUM_TYPE *pLVar3;\n  LITTLENUM_TYPE *pLVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {\n    product->sign = '\0';\n    return;\n  }\n  local_28 = 0;\n  product->sign = (a->sign != b->sign) * '\x02' + '+';\n  pLVar3 = a->low;\n  pLVar4 = b->low;\n  iVar13 = (int)a->leader - (int)pLVar3 >> 1;\n  iVar8 = (int)b->leader - (int)pLVar4 >> 1;\n  puVar5 = product->low;\n  local_1c = a->exponent + b->exponent;\n  iVar1 = iVar13 + iVar8;\n  local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  product->leader = puVar11;\n  product->exponent = local_1c;\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "ushort uVar2;" type_identifier identifier ;) (declaration "LITTLENUM_TYPE *pLVar3;" type_identifier (pointer_declarator "*pLVar3" * identifier) ;) (declaration "LITTLENUM_TYPE *pLVar4;" type_identifier (pointer_declarator "*pLVar4" * identifier) ;) (declaration "ushort *puVar5;" type_identifier (pointer_declarator "*puVar5" * identifier) ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "ushort *puVar7;" type_identifier (pointer_declarator "*puVar7" * identifier) ;) (declaration "int iVar8;" primitive_type identifier ;) (declaration "uint uVar9;" type_identifier identifier ;) (declaration "uint uVar10;" type_identifier identifier ;) (declaration "ushort *puVar11;" type_identifier (pointer_declarator "*puVar11" * identifier) ;) (declaration "int iVar12;" primitive_type identifier ;) (declaration "int iVar13;" primitive_type identifier ;) (declaration "uint local_38;" type_identifier identifier ;) (declaration "int local_34;" primitive_type identifier ;) (declaration "int local_28;" primitive_type identifier ;) (declaration "uint local_20;" type_identifier identifier ;) (declaration "int local_1c;" primitive_type identifier ;) (declaration "int local_18;" primitive_type identifier ;) (if_statement "if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {\n    product->sign = '\0';\n    return;\n  }" if (parenthesized_expression "(((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0))" ( (binary_expression "((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)" (parenthesized_expression "((a->sign - 0x2bU & 0xfd) != 0)" ( (binary_expression "(a->sign - 0x2bU & 0xfd) != 0" (parenthesized_expression "(a->sign - 0x2bU & 0xfd)" ( (binary_expression "a->sign - 0x2bU & 0xfd" (binary_expression "a->sign - 0x2bU" (field_expression "a->sign" identifier -> field_identifier) - number_literal) & number_literal) )) != number_literal) )) || (parenthesized_expression "((b->sign - 0x2bU & 0xfd) != 0)" ( (binary_expression "(b->sign - 0x2bU & 0xfd) != 0" (parenthesized_expression "(b->sign - 0x2bU & 0xfd)" ( (binary_expression "b->sign - 0x2bU & 0xfd" (binary_expression "b->sign - 0x2bU" (field_expression "b->sign" identifier -> field_identifier) - number_literal) & number_literal) )) != number_literal) ))) )) (compound_statement "{\n    product->sign = '\0';\n    return;\n  }" { (expression_statement "product->sign = '\0';" (assignment_expression "product->sign = '\0'" (field_expression "product->sign" identifier -> field_identifier) = (char_literal "'\0'" ' escape_sequence ')) ;) (return_statement "return;" return ;) })) (expression_statement "local_28 = 0;" (assignment_expression "local_28 = 0" identifier = number_literal) ;) (expression_statement "product->sign = (a->sign != b->sign) * '\x02' + '+';" (assignment_expression "product->sign = (a->sign != b->sign) * '\x02' + '+'" (field_expression "product->sign" identifier -> field_identifier) = (binary_expression "(a->sign != b->sign) * '\x02' + '+'" (binary_expression "(a->sign != b->sign) * '\x02'" (parenthesized_expression "(a->sign != b->sign)" ( (binary_expression "a->sign != b->sign" (field_expression "a->sign" identifier -> field_identifier) != (field_expression "b->sign" identifier -> field_identifier)) )) * (char_literal "'\x02'" ' escape_sequence ')) + (char_literal "'+'" ' character '))) ;) (expression_statement "pLVar3 = a->low;" (assignment_expression "pLVar3 = a->low" identifier = (field_expression "a->low" identifier -> field_identifier)) ;) (expression_statement "pLVar4 = b->low;" (assignment_expression "pLVar4 = b->low" identifier = (field_expression "b->low" identifier -> field_identifier)) ;) (expression_statement "iVar13 = (int)a->leader - (int)pLVar3 >> 1;" (assignment_expression "iVar13 = (int)a->leader - (int)pLVar3 >> 1" identifier = (binary_expression "(int)a->leader - (int)pLVar3 >> 1" (binary_expression "(int)a->leader - (int)pLVar3" (cast_expression "(int)a->leader" ( (type_descriptor "int" primitive_type) ) (field_expression "a->leader" identifier -> field_identifier)) - (cast_expression "(int)pLVar3" ( (type_descriptor "int" primitive_type) ) identifier)) >> number_literal)) ;) (expression_statement "iVar8 = (int)b->leader - (int)pLVar4 >> 1;" (assignment_expression "iVar8 = (int)b->leader - (int)pLVar4 >> 1" identifier = (binary_expression "(int)b->leader - (int)pLVar4 >> 1" (binary_expression "(int)b->leader - (int)pLVar4" (cast_expression "(int)b->leader" ( (type_descriptor "int" primitive_type) ) (field_expression "b->leader" identifier -> field_identifier)) - (cast_expression "(int)pLVar4" ( (type_descriptor "int" primitive_type) ) identifier)) >> number_literal)) ;) (expression_statement "puVar5 = product->low;" (assignment_expression "puVar5 = product->low" identifier = (field_expression "product->low" identifier -> field_identifier)) ;) (expression_statement "local_1c = a->exponent + b->exponent;" (assignment_expression "local_1c = a->exponent + b->exponent" identifier = (binary_expression "a->exponent + b->exponent" (field_expression "a->exponent" identifier -> field_identifier) + (field_expression "b->exponent" identifier -> field_identifier))) ;) (expression_statement "iVar1 = iVar13 + iVar8;" (assignment_expression "iVar1 = iVar13 + iVar8" identifier = (binary_expression "iVar13 + iVar8" identifier + identifier)) ;) (expression_statement "local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1;" (assignment_expression "local_18 = ((int)product->high - (int)puVar5 >> 1) - iVar1" identifier = (binary_expression "((int)product->high - (int)puVar5 >> 1) - iVar1" (parenthesized_expression "((int)product->high - (int)puVar5 >> 1)" ( (binary_expression "(int)product->high - (int)puVar5 >> 1" (binary_expression "(int)product->high - (int)puVar5" (cast_expression "(int)product->high" ( (type_descriptor "int" primitive_type) ) (field_expression "product->high" identifier -> field_identifier)) - (cast_expression "(int)puVar5" ( (type_descriptor "int" primitive_type) ) identifier)) >> number_literal) )) - identifier)) ;) (if_statement "if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" if (parenthesized_expression "(local_18 < 0)" ( (binary_expression "local_18 < 0" identifier < number_literal) )) (compound_statement "{\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" { (expression_statement "local_1c = local_1c - local_18;" (assignment_expression "local_1c = local_1c - local_18" identifier = (binary_expression "local_1c - local_18" identifier - identifier)) ;) (expression_statement "local_28 = local_18;" (assignment_expression "local_28 = local_18" identifier = identifier) ;) })) (if_statement "if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" if (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" { (expression_statement "local_34 = 0;" (assignment_expression "local_34 = 0" identifier = number_literal) ;) (expression_statement "local_20 = 0;" (assignment_expression "local_20 = 0" identifier = number_literal) ;) (expression_statement "uVar10 = 0;" (assignment_expression "uVar10 = 0" identifier = number_literal) ;) (do_statement "do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);" do (compound_statement "{\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    }" { (expression_statement "iVar12 = 0;" (assignment_expression "iVar12 = 0" identifier = number_literal) ;) (expression_statement "local_38 = 0;" (assignment_expression "local_38 = 0" identifier = number_literal) ;) (expression_statement "iVar6 = local_34;" (assignment_expression "iVar6 = local_34" identifier = identifier) ;) (do_statement "do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);" do (compound_statement "{\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      }" { (if_statement "if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" if (parenthesized_expression "((iVar12 <= iVar13) && (iVar6 <= iVar8))" ( (binary_expression "(iVar12 <= iVar13) && (iVar6 <= iVar8)" (parenthesized_expression "(iVar12 <= iVar13)" ( (binary_expression "iVar12 <= iVar13" identifier <= identifier) )) && (parenthesized_expression "(iVar6 <= iVar8)" ( (binary_expression "iVar6 <= iVar8" identifier <= identifier) ))) )) (compound_statement "{\n          uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" { (expression_statement "uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6];" (assignment_expression "uVar9 = uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6]" identifier = (binary_expression "uVar10 + (uint)pLVar3[iVar12] * (uint)pLVar4[iVar6]" identifier + (binary_expression "(uint)pLVar3[iVar12] * (uint)pLVar4[iVar6]" (cast_expression "(uint)pLVar3[iVar12]" ( (type_descriptor "uint" type_identifier) ) (subscript_expression "pLVar3[iVar12]" identifier [ identifier ])) * (cast_expression "(uint)pLVar4[iVar6]" ( (type_descriptor "uint" type_identifier) ) (subscript_expression "pLVar4[iVar6]" identifier [ identifier ]))))) ;) (expression_statement "uVar10 = uVar9 & 0xffff;" (assignment_expression "uVar10 = uVar9 & 0xffff" identifier = (binary_expression "uVar9 & 0xffff" identifier & number_literal)) ;) (expression_statement "local_38 = local_38 + (uVar9 >> 0x10);" (assignment_expression "local_38 = local_38 + (uVar9 >> 0x10)" identifier = (binary_expression "local_38 + (uVar9 >> 0x10)" identifier + (parenthesized_expression "(uVar9 >> 0x10)" ( (binary_expression "uVar9 >> 0x10" identifier >> number_literal) )))) ;) })) (expression_statement "iVar6 = iVar6 + -1;" (assignment_expression "iVar6 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "iVar12 = iVar12 + 1;" (assignment_expression "iVar12 = iVar12 + 1" identifier = (binary_expression "iVar12 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar6 != -1)" ( (binary_expression "iVar6 != -1" identifier != number_literal) )) ;) (expression_statement "local_20 = local_20 | uVar10;" (assignment_expression "local_20 = local_20 | uVar10" identifier = (binary_expression "local_20 | uVar10" identifier | identifier)) ;) (if_statement "if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" if (parenthesized_expression "((local_20 == 0) && (-1 < local_28))" ( (binary_expression "(local_20 == 0) && (-1 < local_28)" (parenthesized_expression "(local_20 == 0)" ( (binary_expression "local_20 == 0" identifier == number_literal) )) && (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) ))) )) (compound_statement "{\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }" { (expression_statement "local_18 = local_18 + 1;" (assignment_expression "local_18 = local_18 + 1" identifier = (binary_expression "local_18 + 1" identifier + number_literal)) ;) (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) }) (else_clause "else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" else (compound_statement "{\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" { (if_statement "if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }" if (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) )) (compound_statement "{\n          puVar5[local_28] = (ushort)uVar10;\n        }" { (expression_statement "puVar5[local_28] = (ushort)uVar10;" (assignment_expression "puVar5[local_28] = (ushort)uVar10" (subscript_expression "puVar5[local_28]" identifier [ identifier ]) = (cast_expression "(ushort)uVar10" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) (expression_statement "local_28 = local_28 + 1;" (assignment_expression "local_28 = local_28 + 1" identifier = (binary_expression "local_28 + 1" identifier + number_literal)) ;) }))) (expression_statement "local_34 = local_34 + 1;" (assignment_expression "local_34 = local_34 + 1" identifier = (binary_expression "local_34 + 1" identifier + number_literal)) ;) (expression_statement "uVar10 = local_38;" (assignment_expression "uVar10 = local_38" identifier = identifier) ;) }) while (parenthesized_expression "(iVar1 + 1 != local_34)" ( (binary_expression "iVar1 + 1 != local_34" (binary_expression "iVar1 + 1" identifier + number_literal) != identifier) )) ;) (if_statement "if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" if (parenthesized_expression "(local_38 != 0)" ( (binary_expression "local_38 != 0" identifier != number_literal) )) (compound_statement "{\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" { (if_statement "if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" if (parenthesized_expression "(local_18 < 1)" ( (binary_expression "local_18 < 1" identifier < number_literal) )) (compound_statement "{\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }" { (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (for_statement "for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" for ( (assignment_expression "puVar7 = puVar11" identifier = identifier) ; (binary_expression "puVar5 <= puVar7" identifier <= identifier) ; (assignment_expression "puVar7 = puVar7 + -1" identifier = (binary_expression "puVar7 + -1" identifier + number_literal)) ) (compound_statement "{\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" { (expression_statement "uVar2 = *puVar7;" (assignment_expression "uVar2 = *puVar7" identifier = (pointer_expression "*puVar7" * identifier)) ;) (expression_statement "*puVar7 = (ushort)local_38;" (assignment_expression "*puVar7 = (ushort)local_38" (pointer_expression "*puVar7" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (expression_statement "local_38 = (uint)uVar2;" (assignment_expression "local_38 = (uint)uVar2" identifier = (cast_expression "(uint)uVar2" ( (type_descriptor "uint" type_identifier) ) identifier)) ;) })) }) (else_clause "else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" else (compound_statement "{\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" { (expression_statement "puVar11 = puVar5 + local_28;" (assignment_expression "puVar11 = puVar5 + local_28" identifier = (binary_expression "puVar5 + local_28" identifier + identifier)) ;) (expression_statement "*puVar11 = (ushort)local_38;" (assignment_expression "*puVar11 = (ushort)local_38" (pointer_expression "*puVar11" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) }))) (goto_statement "goto LAB_000245a3;" goto statement_identifier ;) })) })) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (labeled_statement "LAB_000245a3:\n  product->leader = puVar11;" statement_identifier : (expression_statement "product->leader = puVar11;" (assignment_expression "product->leader = puVar11" (field_expression "product->leader" identifier -> field_identifier) = identifier) ;)) (expression_statement "product->exponent = local_1c;" (assignment_expression "product->exponent = local_1c" (field_expression "product->exponent" identifier -> field_identifier) = identifier) ;) (return_statement "return;" return ;) })))
(translation_unit "void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)\n\n{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}\n\n" (function_definition "void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)\n\n{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" primitive_type (function_declarator "FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)" identifier (parameter_list "(int *param_1,int *param_2,undefined4 *param_3)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int *param_2" primitive_type (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "undefined4 *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) ))) (compound_statement "{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "ushort uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "ushort *puVar5;" type_identifier (pointer_declarator "*puVar5" * identifier) ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "ushort *puVar7;" type_identifier (pointer_declarator "*puVar7" * identifier) ;) (declaration "int iVar8;" primitive_type identifier ;) (declaration "uint uVar9;" type_identifier identifier ;) (declaration "uint uVar10;" type_identifier identifier ;) (declaration "ushort *puVar11;" type_identifier (pointer_declarator "*puVar11" * identifier) ;) (declaration "int iVar12;" primitive_type identifier ;) (declaration "int iVar13;" primitive_type identifier ;) (declaration "uint local_38;" type_identifier identifier ;) (declaration "int local_34;" primitive_type identifier ;) (declaration "int local_28;" primitive_type identifier ;) (declaration "uint local_20;" type_identifier identifier ;) (declaration "int local_1c;" primitive_type identifier ;) (declaration "int local_18;" primitive_type identifier ;) (if_statement "if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" if (parenthesized_expression "((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0))" ( (binary_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)" (parenthesized_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0)" ( (binary_expression "((char)param_1[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_1[4] - 0x2bU & 0xfd)" ( (binary_expression "(char)param_1[4] - 0x2bU & 0xfd" (binary_expression "(char)param_1[4] - 0x2bU" (cast_expression "(char)param_1[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_1[4]" identifier [ number_literal ])) - number_literal) & number_literal) )) != number_literal) )) || (parenthesized_expression "(((char)param_2[4] - 0x2bU & 0xfd) != 0)" ( (binary_expression "((char)param_2[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_2[4] - 0x2bU & 0xfd)" ( (binary_expression "(char)param_2[4] - 0x2bU & 0xfd" (binary_expression "(char)param_2[4] - 0x2bU" (cast_expression "(char)param_2[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_2[4]" identifier [ number_literal ])) - number_literal) & number_literal) )) != number_literal) ))) )) (compound_statement "{\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" { (expression_statement "*(undefined1 *)(param_3 + 4) = 0;" (assignment_expression "*(undefined1 *)(param_3 + 4) = 0" (pointer_expression "*(undefined1 *)(param_3 + 4)" * (cast_expression "(undefined1 *)(param_3 + 4)" ( (type_descriptor "undefined1 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 4)" ( (binary_expression "param_3 + 4" identifier + number_literal) )))) = number_literal) ;) (return_statement "return;" return ;) })) (expression_statement "local_28 = 0;" (assignment_expression "local_28 = 0" identifier = number_literal) ;) (expression_statement "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';" (assignment_expression "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (pointer_expression "*(char *)(param_3 + 4)" * (cast_expression "(char *)(param_3 + 4)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 4)" ( (binary_expression "param_3 + 4" identifier + number_literal) )))) = (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02'" (parenthesized_expression "((char)param_1[4] != (char)param_2[4])" ( (binary_expression "(char)param_1[4] != (char)param_2[4]" (cast_expression "(char)param_1[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_1[4]" identifier [ number_literal ])) != (cast_expression "(char)param_2[4]" ( (type_descriptor "char" primitive_type) ) (subscript_expression "param_2[4]" identifier [ number_literal ]))) )) * (char_literal "'\x02'" ' escape_sequence ')) + (char_literal "'+'" ' character '))) ;) (expression_statement "iVar3 = *param_1;" (assignment_expression "iVar3 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "iVar4 = *param_2;" (assignment_expression "iVar4 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "iVar13 = param_1[2] - iVar3 >> 1;" (assignment_expression "iVar13 = param_1[2] - iVar3 >> 1" identifier = (binary_expression "param_1[2] - iVar3 >> 1" (binary_expression "param_1[2] - iVar3" (subscript_expression "param_1[2]" identifier [ number_literal ]) - identifier) >> number_literal)) ;) (expression_statement "iVar8 = param_2[2] - iVar4 >> 1;" (assignment_expression "iVar8 = param_2[2] - iVar4 >> 1" identifier = (binary_expression "param_2[2] - iVar4 >> 1" (binary_expression "param_2[2] - iVar4" (subscript_expression "param_2[2]" identifier [ number_literal ]) - identifier) >> number_literal)) ;) (expression_statement "puVar5 = (ushort *)*param_3;" (assignment_expression "puVar5 = (ushort *)*param_3" identifier = (cast_expression "(ushort *)*param_3" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier))) ;) (expression_statement "local_1c = param_1[3] + param_2[3];" (assignment_expression "local_1c = param_1[3] + param_2[3]" identifier = (binary_expression "param_1[3] + param_2[3]" (subscript_expression "param_1[3]" identifier [ number_literal ]) + (subscript_expression "param_2[3]" identifier [ number_literal ]))) ;) (expression_statement "iVar1 = iVar13 + iVar8;" (assignment_expression "iVar1 = iVar13 + iVar8" identifier = (binary_expression "iVar13 + iVar8" identifier + identifier)) ;) (expression_statement "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;" (assignment_expression "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1" identifier = (binary_expression "(param_3[1] - (int)puVar5 >> 1) - iVar1" (parenthesized_expression "(param_3[1] - (int)puVar5 >> 1)" ( (binary_expression "param_3[1] - (int)puVar5 >> 1" (binary_expression "param_3[1] - (int)puVar5" (subscript_expression "param_3[1]" identifier [ number_literal ]) - (cast_expression "(int)puVar5" ( (type_descriptor "int" primitive_type) ) identifier)) >> number_literal) )) - identifier)) ;) (if_statement "if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" if (parenthesized_expression "(local_18 < 0)" ( (binary_expression "local_18 < 0" identifier < number_literal) )) (compound_statement "{\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" { (expression_statement "local_1c = local_1c - local_18;" (assignment_expression "local_1c = local_1c - local_18" identifier = (binary_expression "local_1c - local_18" identifier - identifier)) ;) (expression_statement "local_28 = local_18;" (assignment_expression "local_28 = local_18" identifier = identifier) ;) })) (if_statement "if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" if (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" { (expression_statement "local_34 = 0;" (assignment_expression "local_34 = 0" identifier = number_literal) ;) (expression_statement "local_20 = 0;" (assignment_expression "local_20 = 0" identifier = number_literal) ;) (expression_statement "uVar10 = 0;" (assignment_expression "uVar10 = 0" identifier = number_literal) ;) (do_statement "do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);" do (compound_statement "{\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    }" { (expression_statement "iVar12 = 0;" (assignment_expression "iVar12 = 0" identifier = number_literal) ;) (expression_statement "local_38 = 0;" (assignment_expression "local_38 = 0" identifier = number_literal) ;) (expression_statement "iVar6 = local_34;" (assignment_expression "iVar6 = local_34" identifier = identifier) ;) (do_statement "do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);" do (compound_statement "{\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      }" { (if_statement "if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" if (parenthesized_expression "((iVar12 <= iVar13) && (iVar6 <= iVar8))" ( (binary_expression "(iVar12 <= iVar13) && (iVar6 <= iVar8)" (parenthesized_expression "(iVar12 <= iVar13)" ( (binary_expression "iVar12 <= iVar13" identifier <= identifier) )) && (parenthesized_expression "(iVar6 <= iVar8)" ( (binary_expression "iVar6 <= iVar8" identifier <= identifier) ))) )) (compound_statement "{\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" { (expression_statement "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);" (assignment_expression "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" identifier = (binary_expression "uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" identifier + (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2)" (parenthesized_expression "(uint)" ( identifier )) * (cast_expression "(ushort *)(iVar3 + iVar12 * 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar12 * 2)" ( (binary_expression "iVar3 + iVar12 * 2" identifier + (binary_expression "iVar12 * 2" identifier * number_literal)) )))) * (parenthesized_expression "(uint)" ( identifier ))) * (cast_expression "(ushort *)(iVar4 + iVar6 * 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar4 + iVar6 * 2)" ( (binary_expression "iVar4 + iVar6 * 2" identifier + (binary_expression "iVar6 * 2" identifier * number_literal)) )))))) ;) (expression_statement "uVar10 = uVar9 & 0xffff;" (assignment_expression "uVar10 = uVar9 & 0xffff" identifier = (binary_expression "uVar9 & 0xffff" identifier & number_literal)) ;) (expression_statement "local_38 = local_38 + (uVar9 >> 0x10);" (assignment_expression "local_38 = local_38 + (uVar9 >> 0x10)" identifier = (binary_expression "local_38 + (uVar9 >> 0x10)" identifier + (parenthesized_expression "(uVar9 >> 0x10)" ( (binary_expression "uVar9 >> 0x10" identifier >> number_literal) )))) ;) })) (expression_statement "iVar6 = iVar6 + -1;" (assignment_expression "iVar6 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "iVar12 = iVar12 + 1;" (assignment_expression "iVar12 = iVar12 + 1" identifier = (binary_expression "iVar12 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar6 != -1)" ( (binary_expression "iVar6 != -1" identifier != number_literal) )) ;) (expression_statement "local_20 = local_20 | uVar10;" (assignment_expression "local_20 = local_20 | uVar10" identifier = (binary_expression "local_20 | uVar10" identifier | identifier)) ;) (if_statement "if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" if (parenthesized_expression "((local_20 == 0) && (-1 < local_28))" ( (binary_expression "(local_20 == 0) && (-1 < local_28)" (parenthesized_expression "(local_20 == 0)" ( (binary_expression "local_20 == 0" identifier == number_literal) )) && (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) ))) )) (compound_statement "{\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }" { (expression_statement "local_18 = local_18 + 1;" (assignment_expression "local_18 = local_18 + 1" identifier = (binary_expression "local_18 + 1" identifier + number_literal)) ;) (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) }) (else_clause "else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" else (compound_statement "{\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" { (if_statement "if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }" if (parenthesized_expression "(-1 < local_28)" ( (binary_expression "-1 < local_28" number_literal < identifier) )) (compound_statement "{\n          puVar5[local_28] = (ushort)uVar10;\n        }" { (expression_statement "puVar5[local_28] = (ushort)uVar10;" (assignment_expression "puVar5[local_28] = (ushort)uVar10" (subscript_expression "puVar5[local_28]" identifier [ identifier ]) = (cast_expression "(ushort)uVar10" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) (expression_statement "local_28 = local_28 + 1;" (assignment_expression "local_28 = local_28 + 1" identifier = (binary_expression "local_28 + 1" identifier + number_literal)) ;) }))) (expression_statement "local_34 = local_34 + 1;" (assignment_expression "local_34 = local_34 + 1" identifier = (binary_expression "local_34 + 1" identifier + number_literal)) ;) (expression_statement "uVar10 = local_38;" (assignment_expression "uVar10 = local_38" identifier = identifier) ;) }) while (parenthesized_expression "(iVar1 + 1 != local_34)" ( (binary_expression "iVar1 + 1 != local_34" (binary_expression "iVar1 + 1" identifier + number_literal) != identifier) )) ;) (if_statement "if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" if (parenthesized_expression "(local_38 != 0)" ( (binary_expression "local_38 != 0" identifier != number_literal) )) (compound_statement "{\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" { (if_statement "if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" if (parenthesized_expression "(local_18 < 1)" ( (binary_expression "local_18 < 1" identifier < number_literal) )) (compound_statement "{\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }" { (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" identifier = (binary_expression "local_1c + 1" identifier + number_literal)) ;) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (for_statement "for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" for ( (assignment_expression "puVar7 = puVar11" identifier = identifier) ; (binary_expression "puVar5 <= puVar7" identifier <= identifier) ; (assignment_expression "puVar7 = puVar7 + -1" identifier = (binary_expression "puVar7 + -1" identifier + number_literal)) ) (compound_statement "{\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" { (expression_statement "uVar2 = *puVar7;" (assignment_expression "uVar2 = *puVar7" identifier = (pointer_expression "*puVar7" * identifier)) ;) (expression_statement "*puVar7 = (ushort)local_38;" (assignment_expression "*puVar7 = (ushort)local_38" (pointer_expression "*puVar7" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (expression_statement "local_38 = (uint)uVar2;" (assignment_expression "local_38 = (uint)uVar2" identifier = (cast_expression "(uint)uVar2" ( (type_descriptor "uint" type_identifier) ) identifier)) ;) })) }) (else_clause "else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" else (compound_statement "{\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" { (expression_statement "puVar11 = puVar5 + local_28;" (assignment_expression "puVar11 = puVar5 + local_28" identifier = (binary_expression "puVar5 + local_28" identifier + identifier)) ;) (expression_statement "*puVar11 = (ushort)local_38;" (assignment_expression "*puVar11 = (ushort)local_38" (pointer_expression "*puVar11" * identifier) = (cast_expression "(ushort)local_38" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) }))) (goto_statement "goto LAB_000245a3;" goto statement_identifier ;) })) })) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" identifier = (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" identifier + identifier) + number_literal)) ;) (labeled_statement "LAB_000245a3:\n  param_3[2] = puVar11;" statement_identifier : (expression_statement "param_3[2] = puVar11;" (assignment_expression "param_3[2] = puVar11" (subscript_expression "param_3[2]" identifier [ number_literal ]) = identifier) ;)) (expression_statement "param_3[3] = local_1c;" (assignment_expression "param_3[3] = local_1c" (subscript_expression "param_3[3]" identifier [ number_literal ]) = identifier) ;) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (binary_expression (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ])) - LIT) & LIT) )) != LIT) )) || (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (binary_expression (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ])) - LIT) & LIT) )) != LIT) ))) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (return_statement return ;) })) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = (binary_expression (binary_expression (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ])) != (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ]))) )) * (char_literal ' escape_sequence ')) + (char_literal ' character '))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (subscript_expression IDENT [ LIT ]) - IDENT) >> LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (subscript_expression IDENT [ LIT ]) - IDENT) >> LIT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (expression_statement (assignment_expression IDENT = (binary_expression (subscript_expression IDENT [ LIT ]) + (subscript_expression IDENT [ LIT ]))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( (binary_expression (binary_expression (subscript_expression IDENT [ LIT ]) - (cast_expression ( (type_descriptor TYPE) ) IDENT)) >> LIT) )) - IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT <= IDENT) )) && (parenthesized_expression ( (binary_expression IDENT <= IDENT) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (binary_expression (binary_expression (binary_expression (parenthesized_expression ( IDENT )) * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (binary_expression IDENT * LIT)) )))) * (parenthesized_expression ( IDENT ))) * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (binary_expression IDENT * LIT)) )))))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT & LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (parenthesized_expression ( (binary_expression IDENT >> LIT) )))) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT != LIT) )) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT | IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT == LIT) )) && (parenthesized_expression ( (binary_expression LIT < IDENT) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) (else_clause else (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ IDENT ]) = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }))) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) }) while (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) != IDENT) )) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT < LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression IDENT + IDENT) + LIT)) ;) (for_statement for ( (assignment_expression IDENT = IDENT) ; (binary_expression IDENT <= IDENT) ; (assignment_expression IDENT = (binary_expression IDENT + LIT)) ) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) })) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) }))) (goto_statement goto statement_identifier ;) })) })) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression IDENT + IDENT) + LIT)) ;) (labeled_statement statement_identifier : (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;)) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (return_statement return ;) })))
(function_definition "void FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)\n\n{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" (primitive_type "void") (function_declarator "FUN_00024410(int *param_1,int *param_2,undefined4 *param_3)" (identifier "FUN_00024410") (parameter_list "(int *param_1,int *param_2,undefined4 *param_3)" (( "(") (parameter_declaration "int *param_1" (primitive_type "int") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "int *param_2" (primitive_type "int") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "undefined4 *param_3" (type_identifier "undefined4") (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) () ")"))) (compound_statement "{\n  int iVar1;\n  ushort uVar2;\n  int iVar3;\n  int iVar4;\n  ushort *puVar5;\n  int iVar6;\n  ushort *puVar7;\n  int iVar8;\n  uint uVar9;\n  uint uVar10;\n  ushort *puVar11;\n  int iVar12;\n  int iVar13;\n  uint local_38;\n  int local_34;\n  int local_28;\n  uint local_20;\n  int local_1c;\n  int local_18;\n  \n  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }\n  local_28 = 0;\n  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';\n  iVar3 = *param_1;\n  iVar4 = *param_2;\n  iVar13 = param_1[2] - iVar3 >> 1;\n  iVar8 = param_2[2] - iVar4 >> 1;\n  puVar5 = (ushort *)*param_3;\n  local_1c = param_1[3] + param_2[3];\n  iVar1 = iVar13 + iVar8;\n  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;\n  if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }\n  if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }\n  puVar11 = puVar5 + local_28 + -1;\nLAB_000245a3:\n  param_3[2] = puVar11;\n  param_3[3] = local_1c;\n  return;\n}" ({ "{") (declaration "int iVar1;" (primitive_type "int") (identifier "iVar1") (; ";")) (declaration "ushort uVar2;" (type_identifier "ushort") (identifier "uVar2") (; ";")) (declaration "int iVar3;" (primitive_type "int") (identifier "iVar3") (; ";")) (declaration "int iVar4;" (primitive_type "int") (identifier "iVar4") (; ";")) (declaration "ushort *puVar5;" (type_identifier "ushort") (pointer_declarator "*puVar5" (* "*") (identifier "puVar5")) (; ";")) (declaration "int iVar6;" (primitive_type "int") (identifier "iVar6") (; ";")) (declaration "ushort *puVar7;" (type_identifier "ushort") (pointer_declarator "*puVar7" (* "*") (identifier "puVar7")) (; ";")) (declaration "int iVar8;" (primitive_type "int") (identifier "iVar8") (; ";")) (declaration "uint uVar9;" (type_identifier "uint") (identifier "uVar9") (; ";")) (declaration "uint uVar10;" (type_identifier "uint") (identifier "uVar10") (; ";")) (declaration "ushort *puVar11;" (type_identifier "ushort") (pointer_declarator "*puVar11" (* "*") (identifier "puVar11")) (; ";")) (declaration "int iVar12;" (primitive_type "int") (identifier "iVar12") (; ";")) (declaration "int iVar13;" (primitive_type "int") (identifier "iVar13") (; ";")) (declaration "uint local_38;" (type_identifier "uint") (identifier "local_38") (; ";")) (declaration "int local_34;" (primitive_type "int") (identifier "local_34") (; ";")) (declaration "int local_28;" (primitive_type "int") (identifier "local_28") (; ";")) (declaration "uint local_20;" (type_identifier "uint") (identifier "local_20") (; ";")) (declaration "int local_1c;" (primitive_type "int") (identifier "local_1c") (; ";")) (declaration "int local_18;" (primitive_type "int") (identifier "local_18") (; ";")) (if_statement "if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" (if "if") (parenthesized_expression "((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0))" (( "(") (binary_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)" (parenthesized_expression "(((char)param_1[4] - 0x2bU & 0xfd) != 0)" (( "(") (binary_expression "((char)param_1[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_1[4] - 0x2bU & 0xfd)" (( "(") (binary_expression "(char)param_1[4] - 0x2bU & 0xfd" (binary_expression "(char)param_1[4] - 0x2bU" (cast_expression "(char)param_1[4]" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (subscript_expression "param_1[4]" (identifier "param_1") ([ "[") (number_literal "4") (] "]"))) (- "-") (number_literal "0x2bU")) (& "&") (number_literal "0xfd")) () ")")) (!= "!=") (number_literal "0")) () ")")) (|| "||") (parenthesized_expression "(((char)param_2[4] - 0x2bU & 0xfd) != 0)" (( "(") (binary_expression "((char)param_2[4] - 0x2bU & 0xfd) != 0" (parenthesized_expression "((char)param_2[4] - 0x2bU & 0xfd)" (( "(") (binary_expression "(char)param_2[4] - 0x2bU & 0xfd" (binary_expression "(char)param_2[4] - 0x2bU" (cast_expression "(char)param_2[4]" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (subscript_expression "param_2[4]" (identifier "param_2") ([ "[") (number_literal "4") (] "]"))) (- "-") (number_literal "0x2bU")) (& "&") (number_literal "0xfd")) () ")")) (!= "!=") (number_literal "0")) () ")"))) () ")")) (compound_statement "{\n    *(undefined1 *)(param_3 + 4) = 0;\n    return;\n  }" ({ "{") (expression_statement "*(undefined1 *)(param_3 + 4) = 0;" (assignment_expression "*(undefined1 *)(param_3 + 4) = 0" (pointer_expression "*(undefined1 *)(param_3 + 4)" (* "*") (cast_expression "(undefined1 *)(param_3 + 4)" (( "(") (type_descriptor "undefined1 *" (type_identifier "undefined1") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_3 + 4)" (( "(") (binary_expression "param_3 + 4" (identifier "param_3") (+ "+") (number_literal "4")) () ")")))) (= "=") (number_literal "0")) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "local_28 = 0;" (assignment_expression "local_28 = 0" (identifier "local_28") (= "=") (number_literal "0")) (; ";")) (expression_statement "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';" (assignment_expression "*(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (pointer_expression "*(char *)(param_3 + 4)" (* "*") (cast_expression "(char *)(param_3 + 4)" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_3 + 4)" (( "(") (binary_expression "param_3 + 4" (identifier "param_3") (+ "+") (number_literal "4")) () ")")))) (= "=") (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02' + '+'" (binary_expression "((char)param_1[4] != (char)param_2[4]) * '\x02'" (parenthesized_expression "((char)param_1[4] != (char)param_2[4])" (( "(") (binary_expression "(char)param_1[4] != (char)param_2[4]" (cast_expression "(char)param_1[4]" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (subscript_expression "param_1[4]" (identifier "param_1") ([ "[") (number_literal "4") (] "]"))) (!= "!=") (cast_expression "(char)param_2[4]" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (subscript_expression "param_2[4]" (identifier "param_2") ([ "[") (number_literal "4") (] "]")))) () ")")) (* "*") (char_literal "'\x02'" (' "'") (escape_sequence "\x02") (' "'"))) (+ "+") (char_literal "'+'" (' "'") (character "+") (' "'")))) (; ";")) (expression_statement "iVar3 = *param_1;" (assignment_expression "iVar3 = *param_1" (identifier "iVar3") (= "=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (; ";")) (expression_statement "iVar4 = *param_2;" (assignment_expression "iVar4 = *param_2" (identifier "iVar4") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (expression_statement "iVar13 = param_1[2] - iVar3 >> 1;" (assignment_expression "iVar13 = param_1[2] - iVar3 >> 1" (identifier "iVar13") (= "=") (binary_expression "param_1[2] - iVar3 >> 1" (binary_expression "param_1[2] - iVar3" (subscript_expression "param_1[2]" (identifier "param_1") ([ "[") (number_literal "2") (] "]")) (- "-") (identifier "iVar3")) (>> ">>") (number_literal "1"))) (; ";")) (expression_statement "iVar8 = param_2[2] - iVar4 >> 1;" (assignment_expression "iVar8 = param_2[2] - iVar4 >> 1" (identifier "iVar8") (= "=") (binary_expression "param_2[2] - iVar4 >> 1" (binary_expression "param_2[2] - iVar4" (subscript_expression "param_2[2]" (identifier "param_2") ([ "[") (number_literal "2") (] "]")) (- "-") (identifier "iVar4")) (>> ">>") (number_literal "1"))) (; ";")) (expression_statement "puVar5 = (ushort *)*param_3;" (assignment_expression "puVar5 = (ushort *)*param_3" (identifier "puVar5") (= "=") (cast_expression "(ushort *)*param_3" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_3" (* "*") (identifier "param_3")))) (; ";")) (expression_statement "local_1c = param_1[3] + param_2[3];" (assignment_expression "local_1c = param_1[3] + param_2[3]" (identifier "local_1c") (= "=") (binary_expression "param_1[3] + param_2[3]" (subscript_expression "param_1[3]" (identifier "param_1") ([ "[") (number_literal "3") (] "]")) (+ "+") (subscript_expression "param_2[3]" (identifier "param_2") ([ "[") (number_literal "3") (] "]")))) (; ";")) (expression_statement "iVar1 = iVar13 + iVar8;" (assignment_expression "iVar1 = iVar13 + iVar8" (identifier "iVar1") (= "=") (binary_expression "iVar13 + iVar8" (identifier "iVar13") (+ "+") (identifier "iVar8"))) (; ";")) (expression_statement "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;" (assignment_expression "local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1" (identifier "local_18") (= "=") (binary_expression "(param_3[1] - (int)puVar5 >> 1) - iVar1" (parenthesized_expression "(param_3[1] - (int)puVar5 >> 1)" (( "(") (binary_expression "param_3[1] - (int)puVar5 >> 1" (binary_expression "param_3[1] - (int)puVar5" (subscript_expression "param_3[1]" (identifier "param_3") ([ "[") (number_literal "1") (] "]")) (- "-") (cast_expression "(int)puVar5" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "puVar5"))) (>> ">>") (number_literal "1")) () ")")) (- "-") (identifier "iVar1"))) (; ";")) (if_statement "if (local_18 < 0) {\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" (if "if") (parenthesized_expression "(local_18 < 0)" (( "(") (binary_expression "local_18 < 0" (identifier "local_18") (< "<") (number_literal "0")) () ")")) (compound_statement "{\n    local_1c = local_1c - local_18;\n    local_28 = local_18;\n  }" ({ "{") (expression_statement "local_1c = local_1c - local_18;" (assignment_expression "local_1c = local_1c - local_18" (identifier "local_1c") (= "=") (binary_expression "local_1c - local_18" (identifier "local_1c") (- "-") (identifier "local_18"))) (; ";")) (expression_statement "local_28 = local_18;" (assignment_expression "local_28 = local_18" (identifier "local_28") (= "=") (identifier "local_18")) (; ";")) (} "}"))) (if_statement "if (-1 < iVar1) {\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" (if "if") (parenthesized_expression "(-1 < iVar1)" (( "(") (binary_expression "-1 < iVar1" (number_literal "-1") (< "<") (identifier "iVar1")) () ")")) (compound_statement "{\n    local_34 = 0;\n    local_20 = 0;\n    uVar10 = 0;\n    do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);\n    if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }\n  }" ({ "{") (expression_statement "local_34 = 0;" (assignment_expression "local_34 = 0" (identifier "local_34") (= "=") (number_literal "0")) (; ";")) (expression_statement "local_20 = 0;" (assignment_expression "local_20 = 0" (identifier "local_20") (= "=") (number_literal "0")) (; ";")) (expression_statement "uVar10 = 0;" (assignment_expression "uVar10 = 0" (identifier "uVar10") (= "=") (number_literal "0")) (; ";")) (do_statement "do {\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    } while (iVar1 + 1 != local_34);" (do "do") (compound_statement "{\n      iVar12 = 0;\n      local_38 = 0;\n      iVar6 = local_34;\n      do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);\n      local_20 = local_20 | uVar10;\n      if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }\n      local_34 = local_34 + 1;\n      uVar10 = local_38;\n    }" ({ "{") (expression_statement "iVar12 = 0;" (assignment_expression "iVar12 = 0" (identifier "iVar12") (= "=") (number_literal "0")) (; ";")) (expression_statement "local_38 = 0;" (assignment_expression "local_38 = 0" (identifier "local_38") (= "=") (number_literal "0")) (; ";")) (expression_statement "iVar6 = local_34;" (assignment_expression "iVar6 = local_34" (identifier "iVar6") (= "=") (identifier "local_34")) (; ";")) (do_statement "do {\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      } while (iVar6 != -1);" (do "do") (compound_statement "{\n        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }\n        iVar6 = iVar6 + -1;\n        iVar12 = iVar12 + 1;\n      }" ({ "{") (if_statement "if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" (if "if") (parenthesized_expression "((iVar12 <= iVar13) && (iVar6 <= iVar8))" (( "(") (binary_expression "(iVar12 <= iVar13) && (iVar6 <= iVar8)" (parenthesized_expression "(iVar12 <= iVar13)" (( "(") (binary_expression "iVar12 <= iVar13" (identifier "iVar12") (<= "<=") (identifier "iVar13")) () ")")) (&& "&&") (parenthesized_expression "(iVar6 <= iVar8)" (( "(") (binary_expression "iVar6 <= iVar8" (identifier "iVar6") (<= "<=") (identifier "iVar8")) () ")"))) () ")")) (compound_statement "{\n          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);\n          uVar10 = uVar9 & 0xffff;\n          local_38 = local_38 + (uVar9 >> 0x10);\n        }" ({ "{") (expression_statement "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2);" (assignment_expression "uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" (identifier "uVar9") (= "=") (binary_expression "uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" (identifier "uVar10") (+ "+") (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)*(ushort *)(iVar4 + iVar6 * 2)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2) *\n                           (uint)" (binary_expression "(uint)*(ushort *)(iVar3 + iVar12 * 2)" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (* "*") (cast_expression "(ushort *)(iVar3 + iVar12 * 2)" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar3 + iVar12 * 2)" (( "(") (binary_expression "iVar3 + iVar12 * 2" (identifier "iVar3") (+ "+") (binary_expression "iVar12 * 2" (identifier "iVar12") (* "*") (number_literal "2"))) () ")")))) (* "*") (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")"))) (* "*") (cast_expression "(ushort *)(iVar4 + iVar6 * 2)" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar4 + iVar6 * 2)" (( "(") (binary_expression "iVar4 + iVar6 * 2" (identifier "iVar4") (+ "+") (binary_expression "iVar6 * 2" (identifier "iVar6") (* "*") (number_literal "2"))) () ")")))))) (; ";")) (expression_statement "uVar10 = uVar9 & 0xffff;" (assignment_expression "uVar10 = uVar9 & 0xffff" (identifier "uVar10") (= "=") (binary_expression "uVar9 & 0xffff" (identifier "uVar9") (& "&") (number_literal "0xffff"))) (; ";")) (expression_statement "local_38 = local_38 + (uVar9 >> 0x10);" (assignment_expression "local_38 = local_38 + (uVar9 >> 0x10)" (identifier "local_38") (= "=") (binary_expression "local_38 + (uVar9 >> 0x10)" (identifier "local_38") (+ "+") (parenthesized_expression "(uVar9 >> 0x10)" (( "(") (binary_expression "uVar9 >> 0x10" (identifier "uVar9") (>> ">>") (number_literal "0x10")) () ")")))) (; ";")) (} "}"))) (expression_statement "iVar6 = iVar6 + -1;" (assignment_expression "iVar6 = iVar6 + -1" (identifier "iVar6") (= "=") (binary_expression "iVar6 + -1" (identifier "iVar6") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "iVar12 = iVar12 + 1;" (assignment_expression "iVar12 = iVar12 + 1" (identifier "iVar12") (= "=") (binary_expression "iVar12 + 1" (identifier "iVar12") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar6 != -1)" (( "(") (binary_expression "iVar6 != -1" (identifier "iVar6") (!= "!=") (number_literal "-1")) () ")")) (; ";")) (expression_statement "local_20 = local_20 | uVar10;" (assignment_expression "local_20 = local_20 | uVar10" (identifier "local_20") (= "=") (binary_expression "local_20 | uVar10" (identifier "local_20") (| "|") (identifier "uVar10"))) (; ";")) (if_statement "if ((local_20 == 0) && (-1 < local_28)) {\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }\n      else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" (if "if") (parenthesized_expression "((local_20 == 0) && (-1 < local_28))" (( "(") (binary_expression "(local_20 == 0) && (-1 < local_28)" (parenthesized_expression "(local_20 == 0)" (( "(") (binary_expression "local_20 == 0" (identifier "local_20") (== "==") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "(-1 < local_28)" (( "(") (binary_expression "-1 < local_28" (number_literal "-1") (< "<") (identifier "local_28")) () ")"))) () ")")) (compound_statement "{\n        local_18 = local_18 + 1;\n        local_1c = local_1c + 1;\n      }" ({ "{") (expression_statement "local_18 = local_18 + 1;" (assignment_expression "local_18 = local_18 + 1" (identifier "local_18") (= "=") (binary_expression "local_18 + 1" (identifier "local_18") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" (identifier "local_1c") (= "=") (binary_expression "local_1c + 1" (identifier "local_1c") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (else_clause "else {\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" (else "else") (compound_statement "{\n        if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }\n        local_28 = local_28 + 1;\n      }" ({ "{") (if_statement "if (-1 < local_28) {\n          puVar5[local_28] = (ushort)uVar10;\n        }" (if "if") (parenthesized_expression "(-1 < local_28)" (( "(") (binary_expression "-1 < local_28" (number_literal "-1") (< "<") (identifier "local_28")) () ")")) (compound_statement "{\n          puVar5[local_28] = (ushort)uVar10;\n        }" ({ "{") (expression_statement "puVar5[local_28] = (ushort)uVar10;" (assignment_expression "puVar5[local_28] = (ushort)uVar10" (subscript_expression "puVar5[local_28]" (identifier "puVar5") ([ "[") (identifier "local_28") (] "]")) (= "=") (cast_expression "(ushort)uVar10" (( "(") (type_descriptor "ushort" (type_identifier "ushort")) () ")") (identifier "uVar10"))) (; ";")) (} "}"))) (expression_statement "local_28 = local_28 + 1;" (assignment_expression "local_28 = local_28 + 1" (identifier "local_28") (= "=") (binary_expression "local_28 + 1" (identifier "local_28") (+ "+") (number_literal "1"))) (; ";")) (} "}")))) (expression_statement "local_34 = local_34 + 1;" (assignment_expression "local_34 = local_34 + 1" (identifier "local_34") (= "=") (binary_expression "local_34 + 1" (identifier "local_34") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "uVar10 = local_38;" (assignment_expression "uVar10 = local_38" (identifier "uVar10") (= "=") (identifier "local_38")) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar1 + 1 != local_34)" (( "(") (binary_expression "iVar1 + 1 != local_34" (binary_expression "iVar1 + 1" (identifier "iVar1") (+ "+") (number_literal "1")) (!= "!=") (identifier "local_34")) () ")")) (; ";")) (if_statement "if (local_38 != 0) {\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" (if "if") (parenthesized_expression "(local_38 != 0)" (( "(") (binary_expression "local_38 != 0" (identifier "local_38") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }\n      goto LAB_000245a3;\n    }" ({ "{") (if_statement "if (local_18 < 1) {\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }\n      else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" (if "if") (parenthesized_expression "(local_18 < 1)" (( "(") (binary_expression "local_18 < 1" (identifier "local_18") (< "<") (number_literal "1")) () ")")) (compound_statement "{\n        local_1c = local_1c + 1;\n        puVar11 = puVar5 + local_28 + -1;\n        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }\n      }" ({ "{") (expression_statement "local_1c = local_1c + 1;" (assignment_expression "local_1c = local_1c + 1" (identifier "local_1c") (= "=") (binary_expression "local_1c + 1" (identifier "local_1c") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" (identifier "puVar11") (= "=") (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" (identifier "puVar5") (+ "+") (identifier "local_28")) (+ "+") (number_literal "-1"))) (; ";")) (for_statement "for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" (for "for") (( "(") (assignment_expression "puVar7 = puVar11" (identifier "puVar7") (= "=") (identifier "puVar11")) (; ";") (binary_expression "puVar5 <= puVar7" (identifier "puVar5") (<= "<=") (identifier "puVar7")) (; ";") (assignment_expression "puVar7 = puVar7 + -1" (identifier "puVar7") (= "=") (binary_expression "puVar7 + -1" (identifier "puVar7") (+ "+") (number_literal "-1"))) () ")") (compound_statement "{\n          uVar2 = *puVar7;\n          *puVar7 = (ushort)local_38;\n          local_38 = (uint)uVar2;\n        }" ({ "{") (expression_statement "uVar2 = *puVar7;" (assignment_expression "uVar2 = *puVar7" (identifier "uVar2") (= "=") (pointer_expression "*puVar7" (* "*") (identifier "puVar7"))) (; ";")) (expression_statement "*puVar7 = (ushort)local_38;" (assignment_expression "*puVar7 = (ushort)local_38" (pointer_expression "*puVar7" (* "*") (identifier "puVar7")) (= "=") (cast_expression "(ushort)local_38" (( "(") (type_descriptor "ushort" (type_identifier "ushort")) () ")") (identifier "local_38"))) (; ";")) (expression_statement "local_38 = (uint)uVar2;" (assignment_expression "local_38 = (uint)uVar2" (identifier "local_38") (= "=") (cast_expression "(uint)uVar2" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (identifier "uVar2"))) (; ";")) (} "}"))) (} "}")) (else_clause "else {\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" (else "else") (compound_statement "{\n        puVar11 = puVar5 + local_28;\n        *puVar11 = (ushort)local_38;\n      }" ({ "{") (expression_statement "puVar11 = puVar5 + local_28;" (assignment_expression "puVar11 = puVar5 + local_28" (identifier "puVar11") (= "=") (binary_expression "puVar5 + local_28" (identifier "puVar5") (+ "+") (identifier "local_28"))) (; ";")) (expression_statement "*puVar11 = (ushort)local_38;" (assignment_expression "*puVar11 = (ushort)local_38" (pointer_expression "*puVar11" (* "*") (identifier "puVar11")) (= "=") (cast_expression "(ushort)local_38" (( "(") (type_descriptor "ushort" (type_identifier "ushort")) () ")") (identifier "local_38"))) (; ";")) (} "}")))) (goto_statement "goto LAB_000245a3;" (goto "goto") (statement_identifier "LAB_000245a3") (; ";")) (} "}"))) (} "}"))) (expression_statement "puVar11 = puVar5 + local_28 + -1;" (assignment_expression "puVar11 = puVar5 + local_28 + -1" (identifier "puVar11") (= "=") (binary_expression "puVar5 + local_28 + -1" (binary_expression "puVar5 + local_28" (identifier "puVar5") (+ "+") (identifier "local_28")) (+ "+") (number_literal "-1"))) (; ";")) (labeled_statement "LAB_000245a3:\n  param_3[2] = puVar11;" (statement_identifier "LAB_000245a3") (: ":") (expression_statement "param_3[2] = puVar11;" (assignment_expression "param_3[2] = puVar11" (subscript_expression "param_3[2]" (identifier "param_3") ([ "[") (number_literal "2") (] "]")) (= "=") (identifier "puVar11")) (; ";"))) (expression_statement "param_3[3] = local_1c;" (assignment_expression "param_3[3] = local_1c" (subscript_expression "param_3[3]" (identifier "param_3") ([ "[") (number_literal "3") (] "]")) (= "=") (identifier "local_1c")) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}")))

/* WARNING: Unknown calling convention */

void function_1(type_1 *a,type_1 *b,type_1 *product)

{
  int var_3;
  type_2 uVar2;
  type_3 *pLVar3;
  type_3 *pLVar4;
  type_2 *var_14;
  int var_7;
  type_2 *var_15;
  int var_2;
  type_4 var_9;
  type_4 var_8;
  type_2 *puVar11;
  int var_6;
  int var_1;
  type_4 var_10;
  int var_13;
  int var_12;
  type_4 var_11;
  int var_5;
  int var_4;
  
  if (((a->sign - 0x2bU & 0xfd) != 0) || ((b->sign - 0x2bU & 0xfd) != 0)) {
    product->sign = '\0';
    return;
  }
  var_12 = 0;
  product->sign = (a->sign != b->sign) * '\x02' + '+';
  pLVar3 = a->low;
  pLVar4 = b->low;
  var_1 = (int)a->leader - (int)pLVar3 >> 1;
  var_2 = (int)b->leader - (int)pLVar4 >> 1;
  var_14 = product->low;
  var_5 = a->exponent + b->exponent;
  var_3 = var_1 + var_2;
  var_4 = ((int)product->high - (int)var_14 >> 1) - var_3;
  if (var_4 < 0) {
    var_5 = var_5 - var_4;
    var_12 = var_4;
  }
  if (-1 < var_3) {
    var_13 = 0;
    var_11 = 0;
    var_8 = 0;
    do {
      var_6 = 0;
      var_10 = 0;
      var_7 = var_13;
      do {
        if ((var_6 <= var_1) && (var_7 <= var_2)) {
          var_9 = var_8 + (type_4)pLVar3[var_6] * (type_4)pLVar4[var_7];
          var_8 = var_9 & 0xffff;
          var_10 = var_10 + (var_9 >> 0x10);
        }
        var_7 = var_7 + -1;
        var_6 = var_6 + 1;
      } while (var_7 != -1);
      var_11 = var_11 | var_8;
      if ((var_11 == 0) && (-1 < var_12)) {
        var_4 = var_4 + 1;
        var_5 = var_5 + 1;
      }
      else {
        if (-1 < var_12) {
          var_14[var_12] = (type_2)var_8;
        }
        var_12 = var_12 + 1;
      }
      var_13 = var_13 + 1;
      var_8 = var_10;
    } while (var_3 + 1 != var_13);
    if (var_10 != 0) {
      if (var_4 < 1) {
        var_5 = var_5 + 1;
        puVar11 = var_14 + var_12 + -1;
        for (var_15 = puVar11; var_14 <= var_15; var_15 = var_15 + -1) {
          uVar2 = *var_15;
          *var_15 = (type_2)var_10;
          var_10 = (type_4)uVar2;
        }
      }
      else {
        puVar11 = var_14 + var_12;
        *puVar11 = (type_2)var_10;
      }
      goto LAB_000245a3;
    }
  }
  puVar11 = var_14 + var_12 + -1;
LAB_000245a3:
  product->leader = puVar11;
  product->exponent = var_5;
  return;
}


(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (number_literal)) right: (number_literal))) right: (number_literal))) right: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (number_literal)) right: (number_literal))) right: (number_literal))))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (return_statement))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (binary_expression left: (binary_expression left: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (cast_expression type: (type_descriptor type: (primitive_type)) value: (subscript_expression argument: (identifier) index: (number_literal))))) right: (char_literal (escape_sequence))) right: (char_literal (character))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (binary_expression left: (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier))) right: (number_literal))) right: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) right: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (binary_expression left: (binary_expression left: (binary_expression left: (parenthesized_expression (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))))) right: (parenthesized_expression (identifier))) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) alternative: (else_clause (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (identifier)))) condition: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (number_literal)))) (for_statement initializer: (assignment_expression left: (identifier) right: (identifier)) condition: (binary_expression left: (identifier) right: (identifier)) update: (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier))))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier))))))) (goto_statement label: (statement_identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (number_literal)))) (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (return_statement))))

void MASKED(int *param_1,int *param_2,undefined4 *param_3)

{
  int iVar1;
  ushort uVar2;
  int iVar3;
  int iVar4;
  ushort *puVar5;
  int iVar6;
  ushort *puVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  ushort *puVar11;
  int iVar12;
  int iVar13;
  uint local_38;
  int local_34;
  int local_28;
  uint local_20;
  int local_1c;
  int local_18;
  
  if ((((char)param_1[4] - 0x2bU & 0xfd) != 0) || (((char)param_2[4] - 0x2bU & 0xfd) != 0)) {
    *(undefined1 *)(param_3 + 4) = 0;
    return;
  }
  local_28 = 0;
  *(char *)(param_3 + 4) = ((char)param_1[4] != (char)param_2[4]) * '\x02' + '+';
  iVar3 = *param_1;
  iVar4 = *param_2;
  iVar13 = param_1[2] - iVar3 >> 1;
  iVar8 = param_2[2] - iVar4 >> 1;
  puVar5 = (ushort *)*param_3;
  local_1c = param_1[3] + param_2[3];
  iVar1 = iVar13 + iVar8;
  local_18 = (param_3[1] - (int)puVar5 >> 1) - iVar1;
  if (local_18 < 0) {
    local_1c = local_1c - local_18;
    local_28 = local_18;
  }
  if (-1 < iVar1) {
    local_34 = 0;
    local_20 = 0;
    uVar10 = 0;
    do {
      iVar12 = 0;
      local_38 = 0;
      iVar6 = local_34;
      do {
        if ((iVar12 <= iVar13) && (iVar6 <= iVar8)) {
          uVar9 = uVar10 + (uint)*(ushort *)(iVar3 + iVar12 * 2) *
                           (uint)*(ushort *)(iVar4 + iVar6 * 2);
          uVar10 = uVar9 & 0xffff;
          local_38 = local_38 + (uVar9 >> 0x10);
        }
        iVar6 = iVar6 + -1;
        iVar12 = iVar12 + 1;
      } while (iVar6 != -1);
      local_20 = local_20 | uVar10;
      if ((local_20 == 0) && (-1 < local_28)) {
        local_18 = local_18 + 1;
        local_1c = local_1c + 1;
      }
      else {
        if (-1 < local_28) {
          puVar5[local_28] = (ushort)uVar10;
        }
        local_28 = local_28 + 1;
      }
      local_34 = local_34 + 1;
      uVar10 = local_38;
    } while (iVar1 + 1 != local_34);
    if (local_38 != 0) {
      if (local_18 < 1) {
        local_1c = local_1c + 1;
        puVar11 = puVar5 + local_28 + -1;
        for (puVar7 = puVar11; puVar5 <= puVar7; puVar7 = puVar7 + -1) {
          uVar2 = *puVar7;
          *puVar7 = (ushort)local_38;
          local_38 = (uint)uVar2;
        }
      }
      else {
        puVar11 = puVar5 + local_28;
        *puVar11 = (ushort)local_38;
      }
      goto LAB_000245a3;
    }
  }
  puVar11 = puVar5 + local_28 + -1;
LAB_000245a3:
  param_3[2] = puVar11;
  param_3[3] = local_1c;
  return;
}

