void FUN_00402e30(uint *param_1,int param_2,uint param_3,uint param_4)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  uint *puVar7;
  int iVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  uint uVar12;
  
  uVar9 = param_4 & 0x8000001f;
  uVar3 = param_4 + 0x1f >> 5;
  if ((int)uVar9 < 0) {
    uVar9 = (uVar9 - 1 | 0xffffffe0) + 1;
  }
  uVar11 = param_3;
  if ((int)param_3 < 0) {
    uVar11 = param_3 + 0x1f;
  }
  param_3 = param_3 & 0x8000001f;
  iVar8 = (int)uVar11 >> 5;
  if ((int)param_3 < 0) {
    param_3 = (param_3 - 1 | 0xffffffe0) + 1;
  }
  uVar11 = (1 << (uVar9 & 0x1f)) - 1;
  if (iVar8 < (int)uVar3) {
    uVar12 = 0x20 - param_3;
    iVar6 = 0;
    iVar10 = uVar3 - 1;
    iVar5 = iVar8;
    puVar7 = param_1;
    do {
      if ((param_3 == 0) || (iVar4 = iVar5 + 1, (int)uVar3 <= iVar4)) {
        uVar1 = *(uint *)(param_2 + iVar5 * 4);
        uVar2 = 0;
        iVar4 = iVar10;
        if (uVar9 != 0) goto LAB_00402ee8;
LAB_00402f34:
        *puVar7 = uVar1 >> (param_3 & 0x1f) | uVar2;
      }
      else {
        uVar2 = *(uint *)(param_2 + iVar4 * 4);
        if (iVar4 == iVar10) {
          if (uVar9 == 0) {
            *puVar7 = *(uint *)(param_2 + iVar5 * 4) >> (param_3 & 0x1f) | uVar2 << (uVar12 & 0x1f);
            goto LAB_00402f00;
          }
          uVar1 = *(uint *)(param_2 + iVar5 * 4);
          uVar2 = (uVar2 & uVar11) << (uVar12 & 0x1f);
        }
        else {
          uVar1 = *(uint *)(param_2 + iVar5 * 4);
          uVar2 = uVar2 << (uVar12 & 0x1f);
          iVar4 = iVar10;
          if (uVar9 == 0) goto LAB_00402f34;
        }
LAB_00402ee8:
        if (iVar4 == iVar5) {
          uVar1 = uVar1 & uVar11;
        }
        uVar2 = uVar1 >> (param_3 & 0x1f) | uVar2;
        *puVar7 = uVar2;
        if (iVar4 == iVar6) {
          *puVar7 = uVar2 & uVar11;
        }
      }
LAB_00402f00:
      iVar6 = iVar6 + 1;
      puVar7 = puVar7 + 1;
      iVar5 = iVar6 + iVar8;
    } while (iVar6 != uVar3 - iVar8);
  }
  if (iVar8 != 0) {
    memset(param_1 + (uVar3 - iVar8),0,iVar8 << 2);
    return;
  }
  return;
}