# The census of float_compares_zig_aarch64_O2g: what `aa; pdd` renders for each function `afl` lists.
# Regenerate with `scripts/census.py golden` when `afl` moves, then bless.

NAME=afl
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=afl
EXPECT=<<EOF
0x010104f0    1     52 sym._start
0x01010528    1     16 sym.below
0x01010538    1     12 sym.not_below
0x01010544    1     12 sym.floor_at
0x01010550    1     20 sym.ordered_or_equal
0x01010564    1    104 sym.main
0x010105cc    4    116 sym.__libc_csu_init
0x01010640    1      4 sym.__libc_csu_fini
0x01010670    1     16 sym.imp.__libc_start_main
0x01010680    1     16 sym.imp.abort
EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x010104f0
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x010104f0
EXPECT=<<EOF
void _start(uint64_t arg0)
{
    /* r2dec proof: 2 constructs are marked below; 22 source obligations: 0 rendered, 3 elided, 0 refused, 19 residual; 0 statements rendered; 1 callee prototype supplied by the source */
    {
        r2sleigh_residual_void(1); /* r2dec gap: CallNotRendered at 0x10104f0:24 covering 1 op (render::values): call to __libc_start_main: an argument has no C spelling */
        r2sleigh_residual_void(2); /* r2dec gap: TransferNotFollowed at 0x10104f0 (render::control) */
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010528
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010528
EXPECT=<<EOF
int32_t below(double a, double b)
{
    /* r2dec proof: no individual construct is marked; 10 source obligations: 10 rendered, 0 elided, 0 refused; 1 statements rendered */
    {
        return (int32_t)((uint8_t)((uint32_t)((uint8_t)((uint32_t)(uint8_t)r2sleigh_float_isnan_64(a) | (uint32_t)(uint8_t)r2sleigh_float_isnan_64(b)) ? (uint8_t)0U : (uint8_t)(a < b)) ^ (uint32_t)(uint8_t)1U) ? (uint32_t)2U : (uint32_t)1U);
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010538
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010538
EXPECT=<<EOF
int32_t not_below(double a, double b)
{
    /* r2dec proof: no individual construct is marked; 10 source obligations: 10 rendered, 0 elided, 0 refused; 1 statements rendered */
    {
        return (int32_t)(uint8_t)((uint32_t)((uint8_t)((uint32_t)(uint8_t)r2sleigh_float_isnan_64(a) | (uint32_t)(uint8_t)r2sleigh_float_isnan_64(b)) ? (uint8_t)0U : (uint8_t)(a < b)) ^ (uint32_t)(uint8_t)1U);
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010544
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010544
EXPECT=<<EOF
double floor_at(double x, double lo)
{
    uint8_t tmp_1010544_2_1;

    /* r2dec proof: no individual construct is marked; 12 source obligations: 12 rendered, 0 elided, 0 refused; 2 statements rendered */
    {
        tmp_1010544_2_1 = (uint8_t)((uint32_t)(uint8_t)r2sleigh_float_isnan_64(x) | (uint32_t)(uint8_t)r2sleigh_float_isnan_64(lo));
        return (double)r2sleigh_float_from_bits_64((uint8_t)((uint8_t)(tmp_1010544_2_1 ? (uint8_t)0U : (uint8_t)(x < lo)) == (uint8_t)tmp_1010544_2_1) ? (uint64_t)r2sleigh_float_to_bits_64(x) : (uint64_t)r2sleigh_float_to_bits_64(lo));
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010550
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010550
EXPECT=<<EOF
int32_t ordered_or_equal(double a, double b)
{
    /* r2dec proof: no individual construct is marked; 14 source obligations: 14 rendered, 0 elided, 0 refused; 1 statements rendered */
    {
        return (int32_t)((uint8_t)((uint32_t)((uint8_t)((uint32_t)(uint8_t)r2sleigh_float_isnan_64(a) | (uint32_t)(uint8_t)r2sleigh_float_isnan_64(b)) ? (uint8_t)0U : (uint8_t)(a == b)) | (uint32_t)(uint8_t)((uint32_t)((uint8_t)((uint32_t)(uint8_t)r2sleigh_float_isnan_64(a) | (uint32_t)(uint8_t)r2sleigh_float_isnan_64(b)) ? (uint8_t)1U : (uint8_t)(b <= a)) ^ (uint32_t)(uint8_t)1U)) ? (uint32_t)3U : (uint32_t)4U);
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010564
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010564
EXPECT=<<EOF
struct r2sleigh_bits_256 {
    uint8_t bytes[32];
};

static inline uint64_t r2sleigh_bits_extract_256_64(struct r2sleigh_bits_256 carrier, uint64_t at)
{
    uint64_t field = 0;
    for (uint32_t bit = 0; bit < 64u; ++bit) {
        const uint64_t from = at + bit;
        if (from < 256u && ((carrier.bytes[from / 8] >> (from % 8)) & 1) != 0) {
            field = (uint64_t)(field | ((uint64_t)1 << bit));
        }
    }
    return field;
}

static inline struct r2sleigh_bits_256 r2sleigh_bits_zero_extend_64_256(uint64_t field)
{
    struct r2sleigh_bits_256 carrier = {{0}};
    for (uint32_t bit = 0; bit < 64u; ++bit) {
        if (((field >> bit) & 1) != 0) {
            carrier.bytes[bit / 8] = (uint8_t)(carrier.bytes[bit / 8] | (1u << (bit % 8)));
        }
    }
    return carrier;
}

int32_t main(int32_t argc, char** argv)
{
    int32_t below(double, double);
    double floor_at(double, double);
    int32_t not_below(double, double);
    int32_t ordered_or_equal(double, double);

    double tmp_lane_1010574_0_1_1;
    uint64_t x0_1;
    uint64_t x0_2;
    struct r2sleigh_bits_256 z0_13;
    uint64_t tmp_lane_10105a4_0_0_1;
    uint64_t x0_3;

    /* r2dec proof: 1 construct is marked below; 39 source obligations: 29 rendered, 8 elided, 0 refused, 2 residual; 7 statements rendered; 4 callee prototypes supplied by the source */
    {
        tmp_lane_1010574_0_1_1 = (double)(int32_t)argc;
        x0_1 = (uint64_t)(uint32_t)below(tmp_lane_1010574_0_1_1, r2sleigh_float_from_bits_64((uint64_t)0x4000000000000000U));
        x0_2 = (uint64_t)(uint32_t)not_below(tmp_lane_1010574_0_1_1, r2sleigh_float_from_bits_64((uint64_t)0x3fe0000000000000U));
        z0_13 = r2sleigh_bits_zero_extend_64_256((uint64_t)r2sleigh_float_to_bits_64(floor_at(tmp_lane_1010574_0_1_1, r2sleigh_float_from_bits_64((uint64_t)0x3ff0000000000000U))));
        tmp_lane_10105a4_0_0_1 = r2sleigh_bits_extract_256_64(z0_13, 0U);
        x0_3 = (uint64_t)(uint32_t)ordered_or_equal(tmp_lane_1010574_0_1_1, r2sleigh_float_from_bits_64((uint64_t)0x4008000000000000U));
        return (int32_t)((uint32_t)((uint64_t)x0_3 >> 0U) + (uint32_t)((uint32_t)((uint32_t)((uint64_t)x0_1 >> 0U) + (uint32_t)((uint64_t)x0_2 >> 0U)) + (uint32_t)(r2sleigh_float_from_bits_64(tmp_lane_10105a4_0_0_1) > -2147483649.0 && r2sleigh_float_from_bits_64(tmp_lane_10105a4_0_0_1) < 2147483648.0 ? (int32_t)r2sleigh_float_from_bits_64(tmp_lane_10105a4_0_0_1) : r2sleigh_residual_i32(1))));
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x010105cc
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x010105cc
EXPECT=<<EOF
void __libc_csu_init(int32_t argc, char** argv, char** envp)
{
    /* r2dec proof: no individual construct is marked; 17 source obligations: 2 rendered, 15 elided, 0 refused; 1 statements rendered */
    {
        {
            return;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010640
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010640
EXPECT=<<EOF
void __libc_csu_fini(void)
{
    /* r2dec proof: no individual construct is marked; 1 source obligations: 1 rendered, 0 elided, 0 refused; 1 statements rendered */
    {
        return;
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010670
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010670
EXPECT=<<EOF
/* r2sleigh: import stub at 0x1010670; this symbol is the import `__libc_start_main` and has no body of its own. */
extern int32_t __libc_start_main(void(*)(), int32_t, char**, void(*)(), void(*)(), void(*)(), void*);

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x01010680
FILE=tests/fixtures/float_compares_zig_aarch64_O2g
CMDS=aa; pdd @ 0x01010680
EXPECT=<<EOF
/* r2sleigh: import stub at 0x1010680; this symbol is the import `abort` and has no body of its own. */
extern void abort(void);

EOF
EXPECT_ERR=<<EOF
EOF
RUN
