opcode, src, dst, cc, rtext(round)); \
} while (0)
+#define round_to_int(opcode,type,round,value) \
+do { \
+ type src = value; \
+ type dst; \
+ \
+ __asm__ volatile (opcode " %[dst]," #round ",%[src]\n\t" \
+ : [dst] "=f"(dst) \
+ : [src] "f"(src) \
+ : ); \
+ \
+ printf("%s %.5f\t-> %g %s\n", \
+ opcode, src, dst, rtext(round)); \
+} while (0)
+
#define cfebr(value, round) \
convert_to_int("cfebr",float,int32_t,PRId32,round,value)
#define cgdbr(value, round) \
convert_to_int("cgdbr",double,int64_t,PRId64,round,value)
+#define fiebr(value, round) \
+ round_to_int("fiebr",float,round,value)
+#define fidbr(value, round) \
+ round_to_int("fidbr",double,round,value)
+
void
set_rounding_mode(unsigned mode)
{
cgdbr(dval[j], M3_BFP_ROUND_NEGINF);
}
+ /* f32 -> f32, round to int */
+ for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
+ set_rounding_mode(FPC_BFP_ROUND_ZERO);
+ fiebr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
+ set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
+ fiebr(dval[j], M3_BFP_ROUND_ZERO);
+ fiebr(dval[j], M3_BFP_ROUND_POSINF);
+ fiebr(dval[j], M3_BFP_ROUND_NEGINF);
+ }
+
+ /* f64 -> f64, round to int */
+ for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
+ set_rounding_mode(FPC_BFP_ROUND_ZERO);
+ fidbr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
+ set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
+ fidbr(dval[j], M3_BFP_ROUND_ZERO);
+ fidbr(dval[j], M3_BFP_ROUND_POSINF);
+ fidbr(dval[j], M3_BFP_ROUND_NEGINF);
+ }
+
return 0;
}
cgdbr 0.000000 -> 0 cc = 0 [-> 0]
cgdbr 0.000000 -> 0 cc = 0 [-> +inf]
cgdbr 0.000000 -> 0 cc = 0 [-> -inf]
+fiebr 1.25000 -> 1 [-> nearest even]
+fiebr 1.25000 -> 1 [-> 0]
+fiebr 1.25000 -> 2 [-> +inf]
+fiebr 1.25000 -> 1 [-> -inf]
+fiebr 1.50000 -> 2 [-> nearest even]
+fiebr 1.50000 -> 1 [-> 0]
+fiebr 1.50000 -> 2 [-> +inf]
+fiebr 1.50000 -> 1 [-> -inf]
+fiebr 2.50000 -> 2 [-> nearest even]
+fiebr 2.50000 -> 2 [-> 0]
+fiebr 2.50000 -> 3 [-> +inf]
+fiebr 2.50000 -> 2 [-> -inf]
+fiebr 1.75000 -> 2 [-> nearest even]
+fiebr 1.75000 -> 1 [-> 0]
+fiebr 1.75000 -> 2 [-> +inf]
+fiebr 1.75000 -> 1 [-> -inf]
+fiebr -1.25000 -> -1 [-> nearest even]
+fiebr -1.25000 -> -1 [-> 0]
+fiebr -1.25000 -> -1 [-> +inf]
+fiebr -1.25000 -> -2 [-> -inf]
+fiebr -1.50000 -> -2 [-> nearest even]
+fiebr -1.50000 -> -1 [-> 0]
+fiebr -1.50000 -> -1 [-> +inf]
+fiebr -1.50000 -> -2 [-> -inf]
+fiebr -2.50000 -> -2 [-> nearest even]
+fiebr -2.50000 -> -2 [-> 0]
+fiebr -2.50000 -> -2 [-> +inf]
+fiebr -2.50000 -> -3 [-> -inf]
+fiebr -1.75000 -> -2 [-> nearest even]
+fiebr -1.75000 -> -1 [-> 0]
+fiebr -1.75000 -> -1 [-> +inf]
+fiebr -1.75000 -> -2 [-> -inf]
+fiebr 0.00000 -> 0 [-> nearest even]
+fiebr 0.00000 -> 0 [-> 0]
+fiebr 0.00000 -> 0 [-> +inf]
+fiebr 0.00000 -> 0 [-> -inf]
+fidbr 1.25000 -> 1 [-> nearest even]
+fidbr 1.25000 -> 1 [-> 0]
+fidbr 1.25000 -> 2 [-> +inf]
+fidbr 1.25000 -> 1 [-> -inf]
+fidbr 1.50000 -> 2 [-> nearest even]
+fidbr 1.50000 -> 1 [-> 0]
+fidbr 1.50000 -> 2 [-> +inf]
+fidbr 1.50000 -> 1 [-> -inf]
+fidbr 2.50000 -> 2 [-> nearest even]
+fidbr 2.50000 -> 2 [-> 0]
+fidbr 2.50000 -> 3 [-> +inf]
+fidbr 2.50000 -> 2 [-> -inf]
+fidbr 1.75000 -> 2 [-> nearest even]
+fidbr 1.75000 -> 1 [-> 0]
+fidbr 1.75000 -> 2 [-> +inf]
+fidbr 1.75000 -> 1 [-> -inf]
+fidbr -1.25000 -> -1 [-> nearest even]
+fidbr -1.25000 -> -1 [-> 0]
+fidbr -1.25000 -> -1 [-> +inf]
+fidbr -1.25000 -> -2 [-> -inf]
+fidbr -1.50000 -> -2 [-> nearest even]
+fidbr -1.50000 -> -1 [-> 0]
+fidbr -1.50000 -> -1 [-> +inf]
+fidbr -1.50000 -> -2 [-> -inf]
+fidbr -2.50000 -> -2 [-> nearest even]
+fidbr -2.50000 -> -2 [-> 0]
+fidbr -2.50000 -> -2 [-> +inf]
+fidbr -2.50000 -> -3 [-> -inf]
+fidbr -1.75000 -> -2 [-> nearest even]
+fidbr -1.75000 -> -1 [-> 0]
+fidbr -1.75000 -> -1 [-> +inf]
+fidbr -1.75000 -> -2 [-> -inf]
+fidbr 0.00000 -> 0 [-> nearest even]
+fidbr 0.00000 -> 0 [-> 0]
+fidbr 0.00000 -> 0 [-> +inf]
+fidbr 0.00000 -> 0 [-> -inf]