qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 2/4] target-tilegx: Add single floating point


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH v4 2/4] target-tilegx: Add single floating point implementation
Date: Wed, 23 Dec 2015 15:07:23 -0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0

On 12/23/2015 01:48 PM, address@hidden wrote:
+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);
+        }


What in the world are you attempting to do here?
This is not normalization.  This is not even remotely
correct with respect to zero or infinity.

Moreover, I thought we agreed to do away with that CALC bit.


r~

+    } 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);
+}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]