+static float32 sfmt_to_float32(uint64_t sfmt)
+{
+ uint32_t sign = get_fsingle_sign(sfmt);
+ uint32_t man = get_fsingle_man(sfmt);
+ uint32_t exp = get_fsingle_exp(sfmt);
+ float32 f;
+
+ if (get_fsingle_calc(sfmt) == TILEGX_F_CALC_CVT) {
+ if (sign) {
+ f = int32_to_float32(0 - man, &fp_status);
+ } else {
+ f = uint32_to_float32(man, &fp_status);
+ }
+ exp += get_f32_exp(f) - 0x9e;
+ if ((int32_t) exp < 0) {
+ return float32_infinity | float32_set_sign(float32_zero, sign);
+ } else if (exp >= 0xff) {
+ return float32_zero | float32_set_sign(float32_zero, sign);
+ } else {
+ set_f32_exp(&f, exp);
+ }
+ } else {
+ f = create_f32_man(man >> 8);
+ set_f32_exp(&f, exp);
+ }
+
+ f = float32_set_sign(f, sign);
+ return f;
+}
+
+uint64_t helper_fsingle_pack2(uint64_t srca)
+{
+ return float32_val(sfmt_to_float32(srca));
+}
+
+static uint64_t main_calc(float32 fsrca, float32 fsrcb,
+ float32 (*calc)(float32, float32, float_status *))
+{
+ uint64_t sfmt = float32_to_sfmt(calc(fsrca, fsrcb, &fp_status));
+
+ if (float32_eq(fsrca, fsrcb, &fp_status)) {
+ sfmt |= create_fsfd_flag_eq();
+ } else {
+ sfmt |= create_fsfd_flag_ne();
+ }
+
+ if (float32_lt(fsrca, fsrcb, &fp_status)) {
+ sfmt |= create_fsfd_flag_lt();
+ }
+ if (float32_le(fsrca, fsrcb, &fp_status)) {
+ sfmt |= create_fsfd_flag_le();
+ }
+
+ if (float32_lt(fsrcb, fsrca, &fp_status)) {
+ sfmt |= create_fsfd_flag_gt();
+ }
+ if (float32_le(fsrcb, fsrca, &fp_status)) {
+ sfmt |= create_fsfd_flag_ge();
+ }
+
+ if (float32_unordered(fsrca, fsrcb, &fp_status)) {
+ sfmt |= create_fsfd_flag_un();
+ }
+
+ set_fsingle_calc(&sfmt, TILEGX_F_CALC_NCVT);
+ return sfmt;
+}
+
+uint64_t helper_fsingle_add1(uint64_t srca, uint64_t srcb)
+{
+ return main_calc(make_float32(srca), make_float32(srcb), float32_add);
+}
+
+uint64_t helper_fsingle_sub1(uint64_t srca, uint64_t srcb)
+{
+ return main_calc(make_float32(srca), make_float32(srcb), float32_sub);
+}
+
+uint64_t helper_fsingle_mul1(uint64_t srca, uint64_t srcb)
+{
+ return main_calc(make_float32(srca), make_float32(srcb), float32_mul);
+}