Fixture 197

homogeneous float aggregates

C · 11 functions · 4 lanes · 31 of 44 function-lanes behave identically

4 of 4 lanes have a function that returns a different result after decompilation: clang-O2 (5/11), gcc-O2 (6/11), clang-O0 (10/11), gcc-O0 (10/11).

Aggregates whose members are ALL floating point — the return class 195 left out, and the one where the two ABIs we test disagree the most.

195_by_value_aggregates covers SysV's INTEGER (rax), INTEGER-pair (rax:rdx), split-bank (rax + xmm0) and MEMORY classes. It has no all-SSE case, so nothing in the corpus returns a value in xmm0:xmm1 — TWO SSE registers holding ONE value, which is a distinct contract from the split case and from a scalar double.

The same four shapes are a completely different mechanism on AArch64, and the corpus has no lane for that at all: AAPCS64 returns a *homogeneous float aggregate* (2-4 members, all the same float type) in consecutive SIMD registers, so {float,float,float,float} comes back in s0-s3 — four registers, one value — where SysV packs the same struct into two xmms at two floats apiece. A recovery that models "the float result" as a single register is wrong on both, in different ways, and no existing fixture can say so.

struct SysV x86-64 AAPCS64 {double,double} 16B SSE,SSE -> xmm0:xmm1 HFA(2xdouble) -> d0:d1 {float x4} 16B SSE,SSE -> xmm0:xmm1 HFA(4xfloat) -> s0:s1:s2:s3 {float x3} 12B SSE,SSE -> xmm0:xmm1 HFA(3xfloat) -> s0:s1:s2 {float,int32_t} 8B INTEGER -> rax not an HFA -> x0

The 12-byte case is deliberately not a multiple of the register width: SysV puts a,b in xmm0 and c alone in the low half of xmm1, so a recovery that assumes both eightbytes are full reads a fourth field that does not exist.

hfa197_tagged_control is the negative that makes the rest mean something: it CONTAINS a float but is not homogeneous, so both ABIs return it in an INTEGER register. A decompiler that routes "aggregate containing floating point" to the SSE bank satisfies every positive case here and fails only this one. hfa197_scalar_control is the second negative: an ordinary double return occupies xmm0/d0 ALONE and must not acquire a second result register.

As in 195, the aggregate-returning helpers are exercised THROUGH callers that return int32_t, because the harness rebuilds one function at a time against extern callees — so a caller's recovered C has to get the return ABI right to call its helper at all. Each caller also witnesses the individual members in a caller-owned buffer with DISTINCT coefficients, so recovering the right total from permuted members is caught rather than passing by luck.

Every value is a small integer converted to float/double, so it is exactly representable in both widths and the differential compares exact values rather than excess-precision artifacts.

tests/decompiler_fixtures/src/197_homogeneous_float_aggregates.c source
#include <stdint.h>

/* Aggregates whose members are ALL floating point — the return class `195` left
 * out, and the one where the two ABIs we test disagree the most.
 *
 * `195_by_value_aggregates` covers SysV's INTEGER (`rax`), INTEGER-pair
 * (`rax:rdx`), split-bank (`rax` + `xmm0`) and MEMORY classes. It has no
 * all-SSE case, so nothing in the corpus returns a value in `xmm0:xmm1` — TWO
 * SSE registers holding ONE value, which is a distinct contract from the split
 * case and from a scalar `double`.
 *
 * The same four shapes are a completely different mechanism on AArch64, and the
 * corpus has no lane for that at all: AAPCS64 returns a *homogeneous float
 * aggregate* (2-4 members, all the same float type) in consecutive SIMD
 * registers, so `{float,float,float,float}` comes back in `s0`-`s3` — four
 * registers, one value — where SysV packs the same struct into two `xmm`s at two
 * floats apiece. A recovery that models "the float result" as a single register
 * is wrong on both, in different ways, and no existing fixture can say so.
 *
 *   struct                     SysV x86-64            AAPCS64
 *   {double,double}      16B   SSE,SSE  -> xmm0:xmm1  HFA(2xdouble) -> d0:d1
 *   {float x4}           16B   SSE,SSE  -> xmm0:xmm1  HFA(4xfloat)  -> s0:s1:s2:s3
 *   {float x3}           12B   SSE,SSE  -> xmm0:xmm1  HFA(3xfloat)  -> s0:s1:s2
 *   {float,int32_t}       8B   INTEGER  -> rax        not an HFA    -> x0
 *
 * The 12-byte case is deliberately not a multiple of the register width: SysV
 * puts `a`,`b` in `xmm0` and `c` alone in the low half of `xmm1`, so a recovery
 * that assumes both eightbytes are full reads a fourth field that does not
 * exist.
 *
 * `hfa197_tagged_control` is the negative that makes the rest mean something: it
 * CONTAINS a float but is not homogeneous, so both ABIs return it in an INTEGER
 * register. A decompiler that routes "aggregate containing floating point" to
 * the SSE bank satisfies every positive case here and fails only this one.
 * `hfa197_scalar_control` is the second negative: an ordinary `double` return
 * occupies `xmm0`/`d0` ALONE and must not acquire a second result register.
 *
 * As in `195`, the aggregate-returning helpers are exercised THROUGH callers
 * that return `int32_t`, because the harness rebuilds one function at a time
 * against extern callees — so a caller's recovered C has to get the return ABI
 * right to call its helper at all. Each caller also witnesses the individual
 * members in a caller-owned buffer with DISTINCT coefficients, so recovering the
 * right total from permuted members is caught rather than passing by luck.
 *
 * Every value is a small integer converted to `float`/`double`, so it is exactly
 * representable in both widths and the differential compares exact values rather
 * than excess-precision artifacts. */

#define HFA197_SLOT_A 0
#define HFA197_SLOT_B 1
#define HFA197_SLOT_C 2
#define HFA197_SLOT_D 3

struct hfa197_pair2d {  /* 16 bytes, SSE,SSE -> xmm0:xmm1 / HFA -> d0:d1 */
    double x;
    double y;
};

struct hfa197_quad4f {  /* 16 bytes, SSE,SSE -> xmm0:xmm1 / HFA -> s0..s3 */
    float a;
    float b;
    float c;
    float d;
};

struct hfa197_trio3f {  /* 12 bytes: xmm1 is HALF used / HFA -> s0..s2 */
    float a;
    float b;
    float c;
};

struct hfa197_tagged {  /* 8 bytes, NOT homogeneous -> rax / x0 */
    float value;
    int32_t tag;
};

__attribute__((noinline)) struct hfa197_pair2d hfa197_make_pair2d(int32_t seed) {
    struct hfa197_pair2d p;
    p.x = (double)(seed + 1);
    p.y = (double)(seed * 2);
    return p;
}

__attribute__((noinline)) struct hfa197_quad4f hfa197_make_quad4f(int32_t seed) {
    struct hfa197_quad4f q;
    q.a = (float)(seed + 1);
    q.b = (float)(seed + 2);
    q.c = (float)(seed * 3);
    q.d = (float)(seed * 5);
    return q;
}

__attribute__((noinline)) struct hfa197_trio3f hfa197_make_trio3f(int32_t seed) {
    struct hfa197_trio3f t;
    t.a = (float)(seed + 1);
    t.b = (float)(seed * 2);
    t.c = (float)(seed * 4);
    return t;
}

__attribute__((noinline)) struct hfa197_tagged hfa197_make_tagged(int32_t seed) {
    struct hfa197_tagged t;
    t.value = (float)(seed + 3);
    t.tag = seed * 2;
    return t;
}

/* An ordinary scalar `double` return: ONE result register, no pair. */
__attribute__((noinline)) double hfa197_make_scalar(int32_t seed) {
    return (double)(seed * 6 + 1);
}

/* A homogeneous float aggregate as an ARGUMENT, which is the mirror case: the
 * members arrive in consecutive SIMD registers rather than packed into one. */
__attribute__((noinline)) int32_t hfa197_consume_pair2d(struct hfa197_pair2d p) {
    return (int32_t)p.x * 3 + (int32_t)p.y;
}

__attribute__((noinline)) int32_t hfa197_pair2d_roundtrip(int32_t *scratch, int32_t seed) {
    struct hfa197_pair2d p;
    if (scratch == 0) {
        return -1;
    }
    p = hfa197_make_pair2d(seed);
    scratch[HFA197_SLOT_A] = (int32_t)p.x;
    scratch[HFA197_SLOT_B] = (int32_t)p.y;
    /* Reads BOTH halves of a value the ABI split across two SSE registers. */
    return hfa197_consume_pair2d(p);
}

__attribute__((noinline)) int32_t hfa197_quad4f_roundtrip(int32_t *scratch, int32_t seed) {
    struct hfa197_quad4f q;
    if (scratch == 0) {
        return -1;
    }
    q = hfa197_make_quad4f(seed);
    scratch[HFA197_SLOT_A] = (int32_t)q.a;
    scratch[HFA197_SLOT_B] = (int32_t)q.b;
    scratch[HFA197_SLOT_C] = (int32_t)q.c;
    scratch[HFA197_SLOT_D] = (int32_t)q.d;
    /* Distinct coefficients: a member permutation changes this. On SysV `a`,`b`
     * share one xmm and `c`,`d` share the other, so a half-register mix-up is
     * observable here and nowhere else in the corpus. */
    return (int32_t)q.a + (int32_t)q.b * 3 + (int32_t)q.c * 5 + (int32_t)q.d * 7;
}

__attribute__((noinline)) int32_t hfa197_trio3f_roundtrip(int32_t *scratch, int32_t seed) {
    struct hfa197_trio3f t;
    if (scratch == 0) {
        return -1;
    }
    /* 12 bytes: the second eightbyte is HALF occupied. A recovery that assumes a
     * full pair reads a fourth member that was never stored. */
    t = hfa197_make_trio3f(seed);
    scratch[HFA197_SLOT_A] = (int32_t)t.a;
    scratch[HFA197_SLOT_B] = (int32_t)t.b;
    scratch[HFA197_SLOT_C] = (int32_t)t.c;
    return (int32_t)t.a + (int32_t)t.b * 3 + (int32_t)t.c * 5;
}

/* CONTROL: contains a float, but is NOT homogeneous, so both ABIs return it in
 * an INTEGER register. A decompiler that routes "aggregate containing floating
 * point" to the SSE bank passes every case above and fails exactly here. */
__attribute__((noinline)) int32_t hfa197_tagged_control(int32_t *scratch, int32_t seed) {
    struct hfa197_tagged t;
    if (scratch == 0) {
        return -1;
    }
    t = hfa197_make_tagged(seed);
    scratch[HFA197_SLOT_A] = (int32_t)t.value;
    scratch[HFA197_SLOT_B] = t.tag;
    return (int32_t)t.value * 3 + t.tag;
}

/* CONTROL: a plain `double` return occupies ONE result register. It must not
 * acquire a second one just because the fixture around it returns pairs. */
__attribute__((noinline)) int32_t hfa197_scalar_control(int32_t *scratch, int32_t seed) {
    double v;
    if (scratch == 0) {
        return -1;
    }
    v = hfa197_make_scalar(seed);
    scratch[HFA197_SLOT_A] = (int32_t)v;
    scratch[HFA197_SLOT_B] = (int32_t)v * 2;
    return (int32_t)v * 3 + 1;
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

clang -O2

5/11
hfa197_consume_pair2d structural 6 lines
// glaurung: hfa197_consume_pair2d @ 0x1210
int hfa197_consume_pair2d(double arg0, double arg1) {
    long var0;
    var0 = (int)(arg0);
    return (unsigned int)(((int)(arg1) + (unsigned long)((unsigned int)((var0 + (var0 * 2))))));
}
hfa197_make_pair2d fail 4 lines
// glaurung: hfa197_make_pair2d @ 0x1160
double hfa197_make_pair2d(int arg0) {
    return (double)((int)((unsigned long)((unsigned int)((arg0 + 1)))));
}
hfa197_make_quad4f fail 6 lines
// glaurung: hfa197_make_quad4f @ 0x1170
long hfa197_make_quad4f(int arg0) {
    /* asm: cvtdq2ps */
    /* asm: unpckhpd */
    return ((2 + (unsigned long)((unsigned int)(arg0))) | (1 + (unsigned long)((unsigned int)(arg0))));
}
hfa197_make_scalar pass 6 lines
// glaurung: hfa197_make_scalar @ 0x1200
double hfa197_make_scalar(int32_t arg0) {
    int var0;
    var0 = (arg0 + arg0);
    return (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) + ((unsigned long)((unsigned int)(var0)) * 2)))) | 1)))));
}
hfa197_make_tagged pass 4 lines
// glaurung: hfa197_make_tagged @ 0x11e0
unsigned long hfa197_make_tagged(int32_t arg0) {
    return ((unsigned long)((unsigned int)(((union { unsigned int bits; float value; }){ .value = (float)((int)((unsigned long)((unsigned int)((arg0 + 3))))) }).bits)) | ((unsigned long)((unsigned int)(arg0)) << 33));
}
hfa197_make_trio3f fail 5 lines
// glaurung: hfa197_make_trio3f @ 0x11c0
unsigned int hfa197_make_trio3f(int arg0) {
    /* asm: unpcklps */
    return (unsigned int)((arg0 + arg0));
}
hfa197_pair2d_roundtrip fail 20 lines
// glaurung: hfa197_pair2d_roundtrip @ 0x1220
__attribute__((no_stack_protector)) int32_t hfa197_pair2d_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern int hfa197_consume_pair2d(double, double);
    extern struct __glaurung_sse_pair hfa197_make_pair2d(int);
    int ret;
    long var0;
    unsigned char var1[16];
    long var3;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    *(struct __glaurung_sse_pair *)(&var1[0]) = hfa197_make_pair2d((unsigned long)((unsigned int)(arg1)));
    var3 = *(long *)((&var1[0] + 8));
    *(int *)((var0)) = (int)(*(double *)(&var1[0]));
    *(int *)((var0 + 0x4)) = (int)(((union { unsigned long long bits; double value; }){ .bits = (unsigned long long)(var3) }).value);
    ret = ((int (*)(void))hfa197_consume_pair2d)();
    return ret;
}
hfa197_quad4f_roundtrip fail 27 lines
// glaurung: hfa197_quad4f_roundtrip @ 0x1250
__attribute__((no_stack_protector)) int32_t hfa197_quad4f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern struct __glaurung_sse_pair hfa197_make_quad4f(int);
    long var0;
    unsigned char var1[16];
    int var14;
    long var3;
    long var5;
    long var7;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    *(struct __glaurung_sse_pair *)(&var1[0]) = hfa197_make_quad4f((unsigned long)((unsigned int)(arg1)));
    var3 = *(long *)((&var1[0] + 8));
    var5 = *(int *)(&var1[0]);
    var7 = *(int *)((&var1[0] + 4));
    var14 = (((unsigned long)(var3) >> 32) & 0xffffffff);
    /* asm: cvttps2dq */
    *(int *)((var0)) = var5;
    *(int *)((var0 + 0x4)) = var7;
    *(int *)((var0 + 0x8)) = var3;
    *(int *)((var0 + 0xc)) = var14;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var14)) * 8))) - (unsigned long)((unsigned int)(var14))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var3)) + ((unsigned long)((unsigned int)(var3)) * 4)))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var7)) + ((unsigned long)((unsigned int)(var7)) * 2))))))))))));
}
hfa197_scalar_control pass 18 lines
// glaurung: hfa197_scalar_control @ 0x1330
int32_t hfa197_scalar_control(int32_t * arg0, int32_t arg1) {
    extern double hfa197_make_scalar(int);
    double v;
    long var0;
    double var1;
    long var3;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    var1 = hfa197_make_scalar((unsigned long)((unsigned int)(arg1)));
    var3 = (int)(var1);
    *(int *)((var0)) = var3;
    *(int *)((var0 + 0x4)) = (var3 + var3);
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((var3 + (var3 * 2)) + 1));
}
hfa197_tagged_control pass 19 lines
// glaurung: hfa197_tagged_control @ 0x12f0
int32_t hfa197_tagged_control(int32_t * arg0, int32_t arg1) {
    extern long hfa197_make_tagged(int);
    long var0;
    long var1;
    long var8;
    long var9;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    var1 = hfa197_make_tagged((unsigned long)((unsigned int)(arg1)));
    var8 = ((unsigned long)(var1) >> 32);
    var9 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)((0 | var1)) }).value);
    *(int *)((var0)) = var9;
    *(int *)((var0 + 0x4)) = var8;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)((var9 + (var9 * 2)))) + var8));
}
hfa197_trio3f_roundtrip pass 27 lines
// glaurung: hfa197_trio3f_roundtrip @ 0x12b0
__attribute__((no_stack_protector)) int32_t hfa197_trio3f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
    extern struct __glaurung_sse_pair_half hfa197_make_trio3f(int);
    long var0;
    unsigned char var1[16];
    int var11;
    long var19;
    long var20;
    long var3;
    long var7;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    *(struct __glaurung_sse_pair_half *)(&var1[0]) = hfa197_make_trio3f((unsigned long)((unsigned int)(arg1)));
    var3 = *(int *)((&var1[0] + 8));
    var7 = *(int *)((&var1[0] + 4));
    var11 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(*(long *)(&var1[0])) }).value);
    *(int *)((var0)) = var11;
    var19 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)((var7 | var7)) }).value);
    *(int *)((var0 + 0x4)) = var19;
    var20 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(var3) }).value);
    *(int *)((var0 + 0x8)) = var20;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var20 + (var20 * 4)))) + var11))) + (unsigned long)((unsigned int)((var19 + (var19 * 2))))));
}

gcc -O2

6/11
hfa197_consume_pair2d structural 6 lines
// glaurung: hfa197_consume_pair2d @ 0x12c0
int hfa197_consume_pair2d(double arg0, double arg1) {
    long var0;
    var0 = (int)(arg0);
    return (unsigned int)(((unsigned long)((unsigned int)((var0 + (var0 * 2)))) + (int)(arg1)));
}
hfa197_make_pair2d fail 4 lines
// glaurung: hfa197_make_pair2d @ 0x11c0
double hfa197_make_pair2d(int arg0) {
    return (double)((int)((unsigned long)((unsigned int)((arg0 + 1)))));
}
hfa197_make_quad4f fail 4 lines
// glaurung: hfa197_make_quad4f @ 0x11e0
float hfa197_make_quad4f(int arg0) {
    return ((union { unsigned int bits; float value; }){ .bits = (unsigned int)(((unsigned long)((unsigned int)(((union { unsigned int bits; float value; }){ .value = (float)((int)((unsigned long)((unsigned int)((arg0 + (arg0 * 2)))))) }).bits)) | ((unsigned long)((unsigned int)(((union { unsigned int bits; float value; }){ .value = (float)((int)((unsigned long)((unsigned int)((arg0 + (arg0 * 4)))))) }).bits)) << 32))) }).value;
}
hfa197_make_scalar pass 6 lines
// glaurung: hfa197_make_scalar @ 0x12a0
double hfa197_make_scalar(int32_t arg0) {
    long var0;
    var0 = (unsigned long)((unsigned int)((arg0 + (arg0 * 2))));
    return (double)((int)((unsigned long)((unsigned int)(((var0 + var0) + 1)))));
}
hfa197_make_tagged pass 4 lines
// glaurung: hfa197_make_tagged @ 0x1280
unsigned long hfa197_make_tagged(int32_t arg0) {
    return ((unsigned long)((unsigned int)(((union { unsigned int bits; float value; }){ .value = (float)((int)((unsigned long)((unsigned int)((arg0 + 3))))) }).bits)) | ((unsigned long)((unsigned int)((arg0 + arg0))) << 32));
}
hfa197_make_trio3f fail 8 lines
// glaurung: hfa197_make_trio3f @ 0x1240
float hfa197_make_trio3f(int arg0) {
    float local_10;
    float local_14;
    local_14 = (float)((int)((unsigned long)((unsigned int)((arg0 + 1)))));
    local_10 = (float)((int)(0));
    return ((union { unsigned int bits; float value; }){ .bits = (unsigned int)((local_10 | local_14)) }).value;
}
hfa197_pair2d_roundtrip fail 24 lines
// glaurung: hfa197_pair2d_roundtrip @ 0x12e0
__attribute__((no_stack_protector)) int32_t hfa197_pair2d_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern int hfa197_consume_pair2d(double, double);
    extern struct __glaurung_sse_pair hfa197_make_pair2d(int);
    long local_8;
    int ret;
    long var0;
    long var1;
    unsigned char var3[16];
    long var5;
    local_8 = var0;
    var1 = (long)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    *(struct __glaurung_sse_pair *)(&var3[0]) = hfa197_make_pair2d((unsigned long)((unsigned int)(arg1)));
    var5 = *(long *)((&var3[0] + 8));
    *(int *)((var1)) = (int)(*(double *)(&var3[0]));
    *(int *)((var1 + 0x4)) = (int)(((union { unsigned long long bits; double value; }){ .bits = (unsigned long long)(var5) }).value);
    ret = ((int (*)(void))hfa197_consume_pair2d)();
    return ret;
}
hfa197_quad4f_roundtrip pass 34 lines
// glaurung: hfa197_quad4f_roundtrip @ 0x1310
__attribute__((no_stack_protector)) int32_t hfa197_quad4f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern struct __glaurung_sse_pair hfa197_make_quad4f(int);
    int local_10;
    int local_c;
    long var0;
    unsigned char var1[16];
    long var17;
    long var2;
    int var23;
    long var29;
    long var3;
    int var30;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    } else {
        *(struct __glaurung_sse_pair *)(&var1[0]) = hfa197_make_quad4f((unsigned long)((unsigned int)(arg1)));
        var2 = *(long *)(&var1[0]);
        var3 = *(long *)((&var1[0] + 8));
        local_10 = *(int *)((&var1[0] + 8));
        local_c = var2;
        var17 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(local_10) }).value);
        var23 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(local_c) }).value);
        var29 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)((0 | ((unsigned long)(var2) >> 32))) }).value);
        var30 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)((0 | ((unsigned long)(var3) >> 32))) }).value);
        *(int *)((var0 + 0x8)) = var17;
        *(int *)((var0)) = var23;
        *(int *)((var0 + 0x4)) = var29;
        *(int *)((var0 + 0xc)) = var30;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var29 + (var29 * 2)))) + var23))) + (unsigned long)((unsigned int)((var17 + (var17 * 4))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var30 * 8))) - var30)))));
    }
}
hfa197_scalar_control pass 24 lines
// glaurung: hfa197_scalar_control @ 0x1430
int32_t hfa197_scalar_control(int32_t * arg0, int32_t arg1) {
    extern double hfa197_make_scalar(int);
    double v;
    long local_8;
    long var0;
    long var1;
    double var3;
    long var5;
    long var6;
    local_8 = var0;
    var1 = (long)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var3 = hfa197_make_scalar((unsigned long)((unsigned int)(arg1)));
    var5 = (int)(var3);
    var6 = (unsigned long)((unsigned int)((var5 + var5)));
    *(int *)((var1)) = var5;
    *(int *)((var1 + 0x4)) = var6;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((var5 + var6) + 1));
}
hfa197_tagged_control pass 21 lines
// glaurung: hfa197_tagged_control @ 0x13f0
int32_t hfa197_tagged_control(int32_t * arg0, int32_t arg1) {
    extern long hfa197_make_tagged(int);
    int local_c;
    long var0;
    long var1;
    long var4;
    long var5;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    } else {
        var1 = hfa197_make_tagged((unsigned long)((unsigned int)(arg1)));
        local_c = var1;
        var4 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(local_c) }).value);
        var5 = ((long)(var1) >> 32);
        *(int *)((var0 + 0x4)) = var5;
        *(int *)((var0)) = var4;
        return (unsigned int)(((unsigned long)((unsigned int)((var4 + (var4 * 2)))) + var5));
    }
}
hfa197_trio3f_roundtrip pass 31 lines
// glaurung: hfa197_trio3f_roundtrip @ 0x13a0
__attribute__((no_stack_protector)) int32_t hfa197_trio3f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
    extern struct __glaurung_sse_pair_half hfa197_make_trio3f(int);
    int local_10;
    int local_14;
    long var0;
    unsigned char var1[16];
    int var11;
    long var12;
    long var13;
    long var3;
    long var7;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    } else {
        *(struct __glaurung_sse_pair_half *)(&var1[0]) = hfa197_make_trio3f((unsigned long)((unsigned int)(arg1)));
        var3 = *(int *)((&var1[0] + 8));
        var7 = *(int *)((&var1[0] + 4));
        local_14 = *(int *)(&var1[0]);
        local_10 = var7;
        var11 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(local_14) }).value);
        var12 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(local_10) }).value);
        var13 = (int)(((union { unsigned int bits; float value; }){ .bits = (unsigned int)(var3) }).value);
        *(int *)((var0)) = var11;
        *(int *)((var0 + 0x4)) = var12;
        *(int *)((var0 + 0x8)) = var13;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var12 + (var12 * 2)))) + var11))) + (unsigned long)((unsigned int)((var13 + (var13 * 4))))));
    }
}

clang -O0

10/11
hfa197_consume_pair2d structural 6 lines
// glaurung: hfa197_consume_pair2d @ 0x1290
int hfa197_consume_pair2d(double arg0, double arg1) {
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return (unsigned int)((((int)(arg0) * 3) + (int)(arg1)));
}
hfa197_make_pair2d pass 13 lines
// glaurung: hfa197_make_pair2d @ 0x1160
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
struct __glaurung_sse_pair { double __sse0; double __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair hfa197_make_pair2d(int32_t arg0) {
    unsigned char local_10[16];
    // x86-64 prologue: save rbp
    *(double *)(&local_10[0]) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(double *)((&local_10[0] + 8)) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)))))));
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair *)(&local_10[0]);
}
hfa197_make_quad4f pass 15 lines
// glaurung: hfa197_make_quad4f @ 0x1190
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
struct __glaurung_sse_pair { double __sse0; double __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair hfa197_make_quad4f(int32_t arg0) {
    unsigned char local_10[16];
    // x86-64 prologue: save rbp
    *(float *)(&local_10[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(float *)((&local_10[0] + 4)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 2)))));
    *(float *)((&local_10[0] + 8)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) + ((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) * 2))))));
    *(float *)((&local_10[0] + 12)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) + ((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) * 4))))));
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair *)(&local_10[0]);
}
hfa197_make_scalar pass 6 lines
// glaurung: hfa197_make_scalar @ 0x1270
double hfa197_make_scalar(int32_t arg0) {
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return (double)((int)((unsigned long)((unsigned int)(((arg0 * 6) + 1)))));
}
hfa197_make_tagged pass 9 lines
// glaurung: hfa197_make_tagged @ 0x1240
__attribute__((no_stack_protector)) unsigned long hfa197_make_tagged(int32_t arg0) {
    unsigned char local_8[8];
    // x86-64 prologue: save rbp
    *(float *)(&local_8[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 3)))));
    *(int *)((&local_8[0] + 4)) = ((unsigned long)((unsigned int)(arg0)) << 1);
    // x86-64 epilogue: restore rbp
    return *(long *)(&local_8[0]);
}
hfa197_make_trio3f pass 18 lines
// glaurung: hfa197_make_trio3f @ 0x11f0
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_HALF_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_HALF_DEFINED
struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair_half hfa197_make_trio3f(int32_t arg0) {
    unsigned char local_10[12];
    int local_20;
    long local_28;
    // x86-64 prologue: save rbp
    *(float *)(&local_10[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(float *)((&local_10[0] + 4)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)))))));
    *(float *)((&local_10[0] + 8)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) << 2)))));
    local_20 = *(int *)((&local_10[0] + 8));
    local_28 = *(long *)(&local_10[0]);
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair_half *)(&local_10[0]);
}
hfa197_pair2d_roundtrip pass 27 lines
// glaurung: hfa197_pair2d_roundtrip @ 0x12b0
__attribute__((no_stack_protector)) int32_t hfa197_pair2d_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern int hfa197_consume_pair2d(double, double);
    extern struct __glaurung_sse_pair hfa197_make_pair2d(int);
    unsigned char local_28[16];
    long local_30;
    long local_38;
    unsigned char var0[16];
    long var2;
    int var26;
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair *)(&var0[0]) = hfa197_make_pair2d((unsigned long)((unsigned int)(arg1)));
        var2 = *(long *)((&var0[0] + 8));
        local_38 = *(long *)(&var0[0]);
        local_30 = var2;
        *(long *)(&local_28[0]) = local_38;
        *(long *)((&local_28[0] + 8)) = local_30;
        *(int *)((long)arg0) = (int)(*(double *)(&local_28[0]));
        *(int *)(((long)arg0 + 0x4)) = (int)(*(double *)((&local_28[0] + 8)));
        var26 = hfa197_consume_pair2d((double)(*(double *)(&local_28[0])), (double)(*(double *)((&local_28[0] + 8))));
        return (unsigned int)(var26);
    } else {
        return (unsigned int)(-1);
    }
}
hfa197_quad4f_roundtrip pass 26 lines
// glaurung: hfa197_quad4f_roundtrip @ 0x1330
__attribute__((no_stack_protector)) int32_t hfa197_quad4f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern struct __glaurung_sse_pair hfa197_make_quad4f(int);
    unsigned char local_28[16];
    long local_30;
    long local_38;
    unsigned char var0[16];
    long var2;
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair *)(&var0[0]) = hfa197_make_quad4f((unsigned long)((unsigned int)(arg1)));
        var2 = *(long *)((&var0[0] + 8));
        local_38 = *(long *)(&var0[0]);
        local_30 = var2;
        *(long *)(&local_28[0]) = local_38;
        *(long *)((&local_28[0] + 8)) = local_30;
        *(int *)((long)arg0) = (int)(*(float *)(&local_28[0]));
        *(int *)(((long)arg0 + 0x4)) = (int)(*(float *)((&local_28[0] + 4)));
        *(int *)(((long)arg0 + 0x8)) = (int)(*(float *)((&local_28[0] + 8)));
        *(int *)(((long)arg0 + 0xc)) = (int)(*(float *)((&local_28[0] + 12)));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((int)(*(float *)(&local_28[0])) + ((int)(*(float *)((&local_28[0] + 4))) * 3)))) + ((int)(*(float *)((&local_28[0] + 8))) * 5)))) + ((int)(*(float *)((&local_28[0] + 12))) * 7)));
    } else {
        return (unsigned int)(-1);
    }
}
hfa197_scalar_control pass 16 lines
// glaurung: hfa197_scalar_control @ 0x14f0
int32_t hfa197_scalar_control(int32_t * arg0, int32_t arg1) {
    extern double hfa197_make_scalar(int);
    double v;
    double var0;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var0 = hfa197_make_scalar((unsigned long)((unsigned int)(arg1)));
        v = var0;
        *(int *)((long)arg0) = (int)(v);
        *(int *)(((long)arg0 + 0x4)) = ((int)(v) << 1);
        return (unsigned int)((((int)(v) * 3) + 1));
    } else {
        return (unsigned int)(-1);
    }
}
hfa197_tagged_control pass 18 lines
// glaurung: hfa197_tagged_control @ 0x1480
__attribute__((no_stack_protector)) int32_t hfa197_tagged_control(int32_t * arg0, int32_t arg1) {
    extern long hfa197_make_tagged(int);
    unsigned char local_20[8];
    long local_28;
    long var0;
    // x86-64 prologue: save rbp, frame 48 bytes
    if ((arg0 != 0)) {
        var0 = hfa197_make_tagged((unsigned long)((unsigned int)(arg1)));
        local_28 = var0;
        *(long *)(&local_20[0]) = local_28;
        *(int *)((long)arg0) = (int)(*(float *)(&local_20[0]));
        *(int *)(((long)arg0 + 0x4)) = *(int *)((&local_20[0] + 4));
        return (unsigned int)((((int)(*(float *)(&local_20[0])) * 3) + *(int *)((&local_20[0] + 4))));
    } else {
        return (unsigned int)(-1);
    }
}
hfa197_trio3f_roundtrip pass 29 lines
// glaurung: hfa197_trio3f_roundtrip @ 0x13e0
__attribute__((no_stack_protector)) int32_t hfa197_trio3f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
    extern struct __glaurung_sse_pair_half hfa197_make_trio3f(int);
    unsigned char local_20[12];
    int local_28;
    long local_30;
    int local_38;
    long local_40;
    unsigned char var0[16];
    long var1;
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair_half *)(&var0[0]) = hfa197_make_trio3f((unsigned long)((unsigned int)(arg1)));
        var1 = *(long *)(&var0[0]);
        local_38 = *(int *)((&var0[0] + 8));
        local_40 = var1;
        local_30 = local_40;
        local_28 = local_38;
        *(long *)(&local_20[0]) = local_30;
        *(int *)((&local_20[0] + 8)) = local_28;
        *(int *)((long)arg0) = (int)(*(float *)(&local_20[0]));
        *(int *)(((long)arg0 + 0x4)) = (int)(*(float *)((&local_20[0] + 4)));
        *(int *)(((long)arg0 + 0x8)) = (int)(*(float *)((&local_20[0] + 8)));
        return (unsigned int)(((unsigned long)((unsigned int)(((int)(*(float *)(&local_20[0])) + ((int)(*(float *)((&local_20[0] + 4))) * 3)))) + ((int)(*(float *)((&local_20[0] + 8))) * 5)));
    } else {
        return (unsigned int)(-1);
    }
}

gcc -O0

10/11
hfa197_consume_pair2d structural 8 lines
// glaurung: hfa197_consume_pair2d @ 0x134e
int hfa197_consume_pair2d(double arg0, double arg1) {
    int var18;
    // x86-64 prologue: save rbp
    var18 = (int)(arg0);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(((int)(arg1) + (unsigned long)((unsigned int)((var18 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var18)) + (unsigned long)((unsigned int)(var18))))))))));
}
hfa197_make_pair2d pass 13 lines
// glaurung: hfa197_make_pair2d @ 0x11b9
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
struct __glaurung_sse_pair { double __sse0; double __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair hfa197_make_pair2d(int32_t arg0) {
    unsigned char local_20[16];
    // x86-64 prologue: save rbp, frame 8 bytes
    *(double *)(&local_20[0]) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(double *)((&local_20[0] + 8)) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)))))));
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair *)(&local_20[0]);
}
hfa197_make_quad4f pass 15 lines
// glaurung: hfa197_make_quad4f @ 0x1211
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_DEFINED
struct __glaurung_sse_pair { double __sse0; double __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair hfa197_make_quad4f(int32_t arg0) {
    unsigned char local_20[16];
    // x86-64 prologue: save rbp, frame 8 bytes
    *(float *)(&local_20[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(float *)((&local_20[0] + 4)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 2)))));
    *(float *)((&local_20[0] + 8)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) + (unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0))))))) + (unsigned long)((unsigned int)(arg0)))))));
    *(float *)((&local_20[0] + 12)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) << 2))) + (unsigned long)((unsigned int)(arg0)))))));
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair *)(&local_20[0]);
}
hfa197_make_scalar pass 8 lines
// glaurung: hfa197_make_scalar @ 0x1321
double hfa197_make_scalar(int32_t arg0) {
    int var4;
    // x86-64 prologue: save rbp
    var4 = ((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)))) + (unsigned int)(arg0));
    // x86-64 epilogue: restore rbp
    return (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) + (unsigned long)((unsigned int)(var4))))) + 1)))));
}
hfa197_make_tagged pass 9 lines
// glaurung: hfa197_make_tagged @ 0x12f5
__attribute__((no_stack_protector)) unsigned long hfa197_make_tagged(int32_t arg0) {
    unsigned char local_8[8];
    // x86-64 prologue: save rbp
    *(float *)(&local_8[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 3)))));
    *(int *)((&local_8[0] + 4)) = ((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)));
    // x86-64 epilogue: restore rbp
    return *(long *)(&local_8[0]);
}
hfa197_make_trio3f pass 18 lines
// glaurung: hfa197_make_trio3f @ 0x1291
#ifndef GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_HALF_DEFINED
#define GLAURUNG_ABI_TAG_STRUCT___GLAURUNG_SSE_PAIR_HALF_DEFINED
struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
#endif
__attribute__((no_stack_protector)) struct __glaurung_sse_pair_half hfa197_make_trio3f(int32_t arg0) {
    unsigned char local_18[12];
    int local_4;
    long local_c;
    // x86-64 prologue: save rbp
    *(float *)(&local_18[0]) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + 1)))));
    *(float *)((&local_18[0] + 4)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)))))));
    *(float *)((&local_18[0] + 8)) = (float)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) << 2)))));
    local_c = *(long *)(&local_18[0]);
    local_4 = *(int *)((&local_18[0] + 8));
    // x86-64 epilogue: restore rbp
    return *(struct __glaurung_sse_pair_half *)(&local_18[0]);
}
hfa197_pair2d_roundtrip pass 23 lines
// glaurung: hfa197_pair2d_roundtrip @ 0x1395
__attribute__((no_stack_protector)) int32_t hfa197_pair2d_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern int hfa197_consume_pair2d(double, double);
    extern struct __glaurung_sse_pair hfa197_make_pair2d(int);
    unsigned char local_10[16];
    unsigned char var1[16];
    long var3;
    int var43;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair *)(&var1[0]) = hfa197_make_pair2d((unsigned long)((unsigned int)(arg1)));
        var3 = *(long *)((&var1[0] + 8));
        *(long *)(&local_10[0]) = *(long *)(&var1[0]);
        *(long *)((&local_10[0] + 8)) = var3;
        *(int *)((long)arg0) = (int)(*(double *)(&local_10[0]));
        *(int *)((arg0 + 1)) = (int)(*(double *)((&local_10[0] + 8)));
        var43 = hfa197_consume_pair2d((double)(*(double *)(&local_10[0])), (double)(*(double *)((&local_10[0] + 8))));
        return var43;
    } else {
        return 0xffffffff;
    }
}
hfa197_quad4f_roundtrip pass 31 lines
// glaurung: hfa197_quad4f_roundtrip @ 0x1409
__attribute__((no_stack_protector)) int32_t hfa197_quad4f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair { double __sse0; double __sse1; };
    extern struct __glaurung_sse_pair hfa197_make_quad4f(int);
    unsigned char local_10[16];
    unsigned char var1[16];
    long var11;
    int var59;
    int var72;
    int var85;
    long var9;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair *)(&var1[0]) = hfa197_make_quad4f((unsigned long)((unsigned int)(arg1)));
        var9 = *(int *)((&var1[0] + 8));
        var11 = *(int *)((&var1[0] + 12));
        *(long *)(&local_10[0]) = *(long *)(&var1[0]);
        *(int *)((&local_10[0] + 8)) = var9;
        *(int *)((&local_10[0] + 12)) = var11;
        *(int *)((long)arg0) = (int)(*(float *)(&local_10[0]));
        *(int *)((arg0 + 1)) = (int)(*(float *)((&local_10[0] + 4)));
        *(int *)((arg0 + 2)) = (int)(*(float *)((&local_10[0] + 8)));
        *(int *)((arg0 + 3)) = (int)(*(float *)((&local_10[0] + 12)));
        var59 = (int)(*(float *)((&local_10[0] + 4)));
        var72 = (int)(*(float *)((&local_10[0] + 8)));
        var85 = (int)(*(float *)((&local_10[0] + 12)));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var85)) << 3))) - var85))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((int)(*(float *)(&local_10[0])) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var59)) + (unsigned long)((unsigned int)(var59))))) + var59)))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var72)) << 2))) + var72))))))));
    } else {
        return 0xffffffff;
    }
}
hfa197_scalar_control pass 20 lines
// glaurung: hfa197_scalar_control @ 0x15d1
int32_t hfa197_scalar_control(int32_t * arg0, int32_t arg1) {
    extern double hfa197_make_scalar(int);
    double v;
    double var1;
    int var16;
    int var26;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = hfa197_make_scalar((unsigned long)((unsigned int)(arg1)));
        v = var1;
        *(int *)((long)arg0) = (int)(v);
        var16 = (int)(v);
        *(int *)((arg0 + 1)) = (var16 + var16);
        var26 = (int)(v);
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var26)) + (unsigned long)((unsigned int)(var26))))) + var26))) + 1));
    } else {
        return 0xffffffff;
    }
}
hfa197_tagged_control pass 18 lines
// glaurung: hfa197_tagged_control @ 0x1570
__attribute__((no_stack_protector)) int32_t hfa197_tagged_control(int32_t * arg0, int32_t arg1) {
    extern long hfa197_make_tagged(int);
    unsigned char local_8[8];
    long var1;
    int var18;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = hfa197_make_tagged((unsigned long)((unsigned int)(arg1)));
        *(long *)(&local_8[0]) = var1;
        *(int *)((long)arg0) = (int)(*(float *)(&local_8[0]));
        *(int *)((arg0 + 1)) = *(int *)((&local_8[0] + 4));
        var18 = (int)(*(float *)(&local_8[0]));
        return (unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_8[0] + 4)))) + (unsigned long)((unsigned int)((var18 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var18)) + (unsigned long)((unsigned int)(var18))))))))));
    } else {
        return 0xffffffff;
    }
}
hfa197_trio3f_roundtrip pass 25 lines
// glaurung: hfa197_trio3f_roundtrip @ 0x14d1
__attribute__((no_stack_protector)) int32_t hfa197_trio3f_roundtrip(int32_t * arg0, int32_t arg1) {
    struct __glaurung_sse_pair_half { double __sse0; float __sse1; };
    extern struct __glaurung_sse_pair_half hfa197_make_trio3f(int);
    unsigned char local_c[12];
    unsigned char var1[16];
    long var3;
    int var51;
    int var64;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        *(struct __glaurung_sse_pair_half *)(&var1[0]) = hfa197_make_trio3f((unsigned long)((unsigned int)(arg1)));
        var3 = *(int *)((&var1[0] + 8));
        *(long *)(&local_c[0]) = *(long *)(&var1[0]);
        *(int *)((&local_c[0] + 8)) = var3;
        *(int *)((long)arg0) = (int)(*(float *)(&local_c[0]));
        *(int *)((arg0 + 1)) = (int)(*(float *)((&local_c[0] + 4)));
        *(int *)((arg0 + 2)) = (int)(*(float *)((&local_c[0] + 8)));
        var51 = (int)(*(float *)((&local_c[0] + 4)));
        var64 = (int)(*(float *)((&local_c[0] + 8)));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var64)) << 2))) + var64))) + (unsigned long)((unsigned int)(((int)(*(float *)(&local_c[0])) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var51)) + (unsigned long)((unsigned int)(var51))))) + var51))))))));
    } else {
        return 0xffffffff;
    }
}

← 213 fixtures