cs csg cds cdsg cu21 cu21_1 cu24 cu24_1 cu42 cu12 cu12_1 \
ex_sig ex_clone cu14 cu14_1 cu41 fpconv ecag fpext fpext_warn \
rounding-1 rounding-2 rounding-3 rounding-4 rounding-5 bfp-1 \
- bfp-2 bfp-3
+ bfp-2 bfp-3 bfp-4
check_PROGRAMS = $(INSN_TESTS) \
allexec \
--- /dev/null
+#include <stdio.h>
+
+/* Test BFP comparison for 32/64-bit. */
+
+void cebr(float v1, float v2)
+{
+ int cc;
+
+ __asm__ volatile("cebr %[r1],%[r2]\n\t"
+ "ipm %[psw]\n\t"
+ "srl %[psw],28\n\t"
+ : [psw]"=d"(cc) : [r1]"f"(v1), [r2]"f"(v2) : "cc");
+ if (cc == 0)
+ printf("cfebr: %f == %f\n", v1, v2);
+ if (cc == 1)
+ printf("cfebr: %f < %f\n", v1, v2);
+ if (cc == 2)
+ printf("cfebr: %f > %f\n", v1, v2);
+}
+
+void cdbr(double v1, double v2)
+{
+ int cc;
+
+ __asm__ volatile("cdbr %[r1],%[r2]\n\t"
+ "ipm %[psw]\n\t"
+ "srl %[psw],28\n\t"
+ : [psw]"=d"(cc) : [r1]"f"(v1), [r2]"f"(v2) : "cc");
+ if (cc == 0)
+ printf("cdebr: %f == %f\n", v1, v2);
+ if (cc == 1)
+ printf("cdebr: %f < %f\n", v1, v2);
+ if (cc == 2)
+ printf("cdebr: %f > %f\n", v1, v2);
+}
+
+int main(void)
+{
+ float f1, f2;
+ float d1, d2;
+
+ // compare 4 bytes
+ f1 = 3.14f;
+ f2 = f1;
+ cebr(f1, f2);
+ f2 = f1 + 10.;
+ cebr(f1, f2);
+ f2 = f1 - 100.;
+ cebr(f1, f2);
+
+ // compare 8 bytes
+ d1 = 2.78;
+ d2 = d1;
+ cdbr(d1, d2);
+ d2 = d1 + 10.;
+ cdbr(d1, d2);
+ d2 = d1 - 100.;
+ cdbr(d1, d2);
+
+ return 0;
+}
--- /dev/null
+cfebr: 3.140000 == 3.140000
+cfebr: 3.140000 < 13.140000
+cfebr: 3.140000 > -96.860001
+cdebr: 2.780000 == 2.780000
+cdebr: 2.780000 < 12.780000
+cdebr: 2.780000 > -97.220001