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.
#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/11hfa197_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/11hfa197_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/11hfa197_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/11hfa197_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;
}
}