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;
}