int32_t sub_2100(int16_t* arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    int32_t arg5 @ r8, int32_t* arg6 @ r9)
{
    bool n;
    bool z;
    bool c;
    bool v;
    if (n)
    {
        int32_t temp0_1 = (arg4 >> 0x1c);
        arg2 = (arg5 | (arg4 >> 0x1c));
        n = (arg5 | temp0_1) < 0;
        z = (arg5 | temp0_1) == 0;
        c = /* c = unimplemented  {orr.smi r1, r8, r3, asr  #0x1c} */;
        v = /* v = unimplemented  {orr.smi r1, r8, r3, asr  #0x1c} */;
    }
    if (z)
    {
        *arg1;
        arg1 = (arg1 - arg2);
    }
    if (n)
    {
        *arg6;
    }
    if (n != v)
    {
        /* unimplemented  {ldcllt p6, c4, [r8,  #0x2c0]!} */;
    }
    *(arg5 + (arg2 << 0xc));
    if (n != v)
    {
        *(arg1 - 0x313);
    }
    if ((!c))
    {
        /* unimplemented  {stchs p8, c7, [r1,  #-0x74]} */;
    }
    if ((z || n != v))
    {
        /* unimplemented  {ldcle p0, c13, [r0,  #-0x54]} */;
    }
    /* undefined */;
}

void sub_aa(int32_t arg1, int32_t arg2, int32_t, void* arg4)
{
    while (true)
    {
        int32_t r1 = *(arg4 + 0x28);
        if ((r1 & 4) != 0)
        {
            if ((r1 & 1) == 0)
            {
                break;
            }
        }
    }
}

int32_t sub_bc(int32_t arg1, int32_t arg2, int32_t arg3, void* arg4)
{
    int32_t var_8 = arg2;
    *(arg4 + 0x60) = arg1;
    *(arg4 + 0x60) = arg1;
    return *(sub_aa(arg1, arg2, arg3, arg4) + 0x60);
}

int32_t sub_ce(int32_t arg1, int32_t arg2, int32_t arg3, int32_t* arg4, 
    int32_t arg5)
{
    /* unimplemented  {stc p0, c14, [r8, #-0]} */;
    arg4[0x3c] = 1;
    *arg4 = 0x70000;
    arg4[2] = 1;
    int32_t r0_1;
    int32_t* r3_1;
    r0_1 = sub_bc(0x35, 1, 0xf0, arg4);
    int32_t r2_1 = 2;
    if (r0_1 != 2)
    {
        r3_1[0x18] = 6;
        int32_t r2_2;
        void* r3_2;
        r2_2 = sub_aa(r0_1, 6, 2, r3_1);
        *(r3_2 + 0x60) = 1;
        *(r3_2 + 0x60) = 0;
        *(r3_2 + 0x60) = r2_2;
        r2_1 = sub_aa(0, 1, r2_2, r3_2);
        int32_t r1 = r3_1[0x18];
        int32_t r0_2;
        do
        {
            r0_2 = sub_bc(5, r1, r2_1, r3_1);
            r1 = 1;
        } while ((r0_2 & 1) != 0);
    }
    r3_1[2] = 0;
    *r3_1 = 0x5f0300;
    r3_1[1] = 0;
    *0x180000f4 = 0x2221;
    r3_1[2] = 1;
    r3_1[0x18] = 0xeb;
    r3_1[0x18] = 0xa0;
    void* r3_3 = sub_aa(0x180000f4, 0xa0, r2_1, r3_1);
    *(r3_3 + 8) = 0;
    *0x180000f4 = 0xa0002022;
    *(r3_3 + 8) = 1;
    if (arg5 == 0)
    {
        *0xe000ed08 = 0x10000100;
        int32_t r1_1 = *0x10000104;
        __msr(*0x10000100);
        /* jump -> r1_1 */
    }
    /* jump -> arg5 */
}

uint32_t sub_252(char arg1)
{
    /* unimplemented  {mrs r0, apsr} */;
    return arg1;
}

int32_t sub_25c(int32_t arg1, int32_t arg2, void* arg3, int32_t* arg4 @ r6, 
    int32_t arg5 @ r7)
{
    /* unimplemented  {stc p0, c14, [r8, #-0]} */;
    int32_t var_8 = *(arg3 + arg2);
    int32_t* var_c = arg4;
    void* var_10 = (arg4 - arg3);
    int32_t var_14 = *(arg4 + arg5);
    int32_t r3;
    int32_t var_18 = r3;
    /* tailcall */
    return sub_280();
}

int32_t sub_280()
{
    return 0x200212f0;
}

int32_t sub_2a0()
{
    return 0x200212f0;
}

void sub_2c8()
{
    if (*0x200215f0 == 0)
    {
        sub_280();
        *0x200215f0 = 1;
    }
}

int32_t sub_2f4()
{
    return sub_2a0();
}

void* sub_318()
{
    int32_t r0 = sub_2668(0x50200000, 0x100158b0);
    sub_920(0x10, 6);
    sub_2730(0x50200000, 0, 0x10, 1, 1);
    uint32_t var_20 = 0x10000;
    int32_t var_1c = ((((r0 + 3) << 0xc) | (r0 << 7)) & 0x9fffffff);
    int32_t var_14 = 0x20004000;
    int32_t var_18 = 0x40060000;
    sub_1ec4(5);
    sub_2258();
    int32_t r0_1 = sub_2222();
    uint32_t r4 = sub_22a8();
    uint32_t r3_4 = 0;
    if (r4 != 0)
    {
        sub_224a(sub_2216(r0_1, sub_2258(r4)), 0x43800000);
        r3_4 = (sub_22a8() << 8);
    }
    var_20 = ((r4 << 0x10) | r3_4);
    void* r0_8 = sub_27b4(0x50200000, 0, r0, &var_20);
    *0x50200000 = (*0x50200000 | 1);
    return r0_8;
}

int32_t sub_3cc()
{
    int32_t r0_2;
    int32_t r3_1;
    do
    {
        r3_1 = *0x50200004;
        r0_2 = (r3_1 & 0x10000);
    } while ((r3_1 & 0x10000) != 0);
    *0x50200010 = r0_2;
    sub_1304(0x64);
    int32_t r0_3 = sub_2354(0x20000000, 0, 0x42000);
    *0x40064004 = (*0x40064004 & 0xfffffffe);
    *0x40064000 = (*0x40064000 & 0xfffffffe);
    return r0_3;
}

void* sub_414()
{
    sub_998(0x1b);
    sub_950(0x1b, 1);
    int32_t r0;
    int32_t r1;
    r0 = sub_140c();
    int32_t r1_1 = (0 + r1);
    int32_t var_40 = (0x493e0 + r0);
    bool cond:0 = r1 != r1_1;
    int32_t r10_1;
    if ((r1 > r1_1 || ((r1 <= r1_1 && (!cond:0)) && r0 > var_40)))
    {
        r10_1 = 0xffffffff;
        var_40 = 0xffffffff;
        int32_t var_3c_1 = 0xffffffff;
    }
    if ((r1 <= r1_1 && (cond:0 || ((!cond:0) && r0 <= var_40))))
    {
        r10_1 = r1_1;
    }
    void* r0_2 = sub_318();
    while ((*0x50200004 & 0x10000) != 0)
    {
        /* nop */
    }
    *0x50200010 = 0xf00;
    void* r6_1 = nullptr;
    while (true)
    {
    label_472:
        int32_t r2_1 = *0x40054024;
        if ((r2_1 >= r10_1 && (*0x40054028 >= var_40 || (*0x40054028 < var_40 && r2_1 != r10_1))))
        {
            if ((r6_1 - 7) > 2)
            {
                sub_1304(0x32);
                while ((*0x50200004 & 0x10000) != 0)
                {
                    /* nop */
                }
                *0x50200010 = 0x1fff1f00;
                sub_1304(0x12c);
                int32_t r0_4;
                int32_t r3_5;
                do
                {
                    r3_5 = *0x50200004;
                    r0_4 = (r3_5 & 0x10000);
                } while ((r3_5 & 0x10000) != 0);
                *0x50200010 = r0_4;
                sub_1304(0x64);
                r0_2 = sub_2354(0x20000000, 0, 0x42000);
                *0x40064004 = (*0x40064004 & 0xfffffffe);
                *0x40064000 = (*0x40064000 & 0xfffffffe);
            }
            return r0_2;
        }
        int32_t r1_3;
        r0_2 = sub_140c();
        void* r2_2 = (5 + r0_2);
        int32_t r3_10 = (0 + r1_3);
        bool cond:1_1 = r1_3 == r3_10;
        int32_t r4_2;
        if ((r1_3 > r3_10 || ((r1_3 <= r3_10 && cond:1_1) && r0_2 > r2_2)))
        {
            r2_2 = 0xffffffff;
            r4_2 = 0xffffffff;
        }
        if ((r1_3 <= r3_10 && ((!cond:1_1) || (cond:1_1 && r0_2 <= r2_2))))
        {
            r4_2 = r3_10;
        }
        while (true)
        {
            int32_t r1_6 = *0x40054024;
            int32_t r7_1 = 0;
            if (r1_6 < r4_2)
            {
                while ((1 & (*0xd0000004 >> 0x1b)) != 0)
                {
                label_516:
                    r1_6 = *0x40054024;
                    r7_1 = 1;
                    if (r1_6 >= r4_2)
                    {
                        break;
                    }
                }
            }
            if ((r1_6 >= r4_2 || (r1_6 < r4_2 && (1 & (*0xd0000004 >> 0x1b)) != 0)))
            {
                if (*0x40054028 >= r2_2)
                {
                    goto label_472;
                }
                if (r1_6 != r4_2)
                {
                    goto label_472;
                }
                if ((1 & (*0xd0000004 >> 0x1b)) != 0)
                {
                    goto label_516;
                }
            }
            if (((r1_6 < r4_2 && (1 & (*0xd0000004 >> 0x1b)) == 0) || ((r1_6 >= r4_2 || (r1_6 < r4_2 && (1 & (*0xd0000004 >> 0x1b)) != 0)) && *0x40054028 < r2_2)))
            {
                if (r7_1 != 0)
                {
                    int32_t r0_5;
                    int32_t r1_9;
                    r0_5 = sub_140c();
                    int32_t var_30_1 = 0;
                    int32_t r6_3 = 3;
                    int32_t r3_14;
                    int32_t r7_2;
                    do
                    {
                        int32_t r0_6;
                        int32_t r1_10;
                        r0_6 = sub_140c();
                        int32_t r0_7 = (r0_6 + 5);
                        int32_t r1_11 = (r1_10 + 0);
                        bool cond:2_1 = r1_10 == r1_11;
                        if ((r1_10 > r1_11 || ((r1_10 <= r1_11 && cond:2_1) && r0_6 > r0_7)))
                        {
                            r0_7 = 0xffffffff;
                            r7_2 = 0xffffffff;
                        }
                        if ((r1_10 <= r1_11 && ((!cond:2_1) || (cond:2_1 && r0_6 <= r0_7))))
                        {
                            r7_2 = r1_11;
                        }
                        int32_t r6_5;
                        while (true)
                        {
                            r3_14 = *0x40054024;
                            int32_t r6_4 = 0;
                            if (r3_14 >= r7_2)
                            {
                                break;
                            }
                            while ((1 & (*0xd0000004 >> 0x1b)) != 0)
                            {
                                r3_14 = *0x40054024;
                                r6_4 = r7_1;
                                if (r3_14 >= r7_2)
                                {
                                label_58a:
                                    if (*0x40054028 >= r0_7)
                                    {
                                        break;
                                    }
                                    if (r3_14 != r7_2)
                                    {
                                        break;
                                    }
                                }
                            }
                            if ((1 & (*0xd0000004 >> 0x1b)) != 0)
                            {
                                r6_5 = r6_3;
                                break;
                            }
                            if (r6_4 != 0)
                            {
                                r6_5 = r6_3;
                                var_30_1 = (var_30_1 + 1);
                                break;
                            }
                        }
                        if (r3_14 >= r7_2)
                        {
                            break;
                        }
                        r6_3 = (r6_5 - 1);
                    } while (r6_3 != 0);
                    if (r3_14 >= r7_2)
                    {
                        goto label_58a;
                    }
                    int32_t r0_8;
                    int32_t r1_12;
                    r0_8 = sub_140c();
                    r0_2 = (r0_8 - r0_5);
                    r6_1 = r0_2;
                    if (var_30_1 != 3)
                    {
                        break;
                    }
                    r0_2 = (r0_2 - 7);
                    if (r0_2 > 2)
                    {
                        break;
                    }
                    return r0_2;
                }
            }
        }
    }
}

int32_t sub_630(int32_t arg1)
{
    *0x4000f000 = 0x40000;
    *0x40006014 = (1 << ((arg1 << 2) + 3));
    char* r8_1 = 0x1001588c;
    uint32_t r4 = 0;
    int32_t r5 = 0;
    int32_t r6 = 0x120;
    do
    {
        if (r5 == 0)
        {
            uint32_t r4_1 = *r8_1;
            r6 = (r6 - 1);
            r8_1 = &r8_1[1];
            r4 = (r4_1 >> 1);
            sub_28d8((1 & r4_1), arg1);
            if (r6 == 0)
            {
                break;
            }
            r5 = 7;
        }
        r6 = (r6 - 1);
        sub_28d8((1 & r4), arg1);
        r5 = (r5 - 1);
        r4 = (r4 >> 1);
    } while (r6 != 0);
    sub_2918(0, 3, (0x1002927 | (arg1 << 0x1c)), arg1);
    sub_28e8(0, 0, arg1);
    sub_2918(0, 0, 0x1e, arg1);
    sub_2918(0, 1, 0x50000001, arg1);
    sub_2918(0, 0, 0x10, arg1);
    sub_2918(0, 2, 3, arg1);
    return sub_2918(1, 0, 0xa2000012, arg1);
}

int32_t sub_70c()
{
    int32_t var_18;
    sub_2618(&var_18);
    int32_t* r3 = 0x200258b8;
    int32_t r0_1;
    do
    {
        r0_1 = var_18;
        *r3 = r0_1;
        int32_t var_14;
        r3[1] = var_14;
        r3 = &r3[2];
    } while (0x200259b8 != r3);
    return r0_1;
}

uint32_t sub_730(int32_t arg1, int32_t arg2, int32_t arg3)
{
    uint32_t r0 = sub_a44();
    if (r0 == 0)
    {
        sub_1af4((r0 + 5), 1, 1, 0x2dc6c00, 0x2dc6c00);
        sub_1ed0(0x40028000, 1, arg1, arg2, arg3);
        int32_t r0_3 = sub_28a8(arg1, (arg2 * arg3));
        sub_1af4(4, 2, 0, 0xb71b00, 0xb71b00);
        sub_1af4(5, 1, 0, r0_3, r0_3);
        r0 = sub_1af4(6, 0, 2, 0x2dc6c00, 0x2dc6c00);
    }
    return r0;
}

int32_t sub_7a8(int32_t arg1, int32_t* arg2, int32_t* arg3, int32_t* arg4)
{
    int32_t r0_1 = sub_28a8(sub_1ec4(4), 0x3e8);
    int32_t r9_1 = 0x131;
    int32_t r6_3 = (r0_1 * 0x140);
    int32_t r0_2;
    while (true)
    {
        int32_t r4_1 = 7;
        if ((r6_3 - 0xb71b0) <= 0xcf850)
        {
            int32_t r0_4;
            int32_t r1_2;
            int32_t r8_1;
            while (true)
            {
                r0_4 = sub_2928(r6_3, (r4_1 * r4_1));
                if ((arg1 == r0_4 && r1_2 == 0))
                {
                    r8_1 = r4_1;
                    break;
                }
                int32_t r3_3 = (r4_1 - 1);
                r8_1 = r3_3;
                if (r4_1 == 1)
                {
                    break;
                }
                int32_t r5_2 = (r4_1 * r3_3);
                int32_t r0_6;
                int32_t r1_4;
                r0_6 = sub_2928(r6_3, r5_2);
                int32_t r11_1;
                if (arg1 != r0_6)
                {
                    r11_1 = (r4_1 - 2);
                }
                else
                {
                    if (r1_4 == 0)
                    {
                        break;
                    }
                    r11_1 = (r4_1 - 2);
                }
                if (((arg1 != r0_6 && r4_1 == 2) || ((arg1 == r0_6 && r1_4 != 0) && r4_1 == 2)))
                {
                    r4_1 = 1;
                    continue;
                }
                if (((arg1 != r0_6 && r4_1 != 2) || ((arg1 == r0_6 && r1_4 != 0) && r4_1 != 2)))
                {
                    int32_t r5_3 = (r5_2 - r4_1);
                    int32_t r0_8;
                    int32_t r1_6;
                    r0_8 = sub_2928(r6_3, r5_3);
                    if ((arg1 != r0_8 || (arg1 == r0_8 && r1_6 != 0)))
                    {
                        r11_1 = (r4_1 - 3);
                        if (r4_1 == 3)
                        {
                            r4_1 = 2;
                            continue;
                        }
                        else
                        {
                            int32_t r5_4 = (r5_3 - r4_1);
                            int32_t r0_10;
                            int32_t r1_8;
                            r0_10 = sub_2928(r6_3, r5_4);
                            if (arg1 != r0_10)
                            {
                                r11_1 = (r4_1 - 4);
                            }
                            if ((arg1 == r0_10 && r1_8 != 0))
                            {
                                r11_1 = (r4_1 - 4);
                            }
                            if (((arg1 != r0_10 && r4_1 == 4) || ((arg1 == r0_10 && r1_8 != 0) && r4_1 == 4)))
                            {
                                r4_1 = 3;
                                continue;
                            }
                            if (((arg1 != r0_10 && r4_1 != 4) || ((arg1 == r0_10 && r1_8 != 0) && r4_1 != 4)))
                            {
                                int32_t r5_5 = (r5_4 - r4_1);
                                int32_t r0_12;
                                int32_t r1_10;
                                r0_12 = sub_2928(r6_3, r5_5);
                                if (arg1 != r0_12)
                                {
                                    r11_1 = (r4_1 - 5);
                                }
                                if ((arg1 == r0_12 && r1_10 != 0))
                                {
                                    r11_1 = (r4_1 - 5);
                                }
                                if (((arg1 != r0_12 && r4_1 == 5) || ((arg1 == r0_12 && r1_10 != 0) && r4_1 == 5)))
                                {
                                    r4_1 = 4;
                                    continue;
                                }
                                if (((arg1 != r0_12 && r4_1 != 5) || ((arg1 == r0_12 && r1_10 != 0) && r4_1 != 5)))
                                {
                                    int32_t r5_6 = (r5_5 - r4_1);
                                    int32_t r0_14;
                                    int32_t r1_12;
                                    r0_14 = sub_2928(r6_3, r5_6);
                                    if (((arg1 != r0_14 && r8_1 == 5) || ((arg1 == r0_14 && r1_12 != 0) && r8_1 == 5)))
                                    {
                                        r4_1 = 5;
                                        continue;
                                    }
                                    if (((arg1 != r0_14 && r8_1 != 5) || ((arg1 == r0_14 && r1_12 != 0) && r8_1 != 5)))
                                    {
                                        int32_t r0_16;
                                        int32_t r1_14;
                                        r0_16 = sub_2928(r6_3, (r5_6 - 7));
                                        if (arg1 != r0_16)
                                        {
                                            r4_1 = 6;
                                            continue;
                                        }
                                        else
                                        {
                                            if (r1_14 == 0)
                                            {
                                                r8_1 = 1;
                                                break;
                                            }
                                            r4_1 = 6;
                                            continue;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    r8_1 = r11_1;
                    break;
                }
            }
            if ((arg1 == r0_4 && r1_2 == 0))
            {
                r0_2 = 1;
                *arg2 = (((((r6_3 << 5) - r6_3) << 2) + r6_3) << 3);
                *arg3 = r4_1;
                *arg4 = r8_1;
                break;
            }
        }
        r9_1 = (r9_1 - 1);
        r6_3 = (r6_3 - r0_1);
        if (r9_1 == 0)
        {
            r0_2 = 0;
            break;
        }
    }
    return r0_2;
}

void* sub_920(int32_t arg1, int32_t arg2)
{
    *(((arg1 << 2) + 0x4001c004) | 0x1000) = (0xc0 & (0x40 ^ *((arg1 << 2) + 0x4001c004)));
    *((arg1 << 3) + 0x40014004) = arg2;
    return ((arg1 << 3) + 0x40014000);
}

int32_t* sub_950(int32_t arg1, int32_t arg2)
{
    int32_t r0_1 = ((arg1 << 2) + 0x4001c004);
    int32_t* r0_2;
    if (arg2 == 0)
    {
        r0_2 = (r0_1 | 0x3000);
        *r0_2 = 2;
    }
    else
    {
        r0_2 = (r0_1 | 0x2000);
        *r0_2 = 2;
    }
    return r0_2;
}

int32_t* sub_978(int32_t arg1, int32_t arg2)
{
    int32_t* r0_2 = (((arg1 << 2) + 0x4001c004) | 0x1000);
    *r0_2 = (((arg2 << 4) ^ *((arg1 << 2) + 0x4001c004)) & 0x30);
    return r0_2;
}

void* sub_998(int32_t arg1)
{
    int32_t r3 = (1 << arg1);
    *0xd0000028 = r3;
    *0xd0000018 = r3;
    *(((arg1 << 2) + 0x4001c004) | 0x1000) = (0xc0 & (0x40 ^ *((arg1 << 2) + 0x4001c004)));
    *((arg1 << 3) + 0x40014004) = 5;
    return ((arg1 << 3) + 0x40014000);
}

int32_t sub_9d4()
{
    /* unimplemented  {mrs r0, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd000012c == 0)
    {
        /* nop */
    }
    __dmb_SY();
}

void sub_9ec(uint32_t arg1)
{
    __dmb_SY();
    *0xd000012c = 0;
    __msr(arg1);
}

uint32_t sub_a00(int32_t arg1, int32_t arg2, char* arg3, uint32_t arg4 @ r12)
{
    /* unimplemented  {mrs r12, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd000012c == 0)
    {
        /* nop */
    }
    __dmb_SY();
    uint32_t r3_2 = (arg2 >> 3);
    char* r6 = (arg1 + r3_2);
    uint32_t r0 = *(arg1 + r3_2);
    int32_t r3_3 = (1 << (7 & arg2));
    int32_t r4_2 = (r3_3 & r0);
    if ((r3_3 & r0) != 0)
    {
        sub_1ab8(arg3, arg2);
        /* no return */
    }
    *r6 = (r3_3 | r0);
    __dmb_SY();
    *0xd000012c = r4_2;
    __msr(arg4);
    return r0;
}

uint32_t sub_a44()
{
    return ((*0x4006c000 << 0x1e) >> 0x1f);
}

int32_t sub_a54()
{
    int32_t* r3 = 0xd0000100;
    do
    {
        __dmb_SY();
        *r3 = 0;
        r3 = &r3[1];
    } while (r3 != 0xd0000180);
}

uint32_t sub_a70()
{
    uint32_t r0 = *0x20021234;
    uint32_t r3_1 = (r0 + 1);
    if (r3_1 > 0x17)  // {"K"}
    {
        r3_1 = 0x10;
    }
    *0x20021234 = r3_1;
    return r0;
}

void sub_a88(int32_t arg1, int32_t arg2)
{
    int32_t r3 = (1 << arg1);
    if (arg2 == 0)
    {
        *0xe000e180 = r3;
    }
    else
    {
        *0xe000e280 = r3;
        *0xe000e100 = r3;
    }
}

int32_t sub_aac(int32_t arg1)
{
    return *(((arg1 + 0x10) << 2) + *0xe000ed08);
}

int32_t sub_abc(int32_t arg1, int32_t arg2, uint32_t arg3 @ r6)
{
    uint32_t var_8 = arg3;
    /* unimplemented  {mrs r6, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000124 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r0 = (arg1 + 0x10);
    int32_t r4 = (r0 << 2);
    int32_t r3_3 = *(*0xe000ed08 + r4);
    if ((r3_3 != 0x100001cd && arg2 != r3_3))
    {
        sub_1ae8();
        /* no return */
    }
    *(*0xe000ed08 + r4) = arg2;
    __dmb_SY();
    __dmb_SY();
    *0xd0000124 = 0;
    __msr(arg3);
    return r0;
}

void sub_b10(uint32_t arg1, int32_t arg2, uint32_t arg3 @ r10)
{
    /* unimplemented  {mrs r10, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000124 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r9_1 = (0x10 + arg1);
    int32_t r6_1 = (r9_1 << 2);
    int32_t r5_1 = *(*0xe000ed08 + r6_1);
    if (r5_1 != 0x100001cd)
    {
        if (r5_1 == arg2)
        {
            r5_1 = 0x100001cd;
        }
        else if ((r5_1 - 0x20021238) <= 0x2f)
        {
            int32_t r3_5 = (1 << arg1);
            int32_t r2_2 = (r3_5 & *0xe000e100);
            *0xe000e180 = r3_5;
            __dmb_SY();
            arg1 = sub_252(arg1);
            if ((arg1 != 0 && r9_1 != arg1))
            {
                sub_1ae8();
                /* no return */
            }
            void* r2_5 = (r5_1 & 0xfffffffe);
            int32_t r1_1;
            int32_t r1_2;
            void* r3_11;
            if (arg2 == *(r2_5 + 8))
            {
                r1_2 = *(r2_5 + 6);
                r3_11 = r2_5;
                if ((r1_2 < 0 && arg1 == 0))
                {
                    r5_1 = 0x100001cd;
                label_c4a:
                    *(r3_11 + 6) = *0x200259f2;
                    *0x200259f2 = ((((r3_11 - 0x20021238) + (r3_11 - 0x20021238)) * 0xaaaa) >> 0x14);  // {"Xa.K"}
                }
            }
            else
            {
                while (true)
                {
                    r1_1 = *(r2_5 + 6);
                    if (r1_1 < 0)
                    {
                        break;
                    }
                    r3_11 = (0x20021238 + (r1_1 * 0xc));
                    if (*(r3_11 + 8) == arg2)
                    {
                        break;
                    }
                    r2_5 = r3_11;
                }
                if (r1_1 >= 0)
                {
                    r1_2 = *(r3_11 + 6);
                }
            }
            if (((arg2 == *(r2_5 + 8) && r1_2 >= 0) || ((arg2 != *(r2_5 + 8) && r1_1 >= 0) && r1_2 >= 0)))
            {
                int32_t r2_8 = (r1_2 << 1);
                int32_t r0_1 = ((r2_8 + r1_2) << 2);
                void* r4_2 = (0x20021238 + r0_1);
                *(r3_11 + 8) = *(r4_2 + 8);
                *(r3_11 + 7) = *(r4_2 + 7);
                int32_t r0_4 = *(r4_2 + 6);
                *(r3_11 + 6) = r0_4;
                if (r0_4 < 0)
                {
                    arg1 = 0xbd00;
                }
                else
                {
                    arg1 = (((((0x20021238 - r3_11) + (((*(r4_2 + 4) << 0x15) >> 0x14) + r0_1)) << 0x14) >> 0x15) | 0xe000);  // {"Xa.K"}  // {"a.K"}
                }
                *(r3_11 + 4) = arg1;
                char r2_11 = *0x200259f2;
                *0x200259f2 = r1_2;
                *(((r2_8 + r1_2) << 2) + 0x2002123e) = r2_11;
            }
            if ((((arg2 != *(r2_5 + 8) && r1_1 >= 0) && r1_2 < 0) && arg1 == 0))
            {
                *(r2_5 + 6) = (arg1 - 1);
                *(r2_5 + 4) = 0xbd00;
                goto label_c4a;
            }
            if ((((arg2 == *(r2_5 + 8) && r1_2 < 0) && arg1 != 0) || ((arg2 != *(r2_5 + 8) && r1_1 >= 0) && r1_2 < 0)))
            {
                *(r3_11 + 4) = (0xf000 | ((((0x20021272 - r3_11) - 8) << 9) >> 0x15));  // {"a.K"}
                *(r3_11 + 6) = ((((0x20021272 - r3_11) - 8) >> 1) | 0xf800);
            }
            if (r2_2 == 0)
            {
                *0xe000e180 = r3_5;
            }
            else
            {
                *0xe000e280 = r3_5;
                *0xe000e100 = r3_5;
            }
        }
    }
    *(*0xe000ed08 + r6_1) = r5_1;
    __dmb_SY();
    __dmb_SY();
    *0xd0000124 = 0;
    __msr(arg3);
}

int32_t sub_cc4(void* arg1, uint32_t arg2 @ r12)
{
    int32_t r5 = (1 | arg1);
    uint32_t r0 = sub_252(arg1);
    /* unimplemented  {mrs r12, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000124 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r1_3 = ((((arg1 - 0x20021238) + (arg1 - 0x20021238)) * 0xaaaa) >> 0x14);  // {"Xa.K"}
    uint32_t r3_4 = (r0 << 2);
    int32_t r0_1 = *(*0xe000ed08 + r3_4);
    if (r0_1 == r5)
    {
        *(*0xe000ed08 + r3_4) = 0x100001cd;
    }
    else if (*0x2002123e == r1_3)
    {
        r0_1 = 0;
    label_d4c:
        *((r0_1 * 0xc) + 0x2002123e) = 0xff;
        *((r0_1 * 0xc) + 0x2002123c) = 0xbd00;
    }
    else
    {
        if (*0x2002124a == r1_3)
        {
            r0_1 = 1;
            goto label_d4c;
        }
        if (*0x20021256 == r1_3)
        {
            r0_1 = 2;
            goto label_d4c;
        }
        r0_1 = 3;
        if (*0x20021262 == r1_3)
        {
            goto label_d4c;
        }
    }
    char r2_1 = *0x200259f2;
    *0x200259f2 = r1_3;
    *(arg1 + 6) = r2_1;
    __dmb_SY();
    *0xd0000124 = 0;
    __msr(arg2);
    return r0_1;
}

int32_t sub_d78()
{
    *0xe000e400 = 0x80808080;
    *0xe000e404 = 0x80808080;
    *0xe000e408 = 0x80808080;
    *0xe000e40c = 0x80808080;
    *0xe000e410 = 0x80808080;
    *0xe000e414 = 0x80808080;
    *0xe000e418 = 0x80808080;
    *0xe000e41c = 0x80808080;
}

void sub_d9c(int32_t* arg1, int32_t arg2)
{
    *arg1 = ((arg2 + 0x34000040) << 2);
}

uint32_t sub_dac(void* arg1, int32_t arg2, int32_t arg3)
{
    void* r3_2 = *(arg1 + 8);
    void* r2_2 = (r3_2 + ((arg3 + 0xfffffff) << 4));
    int32_t* r1_2 = (r3_2 + ((arg2 + 0xfffffff) << 4));
    int32_t r4 = *(r2_2 + 4);
    int32_t r3 = r1_2[1];
    char r0 = 1;
    bool cond:0 = r4 == r3;
    if ((r4 <= r3 && ((!cond:0) || (cond:0 && *r2_2 <= *r1_2))))
    {
        r0 = 0;
    }
    return r0;
}

int32_t sub_de0(uint32_t arg1)
{
    int32_t* r1 = *0x200259d4;
    /* unimplemented  {mrs r0, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*r1 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t* r3 = *0x200259d4;
    __dmb_SY();
    *r3 = 0;
    __msr(arg1);
    __sev();
    return 0;
}

void sub_e10(int32_t* arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    int32_t arg5, int32_t arg6, char arg7, char arg8, char* arg9)
{
    int32_t var_18 = arg4;
    uint32_t r4 = arg7;
    uint32_t r3 = arg8;
    int32_t* r6_1 = arg1;
    int32_t* r7_1 = *arg1;
    uint8_t* r1;
    int32_t r5_3;
    if (r4 != 0)
    {
        r5_3 = ((r4 * 3) - 3);
        r1 = (*r7_1 + r5_3);
    }
    else
    {
        r4 = *(r7_1 + 0xe);
        r5_3 = ((r4 * 3) - 3);
        r1 = (*r7_1 + r5_3);
        uint32_t r3_2 = r1[1];
        *(r7_1 + 0xe) = r3_2;
        if (r3_2 == 0)
        {
            *(r7_1 + 0xf) = r3_2;
        }
        r1[2] = 0;
        r1[1] = 0;
        *r1 = 0;
    }
    int32_t* r3_6 = (((r4 + 0xfffffff) << 4) + r6_1[2]);
    *r3_6 = arg3;
    r3_6[1] = arg4;
    r3_6[2] = arg5;
    r3_6[3] = arg6;
    r1[2] = 0;
    r1[1] = 0;
    *r1 = 0;
    uint32_t r3_7 = *(r7_1 + 0xd);
    int32_t r0_1;
    if (r3_7 != 0)
    {
        r0_1 = r7_1[1](r7_1[2], r3_7, r4);
        void* r2_6 = *r7_1;
        if (r0_1 != 0)
        {
            void* r5_6 = (r2_6 + r5_3);
            *(r5_6 + 2) = r3_7;
            r1 = (r2_6 + ((r3_7 * 3) - 3));
            uint32_t r3_13 = *(r2_6 + ((r3_7 * 3) - 3));
            if (r3_13 != 0)
            {
                *(r5_6 + 1) = r3_13;
            }
            *r1 = r4;
            *(r7_1 + 0xd) = r3_7;
        }
        else
        {
            void* r3_20 = (r2_6 + ((r3_7 * 3) - 3));
            *(r3_20 + 2) = r4;
            r1 = (r2_6 + r5_3);
            uint32_t r2_7 = *(r2_6 + r5_3);
            if (r2_7 != 0)
            {
                *(r3_20 + 1) = r2_7;
            }
            *r1 = r3_7;
        }
    }
    if ((r3_7 == 0 || (r3_7 != 0 && r0_1 == 0)))
    {
        *(r7_1 + 0xd) = r4;
    }
    if (((r3_7 == 0 || (r3_7 != 0 && r0_1 == 0)) || ((r3_7 != 0 && r0_1 != 0) && r3_7 == r4)))
    {
        arg1 = sub_14cc(r6_1[5], r1, arg3, arg4, r3);
        char r5_8 = arg1;
        if ((arg1 != 0 && r3 == 0))
        {
            sub_1910(*r6_1, r4);
        }
        if (arg9 != 0)
        {
            *arg9 = r5_8;
        }
    }
}

int32_t sub_f10(int32_t arg1, uint32_t arg2 @ r8)
{
    uint32_t r10;
    uint32_t var_1c = r10;
    uint32_t var_30 = 0;
    int32_t* var_3c = *((arg1 << 2) + 0x200259b8);
    int32_t r2_17;
    int32_t r3_33;
    int32_t r6_2;
    int32_t r7_2;
    while (true)
    {
        int32_t r0;
        int32_t r1_1;
        r0 = sub_140c();
        int32_t* r4_1 = var_3c;
        int32_t* r2_1 = r4_1[1];
        /* unimplemented  {mrs r5, primask} */;
        /* unimplemented  {cpsid I} */;
        while (*r2_1 == 0)
        {
            /* nop */
        }
        var_3c = r4_1;
        __dmb_SY();
        int32_t* r4_2 = *r4_1;
        uint32_t r3_3 = *(r4_2 + 0xd);
        int32_t r0_4;
        int32_t r8_2;
        if (r3_3 == 0)
        {
            r6_2 = 0;
            r8_2 = 0;
            r7_2 = 0;
            r10 = 0;
            r0_4 = 0;
        }
        else
        {
            int32_t* r8_1 = (r4_1[2] + ((0xfffffff + r3_3) << 4));
            int32_t r2_4 = *r8_1;
            int32_t r3_7 = r8_1[1];
            int32_t r0_2 = (r2_4 - r0);
            int32_t r1_3 = (r3_7 - r1_1);
            if ((r1_3 > 0 || (r1_3 == 0 && r0_2 != 0)))
            {
                r0_4 = sub_14cc(arg1, r1_3, r2_4, r3_7, r10);
                r6_2 = 0;
                r8_2 = 0;
                r7_2 = 0;
                r10 = 0;
            }
            if (((r1_3 <= 0 && r1_3 != 0) || (r1_3 == 0 && r0_2 == 0)))
            {
                r6_2 = *r8_1;
                r7_2 = r8_1[1];
                r10 = r8_1[2];
                r8_2 = r8_1[3];
                uint32_t r3_27 = *((var_3c[3] + r3_3) - 1);
                var_30 = r3_27;
                var_3c[4] = ((r3_27 << 8) | sub_1814(r4_2, 0));
                r0_4 = 0;
            }
        }
        int32_t* r4_3 = var_3c;
        int32_t* r3_8 = r4_3[1];
        __dmb_SY();
        *r3_8 = 0;
        __msr(arg2);
        if (r10 != 0)
        {
            uint32_t var_58;
            int32_t var_54;
            uint32_t var_50;
            int32_t var_4c;
            int32_t var_48;
            int32_t r0_7;
            int32_t r1_5;
            r0_7 = r10(((var_30 << 8) | r3_3), r8_2, 0, r3_3, var_58, var_54, var_50, var_4c, var_48);
            int32_t* r2_5 = r4_3[1];
            /* unimplemented  {mrs r5, primask} */;
            /* unimplemented  {cpsid I} */;
            while (*r2_5 == 0)
            {
                /* nop */
            }
            var_3c = r4_3;
            __dmb_SY();
            if (r1_5 >= 0)
            {
                if ((r0_7 | r1_5) == 0)
                {
                    goto label_fee;
                }
                if (var_3c[4] == 0)
                {
                    goto label_fee;
                }
                int32_t r0_11;
                int32_t r1_15;
                r0_11 = sub_140c();
                r6_2 = r0_11;
                r7_2 = r1_15;
                r2_17 = (r0_7 + r6_2);
                r3_33 = (r1_5 + r7_2);
                if (r1_15 > r3_33)
                {
                    goto label_10be;
                }
                break;
            }
            if (r4_3[4] == 0)
            {
            label_fee:
                int32_t* r3_16 = *var_3c;
                uint32_t r1_8 = *(r3_16 + 0xf);
                if (r1_8 != 0)
                {
                    *(((r1_8 * 3) + *r3_16) - 2) = r3_3;
                }
                *(r3_16 + 0xf) = r3_3;
                char* r1_11 = var_3c[3];
                r1_11[(r3_3 - 1)] = (r1_11[(r3_3 - 1)] + 1);
            }
            else
            {
                int32_t r4_6 = (r7_2 - r1_5);
                r2_17 = (r6_2 - r0_7);
                r3_33 = r4_6;
                if (r7_2 <= r4_6)
                {
                    break;
                }
            label_10be:
                r2_17 = 0xffffffff;
                r3_33 = 0xffffffff;
            label_108e:
                var_48 = 0;
                var_4c = 1;
                var_50 = r3_3;
                var_54 = r8_2;
                var_58 = r10;
                sub_e10(var_3c, r10, r2_17, r3_33, var_58, var_54, var_50, 1, nullptr);
            }
            var_3c[4] = 0;
            int32_t* r3_19 = var_3c[1];
            __dmb_SY();
            *r3_19 = 0;
            __msr(arg2);
        }
        else
        {
            if (r0_4 == 0)
            {
                return r0_4;
            }
        }
    }
    if (r7_2 != r3_33)
    {
        goto label_108e;
    }
    if (r6_2 > r2_17)
    {
        r2_17 = 0xffffffff;
        r3_33 = 0xffffffff;
    }
    goto label_108e;
}

uint32_t sub_10d8(int32_t arg1, uint32_t arg2, uint32_t arg3 @ r8)
{
    int32_t* r2 = *0x20021284;
    /* unimplemented  {mrs r8, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*r2 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t* r6_1 = *0x20021280;
    uint32_t r4 = *(r6_1 + 0xe);
    uint32_t r0_3;
    if (r4 == 0)
    {
        uint32_t* r3_12 = *0x20021284;
        __dmb_SY();
        *r3_12 = r4;
        __msr(arg3);
        r0_3 = 0xffffffff;
    }
    else
    {
        int32_t r7_3 = ((r4 * 3) - 3);
        char* r3_3 = (*r6_1 + r7_3);
        uint32_t r2_1 = r3_3[1];
        *(r6_1 + 0xe) = r2_1;
        if (r2_1 == 0)
        {
            *(r6_1 + 0xf) = r2_1;
        }
        int32_t* r2_4 = (((r4 + 0xfffffff) << 4) + *0x20021288);
        *r2_4 = arg1;
        r2_4[1] = arg2;
        r2_4[2] = 0x10000de1;
        void* r1_3 = nullptr;
        r2_4[3] = 0;
        r3_3[2] = 0;
        r3_3[1] = 0;
        *r3_3 = 0;
        uint32_t r3_4 = *(r6_1 + 0xd);
        int32_t r0_1;
        if (r3_4 != 0)
        {
            r0_1 = r6_1[1](r6_1[2], r3_4, r4);
            void* r2_6 = *r6_1;
            if (r0_1 == 0)
            {
                void* r3_17 = (r2_6 + ((r3_4 * 3) - 3));
                *(r3_17 + 2) = r4;
                r1_3 = (r2_6 + r7_3);
                uint32_t r2_7 = *(r2_6 + r7_3);
                if (r2_7 != 0)
                {
                    *(r3_17 + 1) = r2_7;
                }
                *r1_3 = r3_4;
            }
            else
            {
                void* r7_4 = (r2_6 + r7_3);
                *(r7_4 + 2) = r3_4;
                r1_3 = (r2_6 + ((r3_4 * 3) - 3));
                uint32_t r3_10 = *(r2_6 + ((r3_4 * 3) - 3));
                if (r3_10 != 0)
                {
                    *(r7_4 + 1) = r3_10;
                }
                *r1_3 = r4;
                *(r6_1 + 0xd) = r3_4;
                if (r4 != r3_4)
                {
                    goto label_1174;
                }
            }
        }
        if ((r3_4 == 0 || (r3_4 != 0 && r0_1 == 0)))
        {
            *(r6_1 + 0xd) = r4;
        }
        int32_t r0_5 = sub_14cc(*0x20021294, r1_3, arg1, arg2, arg2);
        int32_t r6_3 = r0_5;
        if (r0_5 != 0)
        {
            sub_1910(*0x20021280, r4);
        }
        else
        {
        label_1174:
            r6_3 = 0;
        }
        uint32_t r1_6 = *((*0x2002128c + r4) - 1);
        int32_t* r3_23 = *0x20021284;
        __dmb_SY();
        *r3_23 = 0;
        __msr(arg3);
        r0_3 = 0;
        if (r6_3 == 0)
        {
            r0_3 = ((r1_6 << 8) | r4);
        }
    }
    return r0_3;
}

int32_t sub_11f4()
{
    if (*0x20021284 == 0)
    {
        sub_1650(*0x20021280, 0x10, 0x10000dad, 0x20021280);
        sub_15ac(3, sub_13f4(3));
        uint32_t r6;
        sub_1440(3, 0x10000f11, r6);
        int32_t r0_3 = (sub_a70() + 0x34000040);
        *0x20021294 = 3;
        *0x20021284 = (r0_3 << 2);
        *0x200259c4 = 0x20021280;
    }
    sub_d9c(0x200259d4, 0xa);
    return 0x200259d4;
}

int32_t sub_1258(int32_t arg1, int32_t arg2)
{
    int32_t r6 = (0xfffffffa + arg1);
    uint32_t r7 = (0xffffffff + arg2);
    bool cond:0 = r7 == arg2;
    int32_t r2_1;
    int32_t r3_1;
    if ((r7 > arg2 || ((r7 <= arg2 && cond:0) && r6 > arg1)))
    {
        r6 = 0;
        r7 = 0;
        int32_t r0_2;
        int32_t r1_2;
        r0_2 = sub_140c();
        r2_1 = (0 - r0_2);
        r3_1 = (0 - r1_2);
        if (r3_1 > 0)
        {
        label_12b0:
            uint32_t r8;
            uint32_t r0_4 = sub_10d8(r6, r7, r8);
            if (r0_4 >= 0)
            {
                while (true)
                {
                    int32_t r3_2 = *0x40054024;
                    if (r7 <= r3_2)
                    {
                        if (r6 <= *0x40054028)
                        {
                            break;
                        }
                        if ((r6 > *0x40054028 && r7 != r3_2))
                        {
                            break;
                        }
                    }
                    int32_t* r1_5 = *0x200259d4;
                    /* unimplemented  {mrs r0, primask} */;
                    /* unimplemented  {cpsid I} */;
                    while (*r1_5 == 0)
                    {
                        /* nop */
                    }
                    __dmb_SY();
                    int32_t* r3_4 = *0x200259d4;
                    __dmb_SY();
                    *r3_4 = 0;
                    __msr(r0_4);
                    __wfe();
                }
            }
        }
    }
    if ((r7 <= arg2 && ((!cond:0) || (cond:0 && r6 <= arg1))))
    {
        int32_t r0;
        int32_t r1;
        r0 = sub_140c();
        r2_1 = (r6 - r0);
        r3_1 = (r7 - r1);
        if (r3_1 > 0)
        {
            goto label_12b0;
        }
    }
    if ((((((r7 > arg2 || ((r7 <= arg2 && cond:0) && r6 > arg1)) && r3_1 <= 0) || (r7 <= arg2 && ((!cond:0) || (cond:0 && r6 <= arg1)))) && r3_1 == 0) && r2_1 != 0))
    {
        goto label_12b0;
    }
    sub_1420(arg1, arg2);
    return arg1;
}

int32_t sub_1304(int32_t arg1)
{
    int32_t r0;
    int32_t r1;
    r0 = sub_140c();
    int32_t r0_2;
    int32_t r1_1;
    r0_2 = sub_21dc(arg1, 0, 0x3e8, 0);
    int32_t r0_3 = (r0_2 + r0);
    int32_t r1_2 = (r1_1 + r1);
    if ((r1 > r1_2 || ((r1 <= r1_2 && r1 == r1_2) && r0 > r0_3)))
    {
        r0_3 = 0xffffffff;
        r1_2 = 0xffffffff;
    }
    return sub_1258(r0_3, r1_2);
}

int32_t sub_133c(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    uint32_t arg5 @ r12)
{
    /* unimplemented  {mrs r3, apsr} */;
    int32_t r3 = (arg4 & 0x3f);
    int32_t r0_1 = (r3 - 0x10);
    /* unimplemented  {mrs r12, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000128 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r1 = (1 << r0_1);
    *0x40054034 = r1;
    uint32_t r6_1 = *0x200259f3;
    uint32_t r1_2 = (r6_1 >> r0_1);
    int32_t r7_1 = (1 & r1_2);
    if ((1 & r1_2) == 0)
    {
        __dmb_SY();
        *0xd0000128 = r7_1;
        __msr(arg5);
    }
    else
    {
        int32_t r2_1 = (r0_1 << 2);
        if (*0x40054024 < *(r2_1 + 0x200259d8))
        {
            *((r3 << 2) + 0x40053fd0) = *((r3 << 2) + 0x40053fd0);
            __dmb_SY();
            *0xd0000128 = 0;
            __msr(arg5);
        }
        else
        {
            int32_t r2_2 = *(r2_1 + 0x20021614);
            *0x200259f3 = (r6_1 & (!r1));
            __dmb_SY();
            *0xd0000128 = 0;
            __msr(arg5);
            if (r2_2 != 0)
            {
                r0_1 = r2_2();
            }
        }
    }
    return r0_1;
}

uint32_t sub_13f4(int32_t arg1)
{
    uint32_t r12;
    return sub_a00(0x200259f1, arg1, 0x100158c0, r12);
}

int32_t sub_140c()
{
    int32_t r1 = *0x40054024;
    int32_t r0_1;
    int32_t r2_1;
    do
    {
        r2_1 = r1;
        r0_1 = *0x40054028;
        r1 = *0x40054024;
    } while (r2_1 != r1);
    return r0_1;
}

void sub_1420(int32_t arg1, int32_t arg2)
{
    bool cond:0_1;
    int32_t r3_1;
    do
    {
        r3_1 = *0x40054024;
        cond:0_1 = arg2 != r3_1;
    } while (arg2 > r3_1);
    if ((!cond:0_1))
    {
        while (*0x40054028 < arg1)
        {
            if (arg2 != *0x40054024)
            {
                break;
            }
        }
    }
}

uint32_t sub_1440(uint32_t arg1, int32_t arg2, uint32_t arg3 @ r6)
{
    uint32_t var_8 = arg3;
    /* unimplemented  {mrs r6, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000128 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    uint32_t r0_1;
    if (arg2 == 0)
    {
        *((arg1 << 2) + 0x20021614) = arg2;
        *0x200259f3 = (*0x200259f3 & (!(1 << arg1)));
        uint32_t r10;
        sub_b10(arg1, 0x1000133d, r10);
        r0_1 = arg1;
        sub_a88(r0_1, 0);
    }
    else
    {
        r0_1 = sub_aac(arg1);
        if (0x1000133d != r0_1)
        {
            sub_abc(arg1, 0x1000133d, arg3);
            r0_1 = arg1;
            sub_a88(r0_1, 1);
            *0x40056038 = (1 << arg1);
        }
        *((arg1 << 2) + 0x20021614) = arg2;
    }
    __dmb_SY();
    *0xd0000128 = 0;
    __msr(arg3);
    return r0_1;
}

int32_t sub_14cc(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    uint32_t arg5 @ r10)
{
    int32_t r1 = *0x40054024;
    int32_t r6_1;
    int32_t r5_1;
    do
    {
        r5_1 = r1;
        r6_1 = *0x40054028;
        r1 = *0x40054024;
    } while (r1 != r5_1);
    bool cond:0 = arg4 == r1;
    int32_t r0;
    if ((arg4 > r1 || ((arg4 <= r1 && cond:0) && arg3 > r6_1)))
    {
        /* unimplemented  {mrs r10, primask} */;
        /* unimplemented  {cpsid I} */;
        while (*0xd0000128 == 0)
        {
            /* nop */
        }
        __dmb_SY();
        int32_t r5_3 = (1 << arg1);
        uint32_t r1_2 = *0x200259f3;
        uint32_t r1_4 = (r1_2 | r5_3);
        *0x200259f3 = r1_4;
        *0x40054034 = r5_3;
        *(((arg1 + 4) << 2) + 0x40054000) = arg3;
        *((arg1 << 2) + 0x200259d8) = arg4;
        r0 = 0;
        if ((*0x40054020 & r5_3) == 0)
        {
            goto label_1572;
        }
        int32_t r1_9 = *0x40054024;
        int32_t r6_3;
        int32_t r0_2;
        do
        {
            r0_2 = r1_9;
            r6_3 = *0x40054028;
            r1_9 = *0x40054024;
        } while (r1_9 != r0_2);
        bool cond:1_1 = arg4 != r1_9;
        if ((arg4 > r1_9 || ((arg4 <= r1_9 && (!cond:1_1)) && arg3 > r6_3)))
        {
            r0 = 0;
            __dmb_SY();
            *0xd0000128 = 0;
            __msr(arg5);
        }
        if (((cond:1_1 || ((!cond:1_1) && arg3 <= r6_3)) && arg4 <= r1_9))
        {
            if (r1_4 != r1_2)
            {
                *0x40054020 = r5_3;
                *0x40054034 = r5_3;
                r0 = 1;
                *0xe000e280 = (1 << (arg1 & 0x1f));
                *0x200259f3 = r1_2;
                goto label_1572;
            }
            r0 = 1;
        label_1572:
            __dmb_SY();
            *0xd0000128 = 0;
            __msr(arg5);
        }
    }
    if ((arg4 <= r1 && ((!cond:0) || (cond:0 && arg3 <= r6_1))))
    {
        r0 = 1;
    }
    return r0;
}

void sub_15ac(int32_t arg1, uint32_t arg2 @ r12)
{
    /* unimplemented  {mrs r12, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*0xd0000128 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r3_2 = (1 << arg1);
    *0x40054020 = r3_2;
    *0x200259f3 = (*0x200259f3 & (!r3_2));
    __dmb_SY();
    *0xd0000128 = 0;
    __msr(arg2);
}

int32_t sub_15e8(int32_t* arg1, int32_t arg2, int32_t arg3)
{
    int32_t r4 = arg3;
    if (arg2 != 0)
    {
        r4 = arg2;
        if (arg3 != 0)
        {
            void* r1 = *arg1;
            if (arg1[1](arg1[2]) == 0)
            {
                void* r3_9 = (r1 + ((r4 * 3) - 3));
                *(r3_9 + 2) = arg3;
                void* r0_4 = (r1 + ((arg3 * 3) - 3));
                uint32_t r2_7 = *(r1 + ((arg3 * 3) - 3));
                if (r2_7 != 0)
                {
                    *(r3_9 + 1) = r2_7;
                    *r0_4 = r4;
                    r4 = arg3;
                }
                else
                {
                    *r0_4 = r4;
                    r4 = arg3;
                }
            }
            else
            {
                void* r3_5 = (r1 + ((arg3 * 3) - 3));
                *(r3_5 + 2) = r4;
                void* r0_2 = (r1 + ((r4 * 3) - 3));
                uint32_t r2_3 = *(r1 + ((r4 * 3) - 3));
                if (r2_3 != 0)
                {
                    *(r3_5 + 1) = r2_3;
                    *r0_2 = arg3;
                }
                else
                {
                    *r0_2 = arg3;
                }
            }
        }
    }
    return r4;
}

void* sub_1650(int32_t* arg1, char arg2, int32_t arg3, int32_t arg4)
{
    arg1[2] = arg4;
    uint32_t r4 = arg2;
    *(arg1 + 0xd) = 0;
    uint32_t r3 = 1;
    arg1[3] = r4;
    arg1[1] = arg3;
    *(arg1 + 0xe) = 1;
    *(arg1 + 0xf) = r4;
    void* r0 = *arg1;
    if (r4 > 1)
    {
        uint8_t* r2 = (r0 + 1);
        do
        {
            r3 = (r3 + 1);
            *r2 = r3;
            r2 = &r2[3];
        } while (r4 != r3);
    }
    uint32_t r1 = arg2;
    *((r0 + (r1 * 3)) - 2) = 0;
    return ((r0 + (r1 * 3)) - 3);
}

uint32_t sub_168c(int32_t* arg1, uint32_t arg2)
{
    uint32_t r4 = arg2;
    if (arg2 != 0)
    {
        void* r3_1 = *arg1;
        int32_t r5_3 = ((arg2 * 3) - 3);
        void* r2_1 = (r3_1 + r5_3);
        uint32_t r7_1 = *(r2_1 + 1);
        if (r7_1 != 0)
        {
            int32_t r1_2 = ((r7_1 * 3) - 3);
            void* r3_2 = (r3_1 + r1_2);
            uint32_t r1_3 = *(r3_2 + 1);
            *(r3_2 + 1) = 0;
            *(r2_1 + 1) = 0;
            void* r3_4 = *arg1;
            uint8_t* r2_4;
            uint32_t r3_5;
            if (arg1[1](arg1[2], r4, r7_1) == 0)
            {
                void* r5_4 = (r3_4 + r5_3);
                *(r5_4 + 2) = r7_1;
                r2_4 = (r3_4 + r1_2);
                r3_5 = *(r3_4 + r1_2);
                if (r3_5 != 0)
                {
                    *(r5_4 + 1) = r3_5;
                }
                *r2_4 = r4;
            }
            else
            {
                r2_4 = (r3_4 + r1_2);
                r2_4[2] = r4;
                uint8_t* r1_5 = (r3_4 + r5_3);
                r3_5 = *(r3_4 + r5_3);
                if (r3_5 != 0)
                {
                    r2_4[1] = r3_5;
                }
                *r1_5 = r7_1;
                r7_1 = r4;
            }
            r4 = sub_15e8(arg1, r7_1, sub_168c(arg1, r1_3, r2_4, r3_5));
        }
    }
    return r4;
}

uint32_t sub_171c(int32_t* arg1, int32_t arg2, int32_t arg3)
{
    void* r1 = *arg1;
    int32_t r7_1 = ((arg2 * 3) - 3);
    uint32_t r0 = *(r1 + r7_1);
    void* r2 = (r1 + r7_1);
    void* r3_5;
    if (r0 != 0)
    {
        r3_5 = (r1 + ((r0 * 3) - 3));
        uint32_t r6_1 = *(r3_5 + 1);
        if (r6_1 == 0)
        {
            if (arg3 != 0)
            {
                goto label_1756;
            }
            goto label_17d6;
        }
        void* r1_1 = (r1 + ((r6_1 * 3) - 3));
        uint32_t r8_2 = *(r1_1 + 1);
        *(r1_1 + 1) = 0;
        *(r3_5 + 1) = 0;
        int32_t r0_2 = sub_15e8(arg1, r0, r6_1);
        if (r8_2 != 0)
        {
            void* r1_3 = *arg1;
            void* r3_14 = (r1_3 + ((r8_2 * 3) - 3));
            uint32_t r2_6 = *(r3_14 + 1);
            if (r2_6 != 0)
            {
                void* r1_5 = (r1_3 + ((r2_6 * 3) - 3));
                uint32_t r0_7 = *(r1_5 + 1);
                *(r1_5 + 1) = 0;
                *(r3_14 + 1) = 0;
                uint32_t r0_13 = sub_15e8(arg1, sub_15e8(arg1, r8_2, r2_6), sub_168c(arg1, r0_7));
                r8_2 = r0_13;
            }
        }
        r0 = sub_15e8(arg1, r0_2, r8_2);
        r1 = *arg1;
        r2 = (r1 + r7_1);
        if (arg3 != 0)
        {
            goto label_1756;
        }
        if (r0 != 0)
        {
            goto label_17d2;
        }
    }
    else if (arg3 != 0)
    {
    label_1756:
        uint32_t r6_3 = *(arg1 + 0xf);
        if (r6_3 != 0)
        {
            *((r1 + (r6_3 * 3)) - 2) = arg2;
        }
        *(arg1 + 0xf) = arg2;
        if (r0 != 0)
        {
        label_17d2:
            r3_5 = (r1 + ((r0 * 3) - 3));
        label_17d6:
            *(r3_5 + 2) = 0;
        }
    }
    *(r2 + 1) = 0;
    return r0;
}

uint32_t sub_1814(int32_t* arg1, int32_t arg2)
{
    uint32_t r5_1 = *(arg1 + 0xd);
    void* r0 = *arg1;
    int32_t r7_1 = ((r5_1 * 3) - 3);
    uint32_t r1 = *(r0 + r7_1);
    void* r2 = (r0 + r7_1);
    void* r3_5;
    if (r1 != 0)
    {
        r3_5 = (r0 + ((r1 * 3) - 3));
        uint32_t r6_1 = *(r3_5 + 1);
        if (r6_1 == 0)
        {
            if (arg2 != 0)
            {
                goto label_184e;
            }
            goto label_18d2;
        }
        void* r0_2 = (r0 + ((r6_1 * 3) - 3));
        uint32_t r8_2 = *(r0_2 + 1);
        *(r0_2 + 1) = 0;
        *(r3_5 + 1) = 0;
        int32_t r0_4 = sub_15e8(arg1, r1, r6_1);
        if (r8_2 != 0)
        {
            void* r1_1 = *arg1;
            void* r3_14 = (r1_1 + ((r8_2 * 3) - 3));
            uint32_t r2_6 = *(r3_14 + 1);
            if (r2_6 != 0)
            {
                void* r1_3 = (r1_1 + ((r2_6 * 3) - 3));
                uint32_t r0_10 = *(r1_3 + 1);
                *(r1_3 + 1) = 0;
                *(r3_14 + 1) = 0;
                uint32_t r0_16 = sub_15e8(arg1, sub_15e8(arg1, r8_2, r2_6), sub_168c(arg1, r0_10));
                r8_2 = r0_16;
            }
        }
        r1 = sub_15e8(arg1, r0_4, r8_2);
        r0 = *arg1;
        r2 = (r0 + r7_1);
        if (arg2 != 0)
        {
            goto label_184e;
        }
        if (r1 != 0)
        {
            goto label_18ce;
        }
    }
    else if (arg2 != 0)
    {
    label_184e:
        uint32_t r6_3 = *(arg1 + 0xf);
        if (r6_3 != 0)
        {
            *((r0 + (r6_3 * 3)) - 2) = r5_1;
        }
        *(arg1 + 0xf) = r5_1;
        if (r1 != 0)
        {
        label_18ce:
            r3_5 = (r0 + ((r1 * 3) - 3));
        label_18d2:
            *(r3_5 + 2) = 0;
        }
    }
    *(r2 + 1) = 0;
    *(arg1 + 0xd) = r1;
    return r5_1;
}

int32_t sub_1910(int32_t* arg1, int32_t arg2)
{
    int32_t r0_8;
    uint32_t r2_1;
    uint32_t r3_1;
    if (arg2 != 0)
    {
        r3_1 = *(arg1 + 0xd);
        if (r3_1 == arg2)
        {
            *(arg1 + 0xd) = sub_171c(arg1, r3_1, 1);
            r0_8 = 1;
        }
        else
        {
            void* r5_1 = *arg1;
            void* r0_3 = (r5_1 + ((arg2 * 3) - 3));
            r2_1 = *(r0_3 + 2);
            if (r2_1 != 0)
            {
                uint32_t r2_2 = *(r5_1 + ((r2_1 * 3) - 3));
                void* r6_1 = (r5_1 + ((r2_1 * 3) - 3));
                if (r2_2 == arg2)
                {
                    *r6_1 = *(r0_3 + 1);
                }
                else
                {
                    do
                    {
                        void* r3_8 = (r5_1 + ((r2_2 * 3) - 3));
                        r2_2 = *(r3_8 + 1);
                        if (r2_2 == arg2)
                        {
                            *(r3_8 + 1) = *(r0_3 + 1);
                            break;
                        }
                    } while (r2_2 != 0);
                }
                *(r0_3 + 2) = 0;
                *(r0_3 + 1) = 0;
                *(arg1 + 0xd) = sub_15e8(arg1, *(arg1 + 0xd), sub_171c(arg1, arg2, 1));
                r0_8 = 1;
            }
        }
    }
    if ((arg2 == 0 || ((arg2 != 0 && r3_1 != arg2) && r2_1 == 0)))
    {
        r0_8 = 0;
    }
    return r0_8;
}

int32_t* sub_198c(int32_t* arg1)
{
    sub_d9c(arg1, sub_a70());
    arg1[1] = 0xff;
    __dmb_SY();
    return arg1;
}

int32_t* sub_19a8(int32_t* arg1)
{
    sub_d9c(arg1, sub_a70());
    arg1[1] = 0xff;
    __dmb_SY();
    return arg1;
}

int32_t sub_19c4()
{
    *0x4000e000 = 0xfefbcdbf;
    int32_t r1 = 0x4000c000;
    *0x4000f000 = 0x3c7ffe;
    int32_t r4_1;
    do
    {
        r4_1 = (0x3c7ffe & (!*0x4000c008));
    } while (r4_1 != 0);
    int32_t* r5 = 0x200212d8;
    int32_t r3_3;
    do
    {
        int32_t r3_2 = *r5;
        r5 = &r5[1];
        int32_t r0;
        r0 = r3_2(r0, r1);
        r3_3 = r4_1;
        r4_1 = (r4_1 + 1);
    } while (r3_3 != 3);
    sub_1c08();
    *0x4000f000 = 0x1ffffff;
    uint32_t r5_1;
    int32_t r3_6;
    do
    {
        r3_6 = ((!*0x4000c008) << 7);
        r5_1 = (r3_6 >> 7);
    } while (r3_6 != 0);
    int32_t* r4_2 = 0x200212d0;
    *0x4001f078 = 0x40;
    *0x4001f074 = 0x40;
    *0x4001f070 = 0x40;
    *0x4001f06c = 0x40;
    while (true)
    {
        int32_t* r0_1 = r4_2;
        if (*r4_2 == 0)
        {
            r4_2 = &r4_2[2];
            sub_198c(r0_1);
            if (r4_2 >= 0x200212d8)
            {
                break;
            }
        }
        else
        {
            r4_2 = &r4_2[2];
            sub_19a8(r0_1);
            if (r4_2 >= 0x200212d8)
            {
                break;
            }
        }
    }
    sub_2360(0x20020000, *0xe000ed08, 0xc0);
    *0xe000ed08 = 0x20020000;
    sub_a54();
    sub_d78();
    sub_11f4();
    int32_t* r4_3 = 0x200212e8;
    int32_t r0_2;
    uint32_t r3_9;
    do
    {
        int32_t r3_8 = *r4_3;
        r4_3 = &r4_3[1];
        r0_2 = r3_8();
        r3_9 = r5_1;
        r5_1 = (r5_1 + 1);
    } while (1 != r3_9);
    return r0_2;
}

int32_t sub_1ab4() __noreturn
{
    breakpoint();
}

int32_t j_sub_1ab4() __noreturn
{
    /* tailcall */
    return sub_1ab4();
}

int32_t sub_1ab8(char* arg1, int32_t arg2) __noreturn
{
    int32_t r3;
    int32_t var_4 = r3;
    int32_t r2;
    int32_t var_8 = r2;
    int32_t var_c = arg2;
    sub_25cc(0x100158e4);
    if (arg1 != 0)
    {
        int32_t* var_1c_1 = &var_c;
        sub_2078(arg1, &var_c);
        sub_25cc(0x100158f4);
    }
    breakpoint();
}

int32_t sub_1ae8() __noreturn
{
    int32_t r1;
    sub_1ab8(0x100158f8, r1);
    /* no return */
}

int32_t sub_1af4(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    int32_t arg5)
{
    int32_t r0_7;
    if (arg5 > arg4)
    {
        r0_7 = 0;
    }
    else
    {
        uint32_t r2_1 = (arg4 >> 0x18);
        int32_t r6_1 = (arg4 << 8);
        int32_t r0_1 = sub_28f8(r6_1, r2_1, arg5, 0);
        int32_t* r4_4 = ((arg1 * 0xc) + 0x40008000);
        if (r4_4[1] < r0_1)
        {
            r4_4[1] = r0_1;
        }
        uint32_t r3_2 = (arg1 - 4);
        int32_t* r3_6;
        int32_t r5_2;
        if ((r3_2 > 1 || (r3_2 <= 1 && arg2 != 1)))
        {
            *(0x3000 | r4_4) = 0x800;
            r5_2 = (arg1 << 2);
            int32_t r1_1 = *(0x20021724 + r5_2);
            if (r1_1 != 0)
            {
                int32_t r0_4 = (sub_28a8(*0x20021738, r1_1, 0x800, 0x20021724) + 1);
                int32_t temp0_1;
                do
                {
                    temp0_1 = r0_4;
                    r0_4 = (r0_4 - 1);
                } while (temp0_1 != 1);
            }
            r3_6 = (0x1000 | r4_4);
            *r3_6 = (0xe0 & (*r4_4 ^ (arg3 << 5)));
        }
        if ((r3_2 <= 1 && arg2 == 1))
        {
            *(0x3000 | r4_4) = 3;
            while ((1 & r4_4[2]) == 0)
            {
                /* nop */
            }
            r3_6 = (0x1000 | r4_4);
            *r3_6 = (((arg3 << 5) ^ *r4_4) & 0xe0);
            r5_2 = (arg1 << 2);
        }
        if ((((r3_2 > 1 || (r3_2 <= 1 && arg2 != 1)) && r3_2 <= 1) || (r3_2 <= 1 && arg2 == 1)))
        {
            *r3_6 = (3 & (*r4_4 ^ arg2));
            int32_t r2_14 = (1 << arg2);
            while ((r2_14 & r4_4[2]) == 0)
            {
                /* nop */
            }
        }
        *(0x2000 | r4_4) = 0x800;
        r4_4[1] = r0_1;
        *(0x20021724 + r5_2) = sub_28f8(r6_1, r2_1, r0_1, 0);
        r0_7 = 1;
    }
    return r0_7;
}

uint32_t sub_1c08()
{
    sub_1f9c(0xc);
    uint32_t r0 = sub_a44();
    if (r0 != 0)
    {
        *0x20021724 = 0x2dc6c00;
        *0x20021728 = 0x2dc6c00;
        *0x2002172c = 0x2dc6c00;
        *0x20021730 = 0x2dc6c00;
        *0x20021734 = 0x2dc6c00;
        *0x20021738 = 0x2dc6c00;
        *0x2002173c = 0x2dc6c00;
        *0x20021740 = 0x2dc6c00;
        *0x20021744 = 0x2dc6c00;
        *0x20021748 = 0xb71b;
    }
    else
    {
        *0x40008078 = r0;
        sub_2040();
        *0x4000b03c = 1;
        while (*0x40008044 != 1)
        {
            /* nop */
        }
        *0x4000b030 = 3;
        int32_t r3_2;
        do
        {
            r3_2 = *0x40008038;
        } while (r3_2 != 1);
        sub_1ed0(0x40028000, 1, 0x59682f00, (r3_2 + 5), (r3_2 + 1));
        sub_1ed0(0x4002c000, 1, 0x47868c00, 5, 5);
        if (*0x40008034 <= 0xff)
        {
            *0x40008034 = 0x100;
        }
        int32_t r1_1 = *0x20021734;
        *0x4000b030 = 0x800;
        if (r1_1 != 0)
        {
            int32_t r0_3 = (sub_28a8(*0x20021738, r1_1, 0x800, 0x4000b030) + 1);
            int32_t temp0_1;
            do
            {
                temp0_1 = r0_3;
                r0_3 = (r0_3 - 1);
            } while (temp0_1 != 1);
        }
        *0x40009030 = (0xe0 & *0x40008030);
        *0x40009030 = (3 & (2 ^ *0x40008030));
        while ((4 & *0x40008038) == 0)
        {
            /* nop */
        }
        *0x4000a030 = 0x800;
        *0x40008034 = 0x100;
        *0x20021734 = 0xb71b00;
        if (*0x40008040 <= 0xff)
        {
            *0x40008040 = 0x100;
        }
        *0x4000b03c = 3;
        while ((1 & *0x40008044) == 0)
        {
            /* nop */
        }
        *0x4000903c = (0xe0 & *0x4000803c);
        r0 = (*0x4000803c ^ 1);
        *0x4000903c = (3 & r0);
        while ((2 & *0x40008044) == 0)
        {
            /* nop */
        }
        *0x4000a03c = 0x800;
        *0x40008040 = 0x100;
        *0x20021738 = 0x7735940;
        if (*0x40008058 <= 0xff)
        {
            *0x40008058 = 0x100;
        }
        int32_t r1_8 = *0x20021740;
        *0x4000b054 = 0x800;
        if (r1_8 != 0)
        {
            r0 = (sub_28a8(*0x20021738, r1_8, 0x800, 0x4000b054) + 1);
            uint32_t temp1_1;
            do
            {
                temp1_1 = r0;
                r0 = (r0 - 1);
            } while (temp1_1 != 1);
        }
        *0x40009054 = (0xe0 & *0x40008054);
        *0x4000a054 = 0x800;
        *0x40008058 = 0x100;
        *0x20021740 = 0x2dc6c00;
        if (*0x40008064 <= 0xff)
        {
            *0x40008064 = 0x100;
        }
        int32_t r1_10 = *0x20021744;
        *0x4000b060 = 0x800;
        if (r1_10 != 0)
        {
            r0 = (sub_28a8(*0x20021738, r1_10, 0x800, 0x4000b060) + 1);
            uint32_t temp2_1;
            do
            {
                temp2_1 = r0;
                r0 = (r0 - 1);
            } while (temp2_1 != 1);
        }
        *0x40009060 = (0xe0 & *0x40008060);
        *0x4000a060 = 0x800;
        *0x40008064 = 0x100;
        *0x20021744 = 0x2dc6c00;
        if (*0x40008070 < 0x40000)
        {
            *0x40008070 = 0x40000;
        }
        int32_t r1_12 = *0x20021748;
        *0x4000b06c = 0x800;
        if (r1_12 != 0)
        {
            r0 = (sub_28a8(*0x20021738, r1_12, 0x800, 0x4000b06c) + 1);
            uint32_t temp3_1;
            do
            {
                temp3_1 = r0;
                r0 = (r0 - 1);
            } while (temp3_1 != 1);
        }
        *0x4000906c = (0xe0 & *0x4000806c);
        *0x4000a06c = 0x800;
        *0x40008070 = 0x40000;
        *0x20021748 = 0xb71b;
        if (*0x4000804c <= 0xff)
        {
            *0x4000804c = 0x100;
        }
        int32_t r1_13 = *0x2002173c;
        *0x4000b048 = 0x800;
        if (r1_13 != 0)
        {
            r0 = (sub_28a8(*0x20021738, r1_13, 0x800, 0x4000b048) + 1);
            uint32_t temp4_1;
            do
            {
                temp4_1 = r0;
                r0 = (r0 - 1);
            } while (temp4_1 != 1);
        }
        *0x40009048 = (0xe0 & *0x40008048);
        *0x4000a048 = 0x800;
        *0x4000804c = 0x100;
        *0x2002173c = 0x7735940;
    }
    return r0;
}

int32_t sub_1ec4(int32_t arg1)
{
    return *((arg1 << 2) + 0x20021724);
}

int32_t sub_1ed0(int32_t* arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    int32_t arg5)
{
    int32_t r0 = sub_28a8(0xc);
    int32_t r1_1 = ((r0 << 5) - r0);
    int32_t r0_2 = sub_28a8(arg3, (((((r1_1 << 6) - r1_1) << 3) + r0) << 6));
    int32_t r7_2 = ((arg4 << 0x10) | (arg5 << 0xc));
    if (*arg1 >= 0)
    {
    label_1f1a:
        int32_t r2_4 = (((&arg1[-0x1000b000] + (0 - &arg1[-0x1000b000])) << 0xc) + 0x1000);
        *0x4000e000 = r2_4;
        *0x4000f000 = r2_4;
        while ((r2_4 & (!*0x4000c008)) != 0)
        {
            /* nop */
        }
        int32_t* r2_5 = (0x3000 | &arg1[1]);
        *arg1 = arg2;
        arg1[2] = r0_2;
        *r2_5 = 0x21;
        while (*arg1 >= 0)
        {
            /* nop */
        }
        arg1[3] = r7_2;
        *r2_5 = 8;
    }
    else
    {
        if ((0x3f & *arg1) != arg2)
        {
            goto label_1f1a;
        }
        if (((arg1[2] << 0x14) >> 0x14) != r0_2)  // {"Xa.K"}
        {
            goto label_1f1a;
        }
        if ((arg1[3] & 0x77000) != r7_2)
        {
            goto label_1f1a;
        }
    }
    return r0_2;
}

int32_t sub_1f80(int32_t arg1)
{
    int32_t r0_2 = (((arg1 << 4) ^ *0x40064000) & 0xf0);
    *0x40065000 = r0_2;
    return r0_2;
}

void sub_1f9c(int32_t arg1)
{
    *0x4005802c = (0x200 | arg1);
}

void sub_1fac(int32_t arg1, int32_t arg2)
{
    *0x4005801c = 0x6ab73121;
    *0x4005b000 = 0x40000000;
    *0x40012008 = 0x1fffc;
    if (arg2 == 0)
    {
        *0x4005b000 = 0x7000000;
    }
    else
    {
        *0x4005a000 = 0x7000000;
    }
    if (((arg2 == 0 && arg1 == 0) || (arg2 != 0 && arg1 == 0)))
    {
        *0x4005a000 = 0x80000000;
    }
    if (((arg2 == 0 && arg1 != 0) || (arg2 != 0 && arg1 != 0)))
    {
        arg1 = (((((arg1 << 5) - arg1) << 2) + arg1) << 4);
        if (arg1 >= 0x1000000)
        {
            arg1 = 0xffffff;
        }
        *0x200217ac = arg1;
        *0x40058004 = arg1;
        *0x4005a000 = 0x40000000;
    }
}

uint32_t sub_2030()
{
    int32_t r0 = *0x40058008;
    return (r0 - (r0 - 1));
}

int32_t sub_2040()
{
    *0x40024000 = 0xaa0;
    *0x4002400c = 0x2f;
    *0x40026000 = 0xfab000;
    while (*0x40024004 >= 0)
    {
        /* nop */
    }
}

void sub_2068(int32_t arg1)
{
    if (arg1 != 0)
    {
        sub_252c(arg1);
    }
}

int32_t sub_2078(char* arg1, int32_t arg2)
{
    int32_t r4 = *0x200217a8;
    int32_t r0;
    if (r4 == 0)
    {
        sub_25cc(arg1);
        r0 = 0;
    }
    else
    {
        void var_c;
        r4(0x10002069, &var_c, 0xffffffff, arg1, arg2);
        r0 = 1;
    }
    return r0;
}

int32_t sub_20a8()
{
    /* jump -> 0x100020d9 */
}

int32_t sub_20b8(int32_t arg1)
{
    int32_t r2;
    return sub_2100(&data_6158, arg1, r2, 0x2100);
}

int32_t sub_20c8(int32_t arg1)
{
    int32_t r2;
    return sub_2100(&data_4b2e, arg1, r2, 0x2100);
}

int32_t sub_212e(int32_t arg1, int32_t arg2 @ r5, int32_t arg3, int32_t arg4, 
    int32_t arg5)
{
    sub_2360(0x200213f0, arg1, 0x80);
    if (arg2 == 2)
    {
        *0x20021438 = 0x100021b1;
    }
    int32_t r0 = sub_20b8(0x334c);
    *0x200259d0 = r0;
    return r0;
}

int32_t sub_214a(int32_t arg1, int32_t arg2, int32_t arg3)
{
    *0x20021438 = 0x100021b1;
    int32_t r0 = sub_20b8(0x334c);
    *0x200259d0 = r0;
    return r0;
}

int32_t sub_219c(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    int32_t arg5 @ r10, int16_t* arg6 @ r12)
{
    int32_t lr;
    int32_t var_4 = lr;
    int32_t var_8 = arg3;
    int16_t* r0 = arg6;
    uint32_t r1;
    do
    {
        r1 = *r0;
        r0 = &r0[1];
    } while ((r1 >> 8) != 0xdf);
    uint32_t r1_1 = r1;
    uint32_t r0_3;
    if ((TEST_BIT(r0, 1)))
    {
        r0_3 = *r0;
    }
    else
    {
        r0_3 = ((r0[1] << 0x10) | *r0);
    }
    *(0x200213f0 + r1_1) = r0_3;
    uint32_t var_4_1 = r0_3;
    return 0;
}

int32_t sub_21dc(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
{
    uint32_t r2 = arg3;
    return (((r2 * arg1) + (((arg3 >> 0x10) * arg1) << 0x10)) + (((arg1 >> 0x10) * r2) << 0x10));
}

int32_t sub_2210(int32_t arg1, int32_t arg2)
{
    int32_t r0_1 = (arg1 ^ arg2);
    int32_t r1 = (arg2 ^ r0_1);
    /* tailcall */
    return sub_2216((r0_1 ^ r1), r1);
}

int32_t sub_2216()
{
    /* jump -> *0x200214f4 */
}

int32_t sub_2222()
{
    int32_t r3 = *0xd0000078;
    uint32_t r3_1 = (r3 >> 2);
    int32_t r0;
    int32_t r1;
    if ((!(TEST_BIT(r3, 1))))
    {
        int32_t r4 = *0xd0000060;
        int32_t r5 = *0xd0000064;
        int32_t r7 = *0xd0000074;
        int32_t r6 = *0xd0000070;
        int32_t r0_2 = sub_222a(r0, r1, 0xd0000000, r3_1);
        *0xd0000060 = r4;
        *0xd0000064 = r5;
        *0xd0000074 = r7;
        *0xd0000070 = r6;
        return r0_2;
    }
    /* tailcall */
    return sub_222a(r0, r1, 0xd0000000, r3_1);
}

int32_t sub_222a()
{
    /* jump -> *0x200214fc */
}

int32_t sub_224a()
{
    /* jump -> *0x200214f8 */
}

int32_t sub_2258(int32_t arg1)
{
    if (arg1 == 0)
    {
        return 0;
    }
    int32_t r0_1;
    int32_t r12_1;
    r0_1 = *0x200259d0();
    /* jump -> r12_1 */
}

int32_t sub_22a8()
{
    /* jump -> *0x20021514 */
}

int32_t sub_22b4()
{
    sub_20c8(0x4653);
    sub_2360(0x200214f0);
    int32_t r0_1 = sub_20b8(0x334c);
    *0x200259d0 = r0_1;
    return r0_1;
}

uint32_t sub_2318(int16_t* arg1 @ r12)
{
    int32_t lr;
    int32_t var_4_1 = lr;
    int16_t* r0 = arg1;
    uint32_t r1_1;
    do
    {
        r1_1 = *r0;
        r0 = &r0[1];
    } while ((r1_1 >> 8) != 0xdf);
    uint32_t r1_2 = r1_1;
    uint32_t r0_3;
    if ((TEST_BIT(r0, 1)))
    {
        r0_3 = *r0;
    }
    else
    {
        r0_3 = ((r0[1] << 0x10) | *r0);
    }
    *(0x200214f0 + r1_2) = r0_3;
    uint32_t var_4 = r0_3;
    return r0_3;
}

int32_t sub_2344()
{
    /* jump -> 0x100020d9 */
}

int32_t sub_2354()
{
    /* jump -> *0x200212c0 */
}

int32_t sub_2360()
{
    /* jump -> *0x200212c4 */
}

int32_t sub_236c(int32_t* arg1, int32_t arg2, int32_t arg3)
{
    return *arg1(arg2, arg3);
}

void sub_237c(void* arg1, void* arg2, int32_t arg3)
{
    int32_t* r8_1 = arg1;
    if (*(arg1 + 0x11) == 0)
    {
        *arg1(arg2, arg3);
    }
    else if (arg3 > 0)
    {
        void* r3_1 = (arg2 - 1);
        void* r5_1 = &data_1;
        int32_t r4_1 = 0;
        arg1 = nullptr;
        void* r3_13;
        do
        {
            uint32_t r3_6;
            if (r4_1 != 0)
            {
                r3_6 = ((*(r3_1 + r4_1) - 0xd) + (0 - (*(r3_1 + r4_1) - 0xd)));
                if (*(arg2 + r4_1) != 0xa)
                {
                label_23b8:
                    void* r3_7 = r5_1;
                    r4_1 = (r4_1 + 1);
                    r5_1 = (r5_1 + 1);
                    if (arg3 <= r3_7)
                    {
                        break;
                    }
                    continue;
                }
            }
            else
            {
                r3_6 = r8_1[4];
                if (*(arg2 + r4_1) != 0xa)
                {
                    goto label_23b8;
                }
            }
            if (r3_6 != 0)
            {
                goto label_23b8;
            }
            if (arg1 < r4_1)
            {
                *r8_1((arg2 + arg1), (r4_1 - arg1));
            }
            *r8_1(0x10015904, 2);
            r4_1 = (r4_1 + 1);
            arg1 = r5_1;
            r3_13 = r5_1;
            r5_1 = (r5_1 + 1);
        } while (arg3 > r3_13);
        if (arg3 > arg1)
        {
            *r8_1((arg2 + arg1), (arg3 - arg1));
        }
        char r3_18 = ((*((arg2 + arg3) - 1) - 0xd) + (0 - (*((arg2 + arg3) - 1) - 0xd)));
        r8_1[4] = r3_18;
    }
}

void* sub_2430(char* arg1, void* arg2, int32_t arg3, int32_t arg4)
{
    char r7_1 = *0xd0000000;
    void* r5_1 = arg2;
    int32_t var_2c;
    void* r0 = sub_2908(0x200212d0, &var_2c, arg3, 0x200212d0);
    void* r8_1 = r0;
    if ((r0 == 0 && r7_1 != var_2c))
    {
        r0 = sub_2938(0x200212d0);
        r8_1 = &data_1;
    }
    if (r5_1 == 0xffffffff)
    {
        r0 = sub_2844(arg1);
        r5_1 = r0;
    }
    int32_t r7_3;
    if (arg4 != 0)
    {
        r7_3 = 0x1000236d;
    }
    else
    {
        r7_3 = 0x1000237d;
    }
    int32_t* r4_1 = *0x20021798;
    if (r4_1 != 0)
    {
        if (arg3 != 0)
        {
            do
            {
                if (*r4_1 != 0)
                {
                    int32_t r3_7 = *0x2002179c;
                    if ((r3_7 == 0 || (r3_7 != 0 && r3_7 == r4_1)))
                    {
                        r7_3(r4_1, arg1, r5_1, r3_7);
                        var_2c = 0xa;
                        void var_30;
                        r0 = r7_3(r4_1, &var_2c, 1, &var_30);
                    }
                }
                r4_1 = r4_1[3];
            } while (r4_1 != 0);
        }
        else
        {
            do
            {
                if (*r4_1 != 0)
                {
                    int32_t r3_4 = *0x2002179c;
                    if ((r3_4 == 0 || (r3_4 != 0 && r3_4 == r4_1)))
                    {
                        r0 = r7_3(r4_1, arg1, r5_1, r3_4);
                        r4_1 = r4_1[3];
                        if (r4_1 == 0)
                        {
                            break;
                        }
                        continue;
                    }
                }
                r4_1 = r4_1[3];
            } while (r4_1 != 0);
        }
    }
    if (r8_1 != 0)
    {
        r0 = sub_28c8(0x200212d0);
    }
    return r0;
}

int32_t sub_252c(int32_t arg1)
{
    char var_25 = arg1;
    char r4 = *0xd0000000;
    int32_t var_24;
    int32_t r2;
    int32_t r0 = sub_2908(0x200212d0, &var_24, r2, 0x200212d0);
    int32_t r7_1 = r0;
    void* r4_1;
    if (r0 != 0)
    {
        r4_1 = *0x20021798;
        if (r4_1 == 0)
        {
        label_25b0:
            sub_28c8(0x200212d0);
        }
        else
        {
        label_2564:
            do
            {
                if (*r4_1 != 0)
                {
                    int32_t r3_2 = *0x2002179c;
                    if ((r3_2 == 0 || (r3_2 != 0 && r3_2 == r4_1)))
                    {
                        sub_237c(r4_1, &var_25, 1);
                        r4_1 = *(r4_1 + 0xc);
                        if (r4_1 == 0)
                        {
                            break;
                        }
                        continue;
                    }
                }
                r4_1 = *(r4_1 + 0xc);
            } while (r4_1 != 0);
            if (r7_1 != 0)
            {
                goto label_25b0;
            }
        }
    }
    else
    {
        if (r4 != var_24)
        {
            sub_2938(0x200212d0);
            r7_1 = 1;
            r4_1 = *0x20021798;
            if (r4_1 == 0)
            {
                goto label_25b0;
            }
            goto label_2564;
        }
        r4_1 = *0x20021798;
        if (r4_1 != 0)
        {
            goto label_2564;
        }
    }
    return arg1;
}

void* sub_25cc(char* arg1)
{
    void* r0 = sub_2844(arg1);
    sub_2430(arg1, r0, 1, 0);
    void* r4_1 = *0x20021798;
    if (r4_1 != 0)
    {
        while (true)
        {
            int32_t r3_1 = *(r4_1 + 4);
            if (r3_1 == 0)
            {
                r4_1 = *(r4_1 + 0xc);
                if (r4_1 == 0)
                {
                    break;
                }
            }
            else
            {
                r3_1();
                r4_1 = *(r4_1 + 0xc);
                if (r4_1 == 0)
                {
                    break;
                }
            }
        }
    }
    return r0;
}

int32_t sub_2608()
{
    return sub_2628(0x200259c8);
}

int32_t sub_2618(int32_t arg1)
{
    return sub_2360(arg1, 0x200259c8, 8);
}

int32_t sub_2628(int32_t arg1)
{
    int32_t var_30 = 0;
    void var_2c;
    sub_2354(&var_2c, 0, 9);
    int32_t var_20 = 0;
    void var_1c;
    sub_2354(&var_1c, 0, 9);
    var_30 = 0x4b;
    sub_28b8(&var_30, &var_20, 0xd, 0x4b, 0x4b);
    void var_1b;
    return sub_2360(arg1, &var_1b, 8);
}

int32_t sub_2668(uint32_t arg1, char* arg2)
{
    sub_9d4();
    uint32_t r7_1 = arg2[4];
    int32_t r4 = arg2[5];
    int32_t r3_2 = (((arg1 - 0x50300000) + (0 - (arg1 - 0x50300000))) << 2);
    int32_t r0_2 = *(0x2002160c + r3_2);
    int32_t r3_3 = (0x20 - r7_1);
    int32_t r2_2 = ((1 << r7_1) - 1);
    int32_t r5_1;
    if (r4 < 0)
    {
        if (r3_3 < 0)
        {
        label_270a:
            sub_1ab8(0x10015908, arg2);
            /* no return */
        }
        int32_t temp0_1;
        do
        {
            r5_1 = (r2_2 << r3_3);
            r4 = r3_3;
            if ((r5_1 & r0_2) == 0)
            {
                break;
            }
            temp0_1 = r3_3;
            r3_3 = (r3_3 - 1);
        } while (temp0_1 >= 1);
        if ((r5_1 & r0_2) != 0)
        {
            goto label_270a;
        }
    }
    else
    {
        if (r4 > r3_3)
        {
            goto label_270a;
        }
        int32_t r2_3 = (r2_2 << r4);
        r5_1 = r2_3;
        if ((r0_2 & r2_3) != 0)
        {
            goto label_270a;
        }
    }
    if (r7_1 != 0)
    {
        uint32_t r2_9 = ((arg2[3] << 0x18) | ((arg2[2] << 0x10) | (*arg2 | (arg2[1] << 8))));
        int32_t r2_10 = 0;
        do
        {
            uint32_t r1_3 = *(r2_9 + (r2_10 << 1));
            if ((r1_3 >> 0xd) == 0)
            {
                r1_3 = (r1_3 + r4);
            }
            uint32_t* r3_12 = (((r2_10 + r4) + 0x12) << 2);
            r2_10 = (r2_10 + 1);
            *(r3_12 + arg1) = r1_3;
        } while (r7_1 > r2_10);
    }
    *(0x2002160c + r3_2) = (r5_1 | r0_2);
    sub_9ec(arg1);
    return r4;
}

int32_t* sub_2730(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, 
    char arg5)
{
    int32_t r1 = (arg2 << 1);
    void* r5_4 = (((r1 + arg2) << 3) + arg1);
    uint32_t r6_1 = arg5;
    int32_t* r1_2 = (r5_4 + 0xdc);
    int32_t r0 = *r1_2;
    int32_t r6_4 = ((0x1f & (0 - (r6_1 - (r6_1 - 1)))) + 0xe080);
    if (arg4 > 5)
    {
        void* r5_5 = (r5_4 + 0xd8);
        do
        {
            arg4 = (arg4 - 5);
            *r1_2 = ((arg3 << 5) | 0x14000000);
            arg3 = ((arg3 + 5) & 0x1f);
            *r5_5 = r6_4;
        } while (arg4 > 5);
    }
    void* r1_6 = (((r1 + arg2) << 3) + arg1);
    *(r1_6 + 0xdc) = ((arg4 << 0x1a) | (arg3 << 5));
    *(r1_6 + 0xd8) = r6_4;
    *(r1_6 + 0xdc) = r0;
    return (r1_6 + 0xd8);
}

void* sub_27b4(int32_t* arg1, int32_t arg2, int32_t arg3, int32_t* arg4)
{
    int32_t r5_1 = (arg2 << 1);
    *arg1 = (*arg1 & (!(1 << arg2)));
    void* r4_4 = &arg1[((r5_1 + arg2) * 2)];
    void* r6_1 = (r4_4 + 0xc8);
    if (arg4 == 0)
    {
        *r6_1 = 0x10000;
        *(r6_1 + 4) = 0x1f000;
        *(r6_1 + 8) = 0xc0000;
        *(r4_4 + 0xdc) = arg4;
    }
    else
    {
        *r6_1 = *arg4;
        *(r6_1 + 4) = arg4[1];
        int32_t r3 = arg4[3];
        *(r6_1 + 8) = arg4[2];
        *(r4_4 + 0xdc) = r3;
    }
    int32_t r3_1 = ((r5_1 + arg2) << 3);
    int32_t* r4_6 = (0x1000 | (arg1 + (r3_1 + 0xd0)));
    *r4_6 = 0x80000000;
    *r4_6 = 0x80000000;
    arg1[2] = (0x1010101 << arg2);
    *arg1 = ((1 << (arg2 + 4)) | *arg1);
    *arg1 = ((1 << (arg2 + 8)) | *arg1);
    *((arg1 + r3_1) + 0xd8) = (arg3 & 0x1f);
    return ((arg1 + r3_1) + 0xd8);
}

void* sub_2844(char* arg1)
{
    char* r3_1;
    if ((arg1 << 0x1e) == 0)
    {
        r3_1 = arg1;
    }
    else
    {
        r3_1 = arg1;
        do
        {
            if (*r3_1 == 0)
            {
                return (r3_1 - arg1);
            }
            r3_1 = &r3_1[1];
        } while ((r3_1 & 3) != 0);
    }
    int32_t r1_1 = *r3_1;
    if ((((r1_1 - 0x1010101) & (!r1_1)) & 0x80808080) == 0)
    {
        int32_t r1_3;
        do
        {
            int32_t r1_2 = *(r3_1 + 4);
            r3_1 = &r3_1[4];
            if ((((r1_2 - 0x1010101) & (!r1_2)) & 0x80808080) != 0)
            {
                break;
            }
            r1_3 = *(r3_1 + 4);
            r3_1 = &r3_1[4];
        } while ((((r1_3 - 0x1010101) & (!r1_3)) & 0x80808080) == 0);
    }
    while (*r3_1 != 0)
    {
        r3_1 = &r3_1[1];
    }
    return (r3_1 - arg1);
}

int32_t sub_28a8()
{
    /* jump -> 0x20020b6d */
}

int32_t sub_28b8()
{
    /* jump -> 0x20021065 */
}

int32_t sub_28c8()
{
    /* jump -> 0x20020b45 */
}

int32_t sub_28d8()
{
    /* jump -> 0x200201b9 */
}

int32_t sub_28e8()
{
    /* jump -> 0x20020321 */
}

int32_t sub_28f8()
{
    /* jump -> 0x20020bf1 */
}

int32_t sub_2908()
{
    /* jump -> 0x20020b01 */
}

int32_t sub_2918()
{
    /* jump -> 0x20020271 */
}

int32_t sub_2928()
{
    /* jump -> 0x20020b6d */
}

int32_t sub_2938()
{
    /* jump -> 0x20020ab9 */
}

int32_t sub_1591c(int32_t arg1)
{
    *0x40006014 = (1 << ((arg1 << 2) + 2));
    return ((arg1 << 2) + 2);
}

int32_t sub_15930(int32_t arg1)
{
    *0x40007014 = (1 << ((arg1 << 2) + 2));
    return ((arg1 << 2) + 2);
}

void sub_15944(int32_t arg1, int32_t arg2)
{
    int32_t r3 = (1 << ((arg2 << 2) + 2));
    if (arg1 == 0)
    {
        *0x40007014 = r3;
    }
    else
    {
        *0x40006014 = r3;
    }
}

void sub_15964(int32_t arg1)
{
    if (arg1 == 0)
    {
        *0x40007014 = 2;
    }
    else
    {
        *0x40006014 = 2;
    }
}

void sub_15980(int32_t arg1, int32_t arg2)
{
    int32_t r3 = (1 << ((arg2 << 2) + 1));
    if (arg1 == 0)
    {
        *0x40007014 = r3;
    }
    else
    {
        *0x40006014 = r3;
    }
}

int32_t sub_159a0(int32_t arg1)
{
    return (1 & (*0x40004014 >> (arg1 << 2)));
}

int32_t sub_159b4(int32_t arg1)
{
    sub_15980(0, arg1);
    sub_15930(arg1);
    int32_t r0_2 = sub_159a0(arg1);
    sub_1591c(arg1);
    return r0_2;
}

int32_t sub_159d8(int32_t arg1)
{
    sub_15964(arg1);
    sub_15930(0);
    sub_159a0(0);
    return sub_1591c(0);
}

int32_t sub_159f4(int32_t arg1)
{
    sub_15980(1, arg1);
    sub_15930(arg1);
    sub_159a0(arg1);
    return sub_1591c(arg1);
}

int32_t sub_15a14(int32_t arg1, int32_t arg2)
{
    sub_15980(arg1, arg2);
    sub_15930(arg2);
    int32_t r0_2 = sub_159a0(arg2);
    sub_1591c(arg2);
    return r0_2;
}

int32_t sub_15a34(int32_t arg1, int32_t arg2)
{
    sub_159f4(0);
    int32_t r5 = (1 & arg1);
    sub_159f4(0);
    sub_159b4(0);
    int32_t r4_1 = (arg1 >> 1);
    sub_159d8(r5);
    sub_159d8(r4_1);
    sub_159d8(((r4_1 ^ r5) ^ 1));
    sub_159b4(0);
    sub_159f4(0);
    sub_159b4(0);
    int32_t r5_1 = 0;
    int32_t r4_3 = 0;
    do
    {
        int32_t r0_5 = (sub_159b4(0) << r4_3);
        r4_3 = (r4_3 + 1);
        r5_1 = (r5_1 | r0_5);
    } while (r4_3 != 3);
    if (r5_1 == 1)
    {
        sub_159b4(0);
        int32_t r5_2 = 0;
        int32_t r4_5 = 0;
        do
        {
            uint32_t r0_8 = (arg2 >> r4_5);
            r4_5 = (r4_5 + 1);
            int32_t r0_9 = (r0_8 & 1);
            r5_2 = (r5_2 ^ r0_9);
            sub_159d8(r0_9);
        } while (r4_5 != 0x20);
        sub_159d8(r5_2);
    }
    int32_t r4_4 = 0x10;
    int32_t r0_6;
    do
    {
        r4_4 = (r4_4 - 1);
        r0_6 = sub_159b4(0);
    } while (r4_4 != 0);
    return r0_6;
}

int32_t sub_15acc(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
{
    sub_159f4(arg4);
    int32_t r4 = (1 & arg2);
    sub_15a14(arg1, arg4);
    sub_159b4(arg4);
    int32_t r6_1 = (arg2 >> 1);
    sub_15a14(r4, arg4);
    sub_15a14(r6_1, arg4);
    sub_15a14(((arg1 ^ r4) ^ r6_1), arg4);
    sub_159b4(arg4);
    sub_159f4(arg4);
    sub_159b4(arg4);
    int32_t r4_1 = 0;
    int32_t r6_2 = 0;
    do
    {
        int32_t r0_13 = (sub_159b4(arg4) << r4_1);
        r4_1 = (r4_1 + 1);
        r6_2 = (r6_2 | r0_13);
    } while (r4_1 != 3);
    if (r6_2 == 1)
    {
        sub_159b4(arg4);
        int32_t r4_3 = 0;
        int32_t r6_3 = 0;
        do
        {
            int32_t r0_19 = ((arg3 >> r4_3) & 1);
            r4_3 = (r4_3 + 1);
            r6_3 = (r6_3 ^ r0_19);
            sub_15a14(r0_19, arg4);
        } while (r4_3 != 0x20);
        sub_15a14(r6_3, arg4);
    }
    int32_t r4_2 = 0x10;
    int32_t r0_15;
    do
    {
        r4_2 = (r4_2 - 1);
        r0_15 = sub_159b4(arg4);
    } while (r4_2 != 0);
    return r0_15;
}

int32_t sub_15b7c(int32_t arg1, int32_t arg2, int32_t arg3)
{
    sub_159f4(arg3);
    sub_15a14(arg1, arg3);
    sub_159f4(arg3);
    int32_t r3 = (1 & arg2);
    int32_t r4_1 = (arg2 >> 1);
    sub_15a14(r3, arg3);
    sub_15a14(r4_1, arg3);
    sub_15a14((((r4_1 ^ arg1) ^ r3) ^ 1), arg3);
    sub_159b4(arg3);
    sub_159f4(arg3);
    sub_159b4(arg3);
    int32_t r4_2 = 0;
    int32_t r7 = 0;
    do
    {
        int32_t r0_14 = (sub_159b4(arg3) << r4_2);
        r4_2 = (r4_2 + 1);
        r7 = (r7 | r0_14);
    } while (r4_2 != 3);
    int32_t r6_1 = 0;
    if (r7 == 1)
    {
        int32_t r4_4 = 0;
        do
        {
            int32_t r0_19 = (sub_159b4(arg3) << r4_4);
            r4_4 = (r4_4 + 1);
            r6_1 = (r6_1 | r0_19);
        } while (r4_4 != 0x20);
    }
    int32_t r4_3 = 0x10;
    do
    {
        r4_3 = (r4_3 - 1);
        sub_159b4(arg3);
    } while (r4_3 != 0);
    return r6_1;
}

int32_t sub_15c1c(int32_t arg1, int32_t arg2)
{
    sub_15acc(1, 1, arg1, arg2);
    sub_15b7c(1, 3, arg2);
    return sub_15b7c(0, 3, arg2);
}

int32_t sub_15c44(int32_t arg1, int32_t arg2)
{
    sub_15a34(1, arg1);
    return sub_15a34(3, arg2);
}

int32_t sub_15c5c(int32_t arg1)
{
    int32_t r4 = *0x20021750;
    int32_t r2_2 = ((*0x20021754 << 4) | (r4 >> 0x1c));
    *0x20021754 = r2_2;
    int32_t r3 = *0x2002174c;
    int32_t r0 = (arg1 | (r3 << 4));
    *0x2002174c = r0;
    int32_t r4_2 = ((r4 << 4) | (r3 >> 0x1c));
    uint32_t r3_2 = r0;
    *0x20021750 = r4_2;
    if (r3_2 == 0xd52a)
    {
        r0 = sub_15c44(((r0 >> 0x10) | (r4_2 << 0x10)), ((r2_2 << 0x10) | (r4_2 >> 0x10)));
    }
    else if (r3_2 == 0x9205)
    {
        r0 = sub_15c1c(((r0 >> 0x10) | (r4_2 << 0x10)), (r4_2 >> 0x1f));
        *0xe000ed08 = ((((((r4_2 << 8) >> 0x18) + r0) >> ((r4_2 << 1) >> 0x19)) << 8) ^ *0xe000ed08);
    }
    else if (r3_2 == 0x5147)
    {
        r0 = ((r0 >> 0x10) | (r4_2 << 0x10))();
    }
    return r0;
}

int32_t sub_15cf4(int32_t arg1)
{
    int32_t r10_1 = (*0x200218b0 << 1);
    *0x200218b0 = r10_1;
    int32_t r1_1 = ((*0x200217a0 << 1) + 1);
    *0x200217a0 = r1_1;
    int32_t r3_3 = *0x200259e8;
    int32_t var_30 = r3_3;
    int32_t r0 = ((r3_3 << 1) + arg1);
    *0x200259e8 = r0;
    if (r1_1 >= 0x8000)
    {
        if (r10_1 < 0x8000)
        {
            do
            {
                if ((r10_1 >= 0x4000 && r1_1 < 0xc000))
                {
                    *0x200259e8 = (r0 - 0x4000);
                    *0x200218b0 = (0xffffc000 + r10_1);
                    *0x200217a0 = (r1_1 - 0x4000);
                    return r0;
                }
                int16_t* r5_1 = *0x20021228;
                uint32_t r3_5 = r5_1[0xf];
                int32_t r0_5 = sub_163c8();
                int32_t r4_1;
                int32_t r6_1;
                int32_t r7_1;
                if (r0_5 < *r5_1)
                {
                    r4_1 = 0;
                    r6_1 = 0;
                    r7_1 = 0;
                    *0x200217a0 = (sub_163c8() + (r10_1 - 1));
                }
                else
                {
                    int32_t r3_7 = 2;
                    r4_1 = 0;
                    int32_t r1_4;
                    uint32_t r2_2;
                    do
                    {
                        r2_2 = *(r5_1 + r3_7);
                        r1_4 = r4_1;
                        r4_1 = (r4_1 + 1);
                        r6_1 = r3_7;
                        r7_1 = r4_1;
                        r3_7 = (r3_7 + 2);
                    } while (r2_2 <= r0_5);
                    *0x200217a0 = (sub_163c8() + (r10_1 - 1));
                    r5_1[r1_4];
                    *0x200218b0 = (sub_163c8() + r10_1);
                }
                int16_t* r1_7;
                if (r3_5 >= 0x3e80)
                {
                    r4_1 = 0;
                    r1_7 = *0x20021224;
                    *r1_7 = ((*r1_7 >> 1) + 1);
                    r1_7[1] = ((r1_7[1] >> 1) + 1);
                    r1_7[2] = ((r1_7[2] >> 1) + 1);
                    r1_7[3] = ((r1_7[3] >> 1) + 1);
                    r1_7[4] = ((r1_7[4] >> 1) + 1);
                    r1_7[5] = ((r1_7[5] >> 1) + 1);
                    r1_7[6] = ((r1_7[6] >> 1) + 1);
                    r1_7[7] = ((r1_7[7] >> 1) + 1);
                    r1_7[8] = ((r1_7[8] >> 1) + 1);
                    r1_7[9] = ((r1_7[9] >> 1) + 1);
                    r1_7[0xa] = ((r1_7[0xa] >> 1) + 1);
                    r1_7[0xb] = ((r1_7[0xb] >> 1) + 1);
                    r1_7[0xc] = ((r1_7[0xc] >> 1) + 1);
                    r1_7[0xd] = ((r1_7[0xd] >> 1) + 1);
                    r1_7[0xe] = ((r1_7[0xe] >> 1) + 1);
                    r1_7[0xf] = ((r1_7[0xf] >> 1) + 1);
                    *(r1_7 + r6_1) = (*(r1_7 + r6_1) + 0x12c);
                }
                else
                {
                    r1_7 = *0x20021224;
                    *(r1_7 + r6_1) = (*(r1_7 + r6_1) + 0x12c);
                }
                if ((r3_5 >= 0x3e80 || (r3_5 < 0x3e80 && r4_1 <= 0xf)))
                {
                    int32_t r3_15 = (r4_1 + 1);
                    void* r0_14 = (r5_1 - 2);
                    int32_t r4_2 = (r4_1 << 1);
                    while (true)
                    {
                        if (r3_15 == 1)
                        {
                            *r5_1 = *r1_7;
                        }
                        else
                        {
                            *(r5_1 + r4_2) = (*(r0_14 + r4_2) + *(r1_7 + r4_2));
                            if (r3_15 == 0x10)
                            {
                                break;
                            }
                        }
                        r3_15 = (r3_15 + 1);
                        r4_2 = (r4_2 + 2);
                    }
                }
                int32_t r3_19 = (((*0x200217a4 | r7_1) << 4) & 0xff0);
                *0x200217a4 = r3_19;
                int32_t r3_20 = (r3_19 << 1);
                *0x20021224 = (*0x20021220 + r3_20);
                *0x20021228 = (*0x2002122c + r3_20);
                r0 = sub_15c5c(r7_1);
                r1_1 = *0x200217a0;
                if (r1_1 < 0x8000)
                {
                    return r0;
                }
                r10_1 = *0x200218b0;
                r0 = *0x200259e8;
            } while (r10_1 < 0x8000);
        }
        r0 = (r0 - 0x8000);
        *0x200259e8 = r0;
        *0x200218b0 = (0xffff8000 + r10_1);
        *0x200217a0 = (r1_1 - 0x8000);
    }
    return r0;
}

int32_t sub_15f60() __noreturn
{
    int32_t r11;
    int32_t var_18 = r11;
    int32_t r10;
    int32_t var_1c = r10;
    int32_t* r9;
    int32_t* var_20 = r9;
    int32_t r8;
    int32_t var_24 = r8;
    sub_1699c();
    sub_169fc(0x1c);
    int32_t r0;
    int32_t r1;
    r0 = sub_169fc(0xf);
    *0xd0000024 = 0x8000;
    *0x4001c06c = 0x81;
    if (sub_16a4c(r0, r1, 0x81, 0x4001c06c) != 0)
    {
        while ((*0x50200004 & 0x10000) != 0)
        {
            /* nop */
        }
        *0x50200010 = 0x1f0000;
        sub_169dc(0x12c);
        sub_16a2c();
    }
    sub_16a1c();
    sub_1698c(0x1c, 3);
    *0xd0000024 = 0x10000000;
    sub_16a5c(0xf);
    int32_t var_34;
    int32_t var_30;
    int32_t var_2c;
    if (sub_16a6c(0x514c8, &var_34, &var_30, &var_2c) == 0)
    {
        sub_169cc(0x10002948, 0x514c8);
    }
    sub_16a0c(var_34, var_30, var_2c);
    sub_169ac(0x5dc, 0);
    sub_169bc();
    int16_t* r1_3 = *0x20021220;
    int16_t* r6_1 = *0x2002122c;
    if (r1_3 < r6_1)
    {
        int32_t r0_6 = ((r1_3 | r6_1) & 3);
        int16_t* r2_2 = r6_1;
        int32_t* r3_3 = r1_3;
        int32_t r4_2 = ((r6_1 - 1) - r1_3);
        if ((((0 - (0x3e - 0x3e)) & (r0_6 + (0 - r0_6))) == 0 || (((0 - (0x3e - 0x3e)) & (r0_6 + (0 - r0_6))) != 0 && r4_2 <= 0x1f)))
        {
            int16_t* r3_49 = r6_1;
            do
            {
                *r1_3 = 1;
                *r3_49 = 1;
                r1_3[1] = 1;
                r3_49[1] = 2;
                r1_3[2] = 1;
                r3_49[2] = 3;
                r1_3[3] = 1;
                r3_49[3] = 4;
                r1_3[4] = 1;
                r3_49[4] = 5;
                r1_3[5] = 1;
                r3_49[5] = 6;
                r1_3[6] = 1;
                r3_49[6] = 7;
                r1_3[7] = 1;
                r3_49[7] = 8;
                r1_3[8] = 1;
                r3_49[8] = 9;
                r1_3[9] = 1;
                r3_49[9] = 0xa;
                r1_3[0xa] = 1;
                r3_49[0xa] = 0xb;
                r1_3[0xb] = 1;
                r3_49[0xb] = 0xc;
                r1_3[0xc] = 1;
                r3_49[0xc] = 0xd;
                r1_3[0xd] = 1;
                r3_49[0xd] = 0xe;
                r1_3[0xe] = 1;
                r3_49[0xe] = 0xf;
                r1_3[0xf] = 1;
                r1_3 = &r1_3[0x10];
                r3_49[0xf] = 0x10;
                r3_49 = &r3_49[0x10];
            } while (r6_1 > r1_3);
        }
        if ((((0 - (0x3e - 0x3e)) & (r0_6 + (0 - r0_6))) != 0 && r4_2 > 0x1f))
        {
            int32_t r0_8 = 0;
            r1_3 = &data_10001;
            int32_t r4_4 = ((r4_2 >> 5) + 1);
            do
            {
                *r3_3 = 0x10001;
                r3_3[1] = 0x10001;
                r3_3[2] = 0x10001;
                r3_3[3] = 0x10001;
                r3_3[4] = 0x10001;
                r3_3[5] = 0x10001;
                r3_3[6] = 0x10001;
                r3_3[7] = 0x10001;
                *r2_2 = 0x20001;
                *(r2_2 + 4) = 0x40003;
                *(r2_2 + 8) = 0x60005;
                *(r2_2 + 0xc) = 0x80007;
                *(r2_2 + 0x10) = 0xa0009;
                r0_8 = (r0_8 + 1);
                *(r2_2 + 0x14) = 0xc000b;  // {"Xa.K"}
                *(r2_2 + 0x18) = 0xe000d;
                *(r2_2 + 0x1c) = 0x10000f;
                r3_3 = &r3_3[8];
                r2_2 = &r2_2[0x10];
            } while (r0_8 < r4_4);
        }
    }
    sub_169ec(0, r1_3);
    sub_169ec(1);
    uint32_t r2_3 = 0;
    int32_t r1_4 = 0;
    do
    {
        uint32_t r3_23 = r2_3;
        if ((r1_4 << 0x18) < 0)
        {
            r3_23 = (r3_23 ^ 7);
        }
        uint32_t r3_5;
        if ((r3_23 << 0x18) >= 0)
        {
            r3_5 = (r3_23 << 1);
        }
        else
        {
            r3_5 = ((r3_23 << 1) ^ 7);
        }
        uint32_t r3_7 = (r3_5 << 1);
        if (r3_5 < 0)
        {
            r3_7 = (r3_7 ^ 7);
        }
        uint32_t r3_10 = (r3_7 << 1);
        if (r3_7 < 0)
        {
            r3_10 = (r3_10 ^ 7);
        }
        uint32_t r3_13 = (r3_10 << 1);
        if (r3_10 < 0)
        {
            r3_13 = (r3_13 ^ 7);
        }
        uint32_t r3_16 = (r3_13 << 1);
        if (r3_13 < 0)
        {
            r3_16 = (r3_16 ^ 7);
        }
        uint32_t r3_19 = (r3_16 << 1);
        if (r3_16 < 0)
        {
            r3_19 = (r3_19 ^ 7);
        }
        uint32_t r3_21 = (r3_19 << 1);
        if (r3_19 < 0)
        {
            r3_21 = (r3_21 ^ 7);
        }
        *(0x200217b0 + r1_4) = r3_21;
        r1_4 = (r1_4 + 1);
        r2_3 = (r2_3 + 2);
    } while (r1_4 != 0x100);
    sub_2100(&data_6158, 0x5845, sub_16a3c(*0x20021230, 0x1000297c, 0x12f10, 0x20021230), 0x2100, r8, r9)();
    *0xe000e180 = 8;
    *0xe000ed08 = 0xee2f8d10;
    char* r6_2 = *0x20021230;
    void* var_3c = &r6_2[0x10];
    void* var_44 = &r6_2[0x10];
    while (true)
    {
        char* r12_1 = r6_2;
        uint32_t r4_5 = *0x200258b4;
        uint32_t r6_4;
        do
        {
            uint32_t r6_3 = *r12_1;
            r4_5 = (r4_5 - 1);
            *0x200258b4 = r4_5;
            int32_t r2_6 = *0xe000ed08;
            uint32_t r5_13 = ((r2_6 >> 0x18) ^ *(0x200258b8 + r4_5));
            uint32_t r1_6 = ((r2_6 << 8) >> 0x18);
            *0x200259ec = r1_6;
            uint32_t r1_7 = (r1_6 ^ ((r2_6 << 0x10) >> 0x18));
            char r2_10 = (*0x200259ec ^ r1_7);
            char r3_31 = (*0x200259ec ^ r2_10);
            /* unimplemented  {mrs r1, psp} */;
            __msr((*(0x200217b0 + ((r1_7 >> 8) ^ (r2_10 ^ r5_13))) << 8));
            uint32_t r3_35 = *(0x200258b8 + (r3_31 + r4_5));
            *(0x200258b8 + r4_5) = r6_3;
            uint8_t* r3_36 = *0x20021230;
            r6_4 = (r6_3 ^ (r5_13 ^ r3_35));
            *r3_36 = r6_4;
            r12_1 = &r12_1[1];
            *0x20021230 = &r3_36[1];
        } while (r12_1 != var_44);
        r6_2 = var_3c;
        /* unimplemented  {mrs r0, psp} */;
        int32_t r0_11 = (0x200259 ^ r6_4);
        uint32_t r4_7 = r0_11;
        sub_15cf4((r0_11 & 1));
        sub_15cf4(((r4_7 >> 1) & 1));
        /* unimplemented  {mrs r3, psp} */;
        __msr((*(0x200217b0 + ((sub_15cf4(((r4_7 >> 2) & 1)) >> 8) ^ *(*0x20021230 - 1))) << 8));
        var_44 = (var_44 + 0x10);
        var_3c = (var_3c + 0x10);
    }
}

void sub_16314(int32_t* arg1, uint32_t arg2)
{
    char r5 = *0xd0000000;
    while (true)
    {
        int32_t* r2_1 = *arg1;
        /* unimplemented  {mrs r1, primask} */;
        /* unimplemented  {cpsid I} */;
        while (*r2_1 == 0)
        {
            /* nop */
        }
        __dmb_SY();
        if (arg1[1] > 0x7f)
        {
            break;
        }
        int32_t* r3_1 = *arg1;
        __dmb_SY();
        *r3_1 = 0;
        __msr(arg2);
        __wfe();
    }
    arg1[1] = r5;
    int32_t* r3_4 = *arg1;
    __dmb_SY();
    *r3_4 = 0;
    __msr(arg2);
}

int32_t sub_1635c(int32_t* arg1, int32_t* arg2, uint32_t arg3 @ r12)
{
    int32_t* r0 = *arg1;
    /* unimplemented  {mrs r12, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*r0 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    int32_t r2_2 = arg1[1];
    int32_t r0_1;
    if (r2_2 < 0)
    {
        r0_1 = 1;
        arg1[1] = *0xd0000000;
    }
    else if (arg2 == 0)
    {
        r0_1 = 0;
    }
    else
    {
        r0_1 = 0;
        *arg2 = r2_2;
    }
    int32_t* r3 = *arg1;
    __dmb_SY();
    *r3 = 0;
    __msr(arg3);
    return r0_1;
}

void sub_163a0(int32_t* arg1, uint32_t arg2)
{
    int32_t* r2 = *arg1;
    /* unimplemented  {mrs r1, primask} */;
    /* unimplemented  {cpsid I} */;
    while (*r2 == 0)
    {
        /* nop */
    }
    __dmb_SY();
    arg1[1] = 0xff;
    int32_t* r3_2 = *arg1;
    __dmb_SY();
    *r3_2 = 0;
    __msr(arg2);
    __sev();
}

int32_t sub_163c8()
{
    int32_t r0;
    int32_t r1;
    if ((!(TEST_BIT(*0xd0000078, 1))))
    {
        int32_t r4 = *0xd0000060;
        int32_t r5 = *0xd0000064;
        int32_t r7 = *0xd0000074;
        int32_t r6 = *0xd0000070;
        int32_t r0_2;
        void* r2_1;
        r0_2 = sub_163d0(r0, r1, 0xd0000000);
        *(r2_1 + 0x60) = r4;
        *(r2_1 + 0x64) = r5;
        *(r2_1 + 0x74) = r7;
        *(r2_1 + 0x70) = r6;
        return r0_2;
    }
    /* tailcall */
    return sub_163d0(r0, r1, 0xd0000000);
}

void sub_163d0(int32_t arg1, int32_t arg2, void* arg3)
{
    *(arg3 + 0x60) = arg1;
    *(arg3 + 0x64) = arg2;
    if (arg2 != 0)
    {
        *(arg3 + 0x74);
        *(arg3 + 0x70);
        return;
    }
    void* var_8 = arg3;
}

int32_t sub_16414(int32_t arg1, int32_t arg2, int32_t arg3)
{
    int32_t r3;
    if ((TEST_BIT(*0xd0000078, 1)))
    {
        /* tailcall */
        return sub_16484(arg1, arg2, arg3, r3);
    }
    while ((TEST_BIT(*0xd0000078, 0)))
    {
        /* nop */
    }
    int32_t r4 = *0xd0000060;
    int32_t r5_3 = *0xd0000064;
    int32_t r7 = *0xd0000074;
    int32_t r6 = *0xd0000070;
    int32_t r0_1;
    int32_t r2_3;
    r0_1 = sub_16484(arg1, arg2, arg3, r3);
    *0xd0000060 = r4;
    *0xd0000064 = r5_3;
    *0xd0000074 = r7;
    *0xd0000070 = r6;
    return r0_1;
}

int32_t sub_1644c(int32_t arg1, int32_t arg2, int32_t arg3)
{
    int32_t r3;
    if ((TEST_BIT(*0xd0000078, 1)))
    {
        /* tailcall */
        return sub_1650c(arg1, arg2, arg3, r3);
    }
    while ((TEST_BIT(*0xd0000078, 0)))
    {
        /* nop */
    }
    int32_t r4 = *0xd0000060;
    int32_t r5_3 = *0xd0000064;
    int32_t r7 = *0xd0000074;
    int32_t r6 = *0xd0000070;
    int32_t r0_1;
    int32_t r2_3;
    r0_1 = sub_1650c(arg1, arg2, arg3, r3);
    *0xd0000060 = r4;
    *0xd0000064 = r5_3;
    *0xd0000074 = r7;
    *0xd0000070 = r6;
    return r0_1;
}

void sub_16484(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
{
    bool cond:0 = arg4 == 0;
    if (arg4 < 0)
    {
        if (arg2 < 0)
        {
            int32_t r1_11 = (!arg2);
            int32_t r0_6 = (0 - arg1);
            if (0 == arg1)
            {
                r1_11 = (r1_11 + 1);
            }
            int32_t r3_6 = (!arg4);
            int32_t r2_5 = (0 - arg3);
            if (0 == arg3)
            {
                r3_6 = (r3_6 + 1);
            }
            int32_t r0_7;
            int32_t r2_6;
            int32_t r3_7;
            r0_7 = sub_1650c(r0_6, r1_11, r2_5, r3_6);
            return;
        }
        int32_t r3_5 = (!arg4);
        int32_t r2_4 = (0 - arg3);
        if (0 == arg3)
        {
            r3_5 = (r3_5 + 1);
        }
        int32_t r0_4;
        int32_t r1_8;
        r0_4 = sub_1650c(arg1, arg2, r2_4, r3_5);
        return;
    }
    if ((cond:0 && arg3 == 0))
    {
        return;
    }
    if (arg2 >= 0)
    {
        /* tailcall */
        return sub_1650c(arg1, arg2, arg3, arg4);
    }
    int32_t r1_1 = (!arg2);
    int32_t r0_1 = (0 - arg1);
    if (0 == arg1)
    {
        r1_1 = (r1_1 + 1);
    }
    int32_t r0_2;
    int32_t r1_2;
    int32_t r2_1;
    int32_t r3_1;
    r0_2 = sub_1650c(r0_1, r1_1, arg3, arg4);
}

void sub_1650c(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
{
    if (arg2 != 0)
    {
        if (arg4 != 0)
        {
            /* tailcall */
            return sub_166de(arg1, arg2, arg3, arg4);
        }
        int32_t r4;
        int32_t r5;
        int32_t r7;
        if ((arg3 >> 0x10) != 0)
        {
            int32_t var_8_1 = r7;
            int32_t var_10 = r5;
            int32_t var_14 = r4;
            int32_t r12_2 = arg3;
            int32_t r5_4 = 0;
            if ((arg3 >> 0x18) == 0)
            {
                arg3 = (arg3 << 8);
                r5_4 = 8;
            }
            if ((arg3 >> 0x1c) == 0)
            {
                arg3 = (arg3 << 4);
                r5_4 = (r5_4 + 4);
            }
            if ((arg3 >> 0x1e) == 0)
            {
                arg3 = (arg3 << 2);
                r5_4 = (r5_4 + 2);
            }
            if ((arg3 >> 0x1f) == 0)
            {
                arg3 = (arg3 << 1);
                r5_4 = (r5_4 + 1);
            }
            *0xd0000064 = ((arg3 >> 0xf) + 1);
            *0xd0000060 = 0xffffffff;
            int32_t r4_11 = *0xd0000070;
            uint32_t r6_2 = ((r4_11 * (arg2 >> 0x10)) >> 0x10);
            int32_t r3_13 = (r6_2 * arg3);
            int32_t r3_14 = (r3_13 << 0x11);
            int32_t r0_5 = (arg1 - r3_14);
            int32_t r3_16 = (r6_2 * (arg3 >> 0x10));
            int32_t r1_7 = ((arg2 - (r3_13 >> 0xf)) - (r3_16 + r3_16));
            uint32_t r6_5 = ((r4_11 * (r1_7 >> 3)) >> 0x10);
            uint32_t lr_2 = ((r6_2 << 0xd) + r6_5);
            int32_t r3_19 = (r6_5 * arg3);
            int32_t r3_20 = (r3_19 << 4);
            int32_t r0_6 = (r0_5 - r3_20);
            int32_t r3_22 = (r6_5 * (arg3 >> 0x10));
            int32_t r3_23 = (r3_22 << 0x14);  // {"Xa.K"}
            int32_t r0_7 = (r0_6 - r3_23);
            int32_t r1_9 = ((r1_7 - (r3_19 >> 0x1c)) - (r3_22 >> 0xc));
            uint32_t r6_9 = ((r4_11 * ((r0_7 >> 0x16) | (r1_9 << 0xa))) >> 0x10);  // {".K"}
            if (r5_4 < 9)
            {
                int32_t r7_12 = (9 - r5_4);
                uint32_t r6_15 = (r6_9 >> r7_12);
                int32_t r2_9 = (r6_15 * r12_2);
                int32_t r0_12 = (r0_7 - r2_9);
                if (r0_7 < r2_9)
                {
                    r1_9 = (r1_9 - 1);
                }
                int32_t r2_11 = (r6_15 * (r12_2 >> 0x10));
                int32_t r2_12 = (r2_11 << 0x10);
                int32_t r2_13 = (r0_12 - r2_12);
                int32_t r3_28 = (r1_9 - (r2_11 >> 0x10));
                uint32_t r1_14 = (lr_2 >> (r7_12 + 0x13));  // {"aXa.K"}
                uint32_t r0_14 = (lr_2 << (r5_4 + 4));
                uint32_t r0_15 = (r0_14 + r6_15);
                if ((r0_14 + r6_15) >= r0_14)
                {
                    r1_14 = (r1_14 + 1);
                }
                if (r3_28 != 0)
                {
                    while (true)
                    {
                        uint32_t temp9_1 = r0_15;
                        r0_15 = (r0_15 + 1);
                        if (temp9_1 < 0xffffffff)
                        {
                            r1_14 = (r1_14 + 1);
                        }
                        int32_t temp10_1 = r2_13;
                        r2_13 = (r2_13 - r12_2);
                        if (temp10_1 < r12_2)
                        {
                            int32_t temp12_1 = r3_28;
                            r3_28 = (r3_28 - 1);
                            if (temp12_1 == 1)
                            {
                                break;
                            }
                        }
                    }
                    goto label_166ce;
                }
                if (r2_13 < r12_2)
                {
                    return;
                }
                do
                {
                    uint32_t temp11_1 = r0_15;
                    r0_15 = (r0_15 + 1);
                    if (temp11_1 < 0xffffffff)
                    {
                        r1_14 = (r1_14 + 1);
                    }
                    r2_13 = (r2_13 - r12_2);
                label_166ce:
                } while (r2_13 >= r12_2);
                return;
            }
            int32_t r0_8 = (r0_7 - (r6_9 * (arg3 >> 9)));
            uint32_t r6_13 = (((r4_11 * (r0_8 >> 9)) >> 0x10) >> (0x16 - r5_4));  // {".K"}
            uint32_t r7_10 = (((r6_9 << 0xd) >> (0x16 - r5_4)) + r6_13);  // {".K"}
            int32_t r2_7 = (r0_8 - (r12_2 * r6_13));
            uint32_t r1_11 = (lr_2 >> ((0x16 - r5_4) + 6));  // {".K"}
            uint32_t r0_10 = (lr_2 << (r5_4 + 4));
            uint32_t r0_11 = (r0_10 + r7_10);
            if ((r0_10 + r7_10) >= r0_10)
            {
                goto label_16668;
            }
            while (r2_7 >= r12_2)
            {
                r2_7 = (r2_7 - r12_2);
                uint32_t temp8_1 = r0_11;
                r0_11 = (r0_11 + 1);
                if (temp8_1 < 0xffffffff)
                {
                label_16668:
                    r1_11 = (r1_11 + 1);
                }
            }
            return;
        }
        if (arg3 != 0)
        {
            int32_t var_4 = r7;
            *0xd0000060 = arg2;
            *0xd0000064 = arg3;
            int32_t var_8 = r5;
            int32_t __saved_r6 = r4;
            *0xd0000070;
            *0xd0000060 = ((*0xd0000074 << 0x10) | (arg1 >> 0x10));
            *0xd0000064 = arg3;
            *0xd0000070;
            *0xd0000060 = ((*0xd0000074 << 0x10) | arg1);
            *0xd0000064 = arg3;
            *0xd0000074;
            *0xd0000070;
            return;
        }
    }
    else
    {
        if (arg4 != 0)
        {
            return;
        }
        if (arg3 != 0)
        {
            *0xd0000060 = arg1;
            *0xd0000064 = arg3;
            *0xd0000074;
            *0xd0000070;
            return;
        }
    }
}

int32_t sub_166de(int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
{
    if ((arg4 >> 0x10) == 0)
    {
        int32_t var_18 = arg4;
        int32_t var_1c = arg3;
        int32_t r5 = 0;
        if ((arg4 >> 8) == 0)
        {
            arg4 = ((arg4 << 8) | (arg3 >> 0x18));
            arg3 = (arg3 << 8);
            r5 = 8;
        }
        if ((arg4 >> 0xc) == 0)
        {
            arg4 = ((arg4 << 4) | (arg3 >> 0x1c));
            arg3 = (arg3 << 4);
            r5 = (r5 + 4);
        }
        if ((arg4 >> 0xe) == 0)
        {
            arg4 = ((arg4 << 2) | (arg3 >> 0x1e));
            arg3 = (arg3 << 2);
            r5 = (r5 + 2);
        }
        if ((arg4 >> 0xf) == 0)
        {
            int32_t temp2_1 = arg3;
            int32_t temp3_1 = arg3;
            arg3 = (arg3 + arg3);
            arg4 = (arg4 + arg4);
            r5 = (r5 + 1);
        }
        *0xd0000064 = ((arg4 + arg4) + 1);
        *0xd0000060 = 0xffffffff;
        int32_t r4_8 = *0xd0000070;
        uint32_t r6_6 = ((r4_8 * (arg2 >> 0x10)) >> 0x10);
        uint32_t r7 = (r6_6 << 0xd);
        int32_t r7_2 = (r6_6 * arg3);
        int32_t r0 = (arg1 - r7_2);
        if (arg1 < r7_2)
        {
            arg2 = (arg2 - 1);
        }
        int32_t r0_1 = (r0 - r7_2);
        if (r0 < r7_2)
        {
            arg2 = (arg2 - 1);
        }
        int32_t r7_4 = (r6_6 * arg4);
        int32_t r7_6 = (r6_6 * (arg3 >> 0x10));
        int32_t r6_7 = (r7_6 << 0x11);
        int32_t r0_2 = (r0_1 - r6_7);
        int32_t r1_2 = (((arg2 - r7_4) - r7_4) - (r7_6 >> 0xf));
        uint32_t r6_10 = ((r4_8 * (r1_2 >> 3)) >> 0x10);
        uint32_t r6_15;
        uint32_t r7_19;
        if (r5 < 0xc)
        {
            r6_15 = (r6_10 >> (0xc - r5));
            uint32_t r7_24 = ((r7 >> 0xd) << r5);
            r7_19 = (r7_24 + r7_24);
        }
        else
        {
            uint32_t lr_1 = (r7 + r6_10);
            int32_t r2_1 = ((arg3 >> 0xc) | (arg4 << 0x14));  // {"Xa.K"}
            uint16_t r3_3 = (arg4 >> 0xc);
            int32_t r7_10 = (r6_10 * r2_1);
            int32_t r0_3 = (r0_2 - r7_10);
            if (r0_2 < r7_10)
            {
                r1_2 = (r1_2 - 1);
            }
            int32_t r7_14 = (r6_10 * (r2_1 >> 0x10));
            int32_t r6_11 = (r7_14 << 0x10);
            r0_2 = (r0_3 - r6_11);
            r1_2 = ((r1_2 - (r6_10 * r3_3)) - (r7_14 >> 0x10));
            r6_15 = ((r4_8 * ((r0_2 >> 0x16) | (r1_2 << 0xa))) >> (0x29 - r5));  // {".K"}
            r7_19 = (lr_1 << (r5 - 0xc));
        }
        uint32_t r7_20 = (r7_19 + r6_15);
        int32_t r2_3 = (r6_15 * var_1c);
        int32_t r0_4 = (r0_2 - r2_3);
        int32_t r2_5 = (r6_15 * (var_1c >> 0x10));
        int32_t r2_6 = (r2_5 << 0x10);
        int32_t r0_5 = (r0_4 - r2_6);
        int32_t r1_5 = ((r1_2 - (r6_15 * var_18)) - (r2_5 >> 0x10));
        int32_t temp13_1;
        bool c_7;
        bool cond:1_1;
        do
        {
            r7_20 = (r7_20 + 1);
            int32_t temp12_1 = r0_5;
            r0_5 = (r0_5 - var_1c);
            c_7 = temp12_1 < var_1c;
            temp13_1 = r1_5;
            cond:1_1 = (!c_7);
            r1_5 = (temp13_1 - var_18);
        } while ((!((temp13_1 - var_18) < temp13_1 || ((temp13_1 - var_18) == temp13_1 && c_7))));
        return (r7_20 - 1);
    }
    int32_t r4_10 = 0;
    int32_t r5_3 = (arg4 + 1);
    if (arg4 != 0xffffffff)
    {
        *0xd0000064 = r5_3;
        *0xd0000060 = arg2;
        r4_10 = *0xd0000070;
    }
    int32_t r5_5 = (r4_10 * arg3);
    int32_t r0_7 = (arg1 - r5_5);
    int32_t r5_7 = (r4_10 * (arg3 >> 0x10));
    int32_t r5_8 = (r5_7 << 0x10);
    int32_t r0_8 = (r0_7 - r5_8);
    int32_t r1_8 = ((arg2 - (r4_10 * arg4)) - (((r4_10 * (arg4 >> 0x10)) << 0x10) | (r5_7 >> 0x10)));
    bool cond:0 = r1_8 != arg4;
    if (r1_8 >= arg4)
    {
        while ((!((!cond:0) && r0_8 < arg3)))
        {
            int32_t temp4_1 = r0_8;
            r0_8 = (r0_8 - arg3);
            r1_8 = (r1_8 - arg4);
            r4_10 = (r4_10 + 1);
            cond:0 = r1_8 != arg4;
            if (r1_8 < arg4)
            {
                break;
            }
        }
    }
    return r4_10;
}

void sub_16848()
{
    if (*0x200259f0 == 0)
    {
        int32_t* r3_1 = 0x10000000;
        do
        {
            r3_1[0x4008589] = *r3_1;
            r3_1 = &r3_1[1];
        } while (r3_1 != 0x10000100);
        *0x200259f0 = 1;
    }
}

int32_t sub_16878(int32_t arg1, int32_t arg2, int32_t arg3)
{
    return 0x20021625(arg1, arg2, arg3, 0x20021625);
}

int32_t sub_16888()
{
    *0x4001900c = (0x300 & (!*0x4001800c));
}

int32_t sub_168a0()
{
    *0x4001900c = ((0x200 ^ *0x4001800c) & 0x300);
}

int32_t sub_168c0(int32_t* arg1, char* arg2, int32_t arg3)
{
    int32_t* r9_1 = arg1;
    char* r6_1 = arg2;
    int32_t r4 = arg3;
    int32_t r0;
    int32_t r2;
    int32_t r8;
    r0 = sub_2100(&data_6158, 0x4649, arg3, 0x2100, r8, r9_1);
    int32_t r0_1;
    int32_t r2_1;
    r0_1 = sub_2100(&data_6158, 0x5845, r2, 0x2100, r8, r9_1);
    int32_t r0_2 = sub_2100(&data_6158, 0x4346, r2_1, 0x2100, r8, r9_1);
    sub_16848();
    r0();
    int32_t r0_3;
    int32_t r1;
    r0_3 = r0_1();
    sub_168a0();
    if (r4 != 0)
    {
        int32_t r2_2 = r4;
        r0_3 = 2;
        r1 = 0x18000000;
        int32_t r3_5;
        do
        {
            int32_t r3_1 = *0x18000028;
            int32_t r5_1 = (8 & r3_1);
            if (((2 & r3_1) != 0 && r4 != 0))
            {
                if ((r2_2 - r4) > 0xd)
                {
                    if (r5_1 == 0)
                    {
                        continue;
                    }
                    if ((r5_1 != 0 && r2_2 == 0))
                    {
                        continue;
                    }
                    goto label_16960;
                }
                r4 = (r4 - 1);
                *0x18000060 = *r9_1;
                r9_1 = (r9_1 + 1);
            }
            r3_5 = r4;
            if (r5_1 == 0)
            {
                r3_5 = (r3_5 | r2_2);
            }
            else if (r2_2 != 0)
            {
            label_16960:
                r2_2 = (r2_2 - 1);
                *r6_1 = *0x18000060;
                r6_1 = &r6_1[1];
                r3_5 = (r2_2 | r4);
            }
        } while (r3_5 != 0);
    }
    sub_16888();
    int32_t r0_4;
    int32_t r1_1;
    int32_t r2_3;
    r0_4 = r0_2(r0_3, r1);
    return sub_16878(r0_4, r1_1, r2_3);
}

int32_t sub_16984()
{
    return;
}

int32_t sub_1698c()
{
    /* jump -> 0x10000979 */
}

int32_t sub_1699c()
{
    /* jump -> 0x10000319 */
}

int32_t sub_169ac()
{
    /* jump -> 0x10001fad */
}

int32_t sub_169bc()
{
    /* jump -> 0x1000070d */
}

int32_t sub_169cc()
{
    /* jump -> 0x10001ab9 */
}

int32_t sub_169dc()
{
    /* jump -> 0x10001305 */
}

int32_t sub_169ec()
{
    /* jump -> 0x10000631 */
}

int32_t sub_169fc()
{
    /* jump -> 0x10000999 */
}

int32_t sub_16a0c()
{
    /* jump -> 0x10000731 */
}

int32_t sub_16a1c()
{
    /* jump -> 0x10000415 */
}

int32_t sub_16a2c()
{
    /* jump -> 0x100003cd */
}

int32_t sub_16a3c()
{
    /* jump -> 0x10002361 */
}

int32_t sub_16a4c()
{
    /* jump -> 0x10002031 */
}

int32_t sub_16a5c()
{
    /* jump -> 0x10001f81 */
}

int32_t sub_16a6c()
{
    /* jump -> 0x100007a9 */
}

int32_t sub_16a7c(int32_t arg1, int32_t arg2, void* arg3, void* arg4 @ r6, 
    int32_t arg5 @ r7)
{
    /* jump -> *(arg3 + 4) */
}

