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

{
  uint uVar1;
  uint uVar2;
  uint *puVar3;
  uint uVar4;
  int iVar5;
  int iVar6;
  uint *puVar7;
  uint *puVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  
  uVar10 = param_4 & 0x8000001f;
  uVar4 = param_4 + 0x1f >> 5;
  if ((int)uVar10 < 0) {
    uVar10 = (uVar10 - 1 | 0xffffffe0) + 1;
  }
  uVar11 = param_3;
  if ((int)param_3 < 0) {
    uVar11 = param_3 + 0x1f;
  }
  uVar11 = (int)uVar11 >> 5;
  iVar6 = ~uVar11 + uVar4;
  if (-1 < iVar6) {
    param_3 = param_3 & 0x8000001f;
    if ((int)param_3 < 0) {
      param_3 = (param_3 - 1 | 0xffffffe0) + 1;
    }
    iVar9 = iVar6 + uVar11;
    puVar8 = (uint *)(param_2 + (iVar6 + -1) * 4);
    puVar3 = (uint *)(param_2 + iVar6 * 4);
    uVar1 = (1 << (uVar10 & 0x1f)) - 1;
    puVar7 = (uint *)((int)param_1 + iVar9 * 4);
    iVar5 = uVar4 - 1;
    do {
      if ((param_3 == 0) || (iVar6 == 0)) {
        uVar4 = *puVar3;
        uVar2 = 0;
        if (uVar10 == 0) goto LAB_004030f0;
LAB_004030a4:
        if (iVar5 == iVar6) {
          uVar4 = uVar4 & uVar1;
        }
        uVar2 = uVar4 << (param_3 & 0x1f) | uVar2;
        *puVar7 = uVar2;
        if (iVar5 == iVar9) {
          *puVar7 = uVar1 & uVar2;
        }
      }
      else {
        uVar2 = *puVar8 >> (0x20 - param_3 & 0x1f);
        uVar4 = *puVar3;
        if (uVar10 != 0) goto LAB_004030a4;
LAB_004030f0:
        *puVar7 = uVar2 | uVar4 << (param_3 & 0x1f);
      }
      iVar6 = iVar6 + -1;
      puVar7 = puVar7 + -1;
      iVar9 = iVar9 + -1;
      puVar3 = puVar3 + -1;
      puVar8 = puVar8 + -1;
    } while (-1 < iVar6);
  }
  if (uVar11 == 0) {
    return;
  }
  memset(param_1,0,uVar11 << 2);
  return;
}