+++ /dev/null
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include "opcodes.h"
-#include "rounding.h"
-
-/* Test "convert to fixed" with rounding mode given in insn (m3 field)
- Covers all generally available rounding modes that can be mapped to
- IRRoundingMode. As a consequence m3=1 which is "round to nearest with
- ties away from 0" is not tested here.
-*/
-
-const char *
-rtext(unsigned m3_round)
-{
- switch (m3_round) {
- case 0: return "[-> per fpc]";
- case 1: return "[-> nearest away]";
- case 3: return "[-> prepare short]"; // floating point extension fac needed
- case 4: return "[-> nearest even]";
- case 5: return "[-> 0]";
- case 6: return "[-> +inf]";
- case 7: return "[-> -inf]";
- }
- assert(0);
-}
-
-#define convert_to_int(opcode,src_type,dst_type,dst_fmt,round,value) \
-do { \
- src_type src = value; \
- dst_type dst; \
- unsigned cc; \
- \
- __asm__ volatile (opcode " %[dst]," #round ",%[src]\n\t" \
- "ipm %[cc]\n\t" \
- "srl %[cc],28\n\t" \
- : [dst] "=d"(dst), [cc] "=d"(cc) \
- : [src] "f"(src) \
- : "cc"); \
- \
- printf("%s %f\t-> %"dst_fmt"\tcc = %u %s\n", \
- 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 cfdbr(value, round) \
- convert_to_int("cfdbr",double,int32_t,PRId32,round,value)
-#define cgebr(value, round) \
- convert_to_int("cgebr",float,int64_t,PRId64,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)
-{
- register unsigned r asm("1") = mode;
- __asm__ volatile ( SFPC(1) : : "d"(r) );
-}
-
-
-int main(void)
-{
- int j;
- static const float fval[] = {
- 1.25f, 1.5f, 2.5f, 1.75f, -1.25f, -1.5f, -2.5f, -1.75f, 0.0f,
- };
- static const double dval[] = {
- 1.25, 1.5, 2.5, 1.75, -1.25, -1.5, -2.5, -1.75, 0.0,
- };
-
- /* Note when testing M3_NEAR need to set the FPC rounding mode
- to something else. FPC rounding mode is NEAR by default.
- Setting the FPC rounding mode to != NEAR is the only way to make
- sure the M3 field is not ignored. */
-
- /* f32 -> i32 */
- for (j = 0; j < sizeof fval / sizeof fval[0]; ++j) {
- set_rounding_mode(FPC_BFP_ROUND_ZERO);
- cfebr(fval[j], M3_BFP_ROUND_NEAREST_EVEN);
- set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
- cfebr(fval[j], M3_BFP_ROUND_ZERO);
- cfebr(fval[j], M3_BFP_ROUND_POSINF);
- cfebr(fval[j], M3_BFP_ROUND_NEGINF);
- }
-
- /* f32 -> i64 */
- for (j = 0; j < sizeof fval / sizeof fval[0]; ++j) {
- set_rounding_mode(FPC_BFP_ROUND_ZERO);
- cgebr(fval[j], M3_BFP_ROUND_NEAREST_EVEN);
- set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
- cgebr(fval[j], M3_BFP_ROUND_ZERO);
- cgebr(fval[j], M3_BFP_ROUND_POSINF);
- cgebr(fval[j], M3_BFP_ROUND_NEGINF);
- }
-
- /* f64 -> i32 */
- for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
- set_rounding_mode(FPC_BFP_ROUND_ZERO);
- cfdbr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
- set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
- cfdbr(dval[j], M3_BFP_ROUND_ZERO);
- cfdbr(dval[j], M3_BFP_ROUND_POSINF);
- cfdbr(dval[j], M3_BFP_ROUND_NEGINF);
- }
-
- /* f64 -> i64 */
- for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
- set_rounding_mode(FPC_BFP_ROUND_ZERO);
- cgdbr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
- set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
- cgdbr(dval[j], M3_BFP_ROUND_ZERO);
- cgdbr(dval[j], M3_BFP_ROUND_POSINF);
- 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;
-}
+++ /dev/null
-cfebr 1.250000 -> 1 cc = 2 [-> nearest even]
-cfebr 1.250000 -> 1 cc = 2 [-> 0]
-cfebr 1.250000 -> 2 cc = 2 [-> +inf]
-cfebr 1.250000 -> 1 cc = 2 [-> -inf]
-cfebr 1.500000 -> 2 cc = 2 [-> nearest even]
-cfebr 1.500000 -> 1 cc = 2 [-> 0]
-cfebr 1.500000 -> 2 cc = 2 [-> +inf]
-cfebr 1.500000 -> 1 cc = 2 [-> -inf]
-cfebr 2.500000 -> 2 cc = 2 [-> nearest even]
-cfebr 2.500000 -> 2 cc = 2 [-> 0]
-cfebr 2.500000 -> 3 cc = 2 [-> +inf]
-cfebr 2.500000 -> 2 cc = 2 [-> -inf]
-cfebr 1.750000 -> 2 cc = 2 [-> nearest even]
-cfebr 1.750000 -> 1 cc = 2 [-> 0]
-cfebr 1.750000 -> 2 cc = 2 [-> +inf]
-cfebr 1.750000 -> 1 cc = 2 [-> -inf]
-cfebr -1.250000 -> -1 cc = 1 [-> nearest even]
-cfebr -1.250000 -> -1 cc = 1 [-> 0]
-cfebr -1.250000 -> -1 cc = 1 [-> +inf]
-cfebr -1.250000 -> -2 cc = 1 [-> -inf]
-cfebr -1.500000 -> -2 cc = 1 [-> nearest even]
-cfebr -1.500000 -> -1 cc = 1 [-> 0]
-cfebr -1.500000 -> -1 cc = 1 [-> +inf]
-cfebr -1.500000 -> -2 cc = 1 [-> -inf]
-cfebr -2.500000 -> -2 cc = 1 [-> nearest even]
-cfebr -2.500000 -> -2 cc = 1 [-> 0]
-cfebr -2.500000 -> -2 cc = 1 [-> +inf]
-cfebr -2.500000 -> -3 cc = 1 [-> -inf]
-cfebr -1.750000 -> -2 cc = 1 [-> nearest even]
-cfebr -1.750000 -> -1 cc = 1 [-> 0]
-cfebr -1.750000 -> -1 cc = 1 [-> +inf]
-cfebr -1.750000 -> -2 cc = 1 [-> -inf]
-cfebr 0.000000 -> 0 cc = 0 [-> nearest even]
-cfebr 0.000000 -> 0 cc = 0 [-> 0]
-cfebr 0.000000 -> 0 cc = 0 [-> +inf]
-cfebr 0.000000 -> 0 cc = 0 [-> -inf]
-cgebr 1.250000 -> 1 cc = 2 [-> nearest even]
-cgebr 1.250000 -> 1 cc = 2 [-> 0]
-cgebr 1.250000 -> 2 cc = 2 [-> +inf]
-cgebr 1.250000 -> 1 cc = 2 [-> -inf]
-cgebr 1.500000 -> 2 cc = 2 [-> nearest even]
-cgebr 1.500000 -> 1 cc = 2 [-> 0]
-cgebr 1.500000 -> 2 cc = 2 [-> +inf]
-cgebr 1.500000 -> 1 cc = 2 [-> -inf]
-cgebr 2.500000 -> 2 cc = 2 [-> nearest even]
-cgebr 2.500000 -> 2 cc = 2 [-> 0]
-cgebr 2.500000 -> 3 cc = 2 [-> +inf]
-cgebr 2.500000 -> 2 cc = 2 [-> -inf]
-cgebr 1.750000 -> 2 cc = 2 [-> nearest even]
-cgebr 1.750000 -> 1 cc = 2 [-> 0]
-cgebr 1.750000 -> 2 cc = 2 [-> +inf]
-cgebr 1.750000 -> 1 cc = 2 [-> -inf]
-cgebr -1.250000 -> -1 cc = 1 [-> nearest even]
-cgebr -1.250000 -> -1 cc = 1 [-> 0]
-cgebr -1.250000 -> -1 cc = 1 [-> +inf]
-cgebr -1.250000 -> -2 cc = 1 [-> -inf]
-cgebr -1.500000 -> -2 cc = 1 [-> nearest even]
-cgebr -1.500000 -> -1 cc = 1 [-> 0]
-cgebr -1.500000 -> -1 cc = 1 [-> +inf]
-cgebr -1.500000 -> -2 cc = 1 [-> -inf]
-cgebr -2.500000 -> -2 cc = 1 [-> nearest even]
-cgebr -2.500000 -> -2 cc = 1 [-> 0]
-cgebr -2.500000 -> -2 cc = 1 [-> +inf]
-cgebr -2.500000 -> -3 cc = 1 [-> -inf]
-cgebr -1.750000 -> -2 cc = 1 [-> nearest even]
-cgebr -1.750000 -> -1 cc = 1 [-> 0]
-cgebr -1.750000 -> -1 cc = 1 [-> +inf]
-cgebr -1.750000 -> -2 cc = 1 [-> -inf]
-cgebr 0.000000 -> 0 cc = 0 [-> nearest even]
-cgebr 0.000000 -> 0 cc = 0 [-> 0]
-cgebr 0.000000 -> 0 cc = 0 [-> +inf]
-cgebr 0.000000 -> 0 cc = 0 [-> -inf]
-cfdbr 1.250000 -> 1 cc = 2 [-> nearest even]
-cfdbr 1.250000 -> 1 cc = 2 [-> 0]
-cfdbr 1.250000 -> 2 cc = 2 [-> +inf]
-cfdbr 1.250000 -> 1 cc = 2 [-> -inf]
-cfdbr 1.500000 -> 2 cc = 2 [-> nearest even]
-cfdbr 1.500000 -> 1 cc = 2 [-> 0]
-cfdbr 1.500000 -> 2 cc = 2 [-> +inf]
-cfdbr 1.500000 -> 1 cc = 2 [-> -inf]
-cfdbr 2.500000 -> 2 cc = 2 [-> nearest even]
-cfdbr 2.500000 -> 2 cc = 2 [-> 0]
-cfdbr 2.500000 -> 3 cc = 2 [-> +inf]
-cfdbr 2.500000 -> 2 cc = 2 [-> -inf]
-cfdbr 1.750000 -> 2 cc = 2 [-> nearest even]
-cfdbr 1.750000 -> 1 cc = 2 [-> 0]
-cfdbr 1.750000 -> 2 cc = 2 [-> +inf]
-cfdbr 1.750000 -> 1 cc = 2 [-> -inf]
-cfdbr -1.250000 -> -1 cc = 1 [-> nearest even]
-cfdbr -1.250000 -> -1 cc = 1 [-> 0]
-cfdbr -1.250000 -> -1 cc = 1 [-> +inf]
-cfdbr -1.250000 -> -2 cc = 1 [-> -inf]
-cfdbr -1.500000 -> -2 cc = 1 [-> nearest even]
-cfdbr -1.500000 -> -1 cc = 1 [-> 0]
-cfdbr -1.500000 -> -1 cc = 1 [-> +inf]
-cfdbr -1.500000 -> -2 cc = 1 [-> -inf]
-cfdbr -2.500000 -> -2 cc = 1 [-> nearest even]
-cfdbr -2.500000 -> -2 cc = 1 [-> 0]
-cfdbr -2.500000 -> -2 cc = 1 [-> +inf]
-cfdbr -2.500000 -> -3 cc = 1 [-> -inf]
-cfdbr -1.750000 -> -2 cc = 1 [-> nearest even]
-cfdbr -1.750000 -> -1 cc = 1 [-> 0]
-cfdbr -1.750000 -> -1 cc = 1 [-> +inf]
-cfdbr -1.750000 -> -2 cc = 1 [-> -inf]
-cfdbr 0.000000 -> 0 cc = 0 [-> nearest even]
-cfdbr 0.000000 -> 0 cc = 0 [-> 0]
-cfdbr 0.000000 -> 0 cc = 0 [-> +inf]
-cfdbr 0.000000 -> 0 cc = 0 [-> -inf]
-cgdbr 1.250000 -> 1 cc = 2 [-> nearest even]
-cgdbr 1.250000 -> 1 cc = 2 [-> 0]
-cgdbr 1.250000 -> 2 cc = 2 [-> +inf]
-cgdbr 1.250000 -> 1 cc = 2 [-> -inf]
-cgdbr 1.500000 -> 2 cc = 2 [-> nearest even]
-cgdbr 1.500000 -> 1 cc = 2 [-> 0]
-cgdbr 1.500000 -> 2 cc = 2 [-> +inf]
-cgdbr 1.500000 -> 1 cc = 2 [-> -inf]
-cgdbr 2.500000 -> 2 cc = 2 [-> nearest even]
-cgdbr 2.500000 -> 2 cc = 2 [-> 0]
-cgdbr 2.500000 -> 3 cc = 2 [-> +inf]
-cgdbr 2.500000 -> 2 cc = 2 [-> -inf]
-cgdbr 1.750000 -> 2 cc = 2 [-> nearest even]
-cgdbr 1.750000 -> 1 cc = 2 [-> 0]
-cgdbr 1.750000 -> 2 cc = 2 [-> +inf]
-cgdbr 1.750000 -> 1 cc = 2 [-> -inf]
-cgdbr -1.250000 -> -1 cc = 1 [-> nearest even]
-cgdbr -1.250000 -> -1 cc = 1 [-> 0]
-cgdbr -1.250000 -> -1 cc = 1 [-> +inf]
-cgdbr -1.250000 -> -2 cc = 1 [-> -inf]
-cgdbr -1.500000 -> -2 cc = 1 [-> nearest even]
-cgdbr -1.500000 -> -1 cc = 1 [-> 0]
-cgdbr -1.500000 -> -1 cc = 1 [-> +inf]
-cgdbr -1.500000 -> -2 cc = 1 [-> -inf]
-cgdbr -2.500000 -> -2 cc = 1 [-> nearest even]
-cgdbr -2.500000 -> -2 cc = 1 [-> 0]
-cgdbr -2.500000 -> -2 cc = 1 [-> +inf]
-cgdbr -2.500000 -> -3 cc = 1 [-> -inf]
-cgdbr -1.750000 -> -2 cc = 1 [-> nearest even]
-cgdbr -1.750000 -> -1 cc = 1 [-> 0]
-cgdbr -1.750000 -> -1 cc = 1 [-> +inf]
-cgdbr -1.750000 -> -2 cc = 1 [-> -inf]
-cgdbr 0.000000 -> 0 cc = 0 [-> nearest even]
-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]