Add tests for VFPv4 VFMA/VMFS.  Pertains to #331057.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13967 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/none/tests/arm/Makefile.am b/none/tests/arm/Makefile.am
index 2a19f5b..4507a20 100644
--- a/none/tests/arm/Makefile.am
+++ b/none/tests/arm/Makefile.am
@@ -14,7 +14,8 @@
 	v6media.stdout.exp v6media.stderr.exp v6media.vgtest \
 	vcvt_fixed_float_VFP.stdout.exp vcvt_fixed_float_VFP.stderr.exp \
 		vcvt_fixed_float_VFP.vgtest \
-	vfp.stdout.exp vfp.stderr.exp vfp.vgtest
+	vfp.stdout.exp vfp.stderr.exp vfp.vgtest \
+	vfpv4_fma.stdout.exp vfpv4_fma.stderr.exp vfpv4_fma.vgtest
 
 check_PROGRAMS = \
 	allexec \
@@ -27,7 +28,8 @@
 	v6intThumb \
 	v6media \
 	vcvt_fixed_float_VFP \
-	vfp
+	vfp \
+	vfpv4_fma
 
 AM_CFLAGS    += @FLAG_M32@
 AM_CXXFLAGS  += @FLAG_M32@
@@ -63,3 +65,5 @@
 intdiv_CFLAGS	  = $(AM_CFLAGS) -g -mcpu=cortex-a15 -mthumb
 ldrt_CFLAGS	  = $(AM_CFLAGS) -g -mcpu=cortex-a8 -mthumb
 ldrt_arm_CFLAGS	  = $(AM_CFLAGS) -g -mcpu=cortex-a8 -marm
+
+vfpv4_fma_CFLAGS  = $(AM_CFLAGS) -g -O0 -mcpu=cortex-a15 -mfpu=vfpv4 -marm
diff --git a/none/tests/arm/vfpv4_fma.c b/none/tests/arm/vfpv4_fma.c
new file mode 100644
index 0000000..bfe6322
--- /dev/null
+++ b/none/tests/arm/vfpv4_fma.c
@@ -0,0 +1,182 @@
+
+/* Can be compiled both as ARM or Thumb using
+   gcc -Wall -g -O0 -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -m{arm,thumb} -o vfp vfp.c
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+static unsigned int f2u(float x) {
+    union {
+        float f;
+        unsigned int u;
+    } cvt;
+    cvt.f = x;
+    return cvt.u;
+}
+
+static unsigned int f2u0(double x) {
+    union {
+        double f;
+        unsigned int u[2];
+    } cvt;
+    cvt.f = x;
+    return cvt.u[0];
+}
+
+static unsigned int f2u1(double x) {
+    union {
+        double f;
+        unsigned int u[2];
+    } cvt;
+    cvt.f = x;
+    return cvt.u[1];
+}
+
+/* test macros to generate and output the result of a single instruction */
+
+#define TESTINSN_bin_f64(instruction, QD, QM, QMtype, QMval0, QMval1, QN, QNtype, QNval0, QNval1) \
+{ \
+  unsigned int out[2] = { 0x55555555, 0x55555555 }; \
+  unsigned int block[2]; \
+  block[0] = block[1] = 0x3f800000; \
+  \
+  __asm__ volatile( \
+      "vldr " #QD ", [%5]\n\t" \
+      "vmov " #QM ", %1, %2 \n\t" \
+      "vmov " #QN ", %3, %4 \n\t" \
+      instruction "\n\t" \
+      "vstmia %0, {" #QD "}\n\t" \
+      : \
+      : "r" (&out[0]), "r" (QMval0), "r" (QMval1), "r" (QNval0), "r" (QNval1), "r"(&block[0]) \
+      : #QD, #QM, #QN, "memory" \
+      ); \
+  printf("%-24s :: Qd 0x%08x 0x%08x  Qm 0x%08x %08x" \
+      "  Qn 0x%08x %08x\n", \
+      instruction, out[1], out[0], QMval1, QMval0, QNval1, QNval0); \
+}
+
+#define TESTINSN_bin_f32(instruction, SD, SM, SMtype, SMval, SN, SNtype, SNval) \
+{ \
+  unsigned int out[2] = { 0x55555555, 0x55555555 }; \
+  \
+  __asm__ volatile( \
+      "vmov.f32 " #SM ", %1\n\t" \
+      "vmov.f32 " #SN ", %2\n\t" \
+      "vmov.f32 " #SD ", %3\n\t" \
+      instruction "\n\t" \
+      "vstmia %0, {" #SD "}\n\t" \
+      : \
+      : "r" (&out[0]), "r" (SMval), "r" (SNval), "r" (0xaaaaaaaa) \
+      : #SD, #SM, #SN, "memory" \
+      ); \
+  printf("%-24s :: Qd 0x%08x 0x%08x  Sm (" #SMtype ")0x%08x" \
+      "  Sn (" #SNtype ")0x%08x\n", \
+      instruction, out[1], out[0], SMval, SNval); \
+}
+
+int main(int argc, char **argv)
+{
+    printf("---- VFMA (fp, VFPv4) ----\n");
+    TESTINSN_bin_f64("vfma.f64 d0,  d11, d12", d0,  d11, i32, f2u0(-INFINITY), f2u1(-INFINITY), d12, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfma.f64 d7,  d1,  d6",  d7,  d1,  i32, f2u0(INFINITY), f2u1(INFINITY), d6, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfma.f64 d0,  d5,  d2",  d0,  d5,  i32, f2u0(NAN), f2u1(NAN), d2, i32, f2u0(-1.0), f2u1(-1.0));
+    TESTINSN_bin_f64("vfma.f64 d10, d13, d15", d10, d13, i32, f2u0(NAN), f2u1(NAN), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f64("vfma.f64 d10, d13, d15", d10, d13, i32, f2u0(NAN), f2u1(NAN), d15, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfma.f64 d20, d25, d22", d20, d25, i32, f2u0(23.04), f2u1(23.04), d22, i32, f2u0(-45.5687), f2u1(-45.5687));
+    TESTINSN_bin_f64("vfma.f64 d23, d24, d25", d23, d24, i32, f2u0(-347856.475), f2u1(-347856.475), d25, i32, f2u0(1346), f2u1(1346));
+    TESTINSN_bin_f64("vfma.f64 d20, d31, d12", d20, d31, i32, f2u0(48755), f2u1(48755), d12, i32, f2u0(-45786.476), f2u1(-45786.476));
+    TESTINSN_bin_f64("vfma.f64 d19, d25, d27", d19, d25, i32, f2u0(95867.76), f2u1(95867.76), d27, i32, f2u0(17065), f2u1(17065));
+    TESTINSN_bin_f64("vfma.f64 d30, d15, d2",  d30, d15, i32, f2u0(-45667.24), f2u1(-45667.24), d2, i32, f2u0(-248562.76), f2u1(-248562.76));
+    TESTINSN_bin_f64("vfma.f64 d23, d24, d5",  d23, d24, i32, f2u0(24), f2u1(24), d5, i32, f2u0(1346), f2u1(1346));
+    TESTINSN_bin_f64("vfma.f64 d10, d11, d2",  d10, d11, i32, f2u0(48755), f2u1(48755), d2, i32, f2u0(1089), f2u1(1089));
+    TESTINSN_bin_f64("vfma.f64 d29, d15, d7",  d29, d15, i32, f2u0(214), f2u1(214), d7, i32, f2u0(1752065), f2u1(1752065));
+    TESTINSN_bin_f64("vfma.f64 d30, d11, d12", d30, d11, i32, f2u0(356047.56), f2u1(356047.56), d12, i32, f2u0(5867.009), f2u1(5867.009));
+    TESTINSN_bin_f64("vfma.f64 d27, d21, d6",  d27, d21, i32, f2u0(34.00046), f2u1(34.00046), d6, i32, f2u0(0.0024575), f2u1(0.0024575));
+    TESTINSN_bin_f64("vfma.f64 d30, d31, d2",  d30, d31, i32, f2u0(2754), f2u1(2754), d2, i32, f2u0(107), f2u1(107));
+    TESTINSN_bin_f64("vfma.f64 d13, d24, d5",  d13, d24, i32, f2u0(874), f2u1(874), d5, i32, f2u0(1384.6), f2u1(1384.6));
+    TESTINSN_bin_f64("vfma.f64 d10, d11, d2",  d10, d11, i32, f2u0(487.587), f2u1(487.587), d2, i32, f2u0(109), f2u1(109));
+    TESTINSN_bin_f64("vfma.f64 d29, d25, d7",  d29, d25, i32, f2u0(-INFINITY), f2u1(-INFINITY), d7, i32, f2u0(1752), f2u1(1752));
+    TESTINSN_bin_f64("vfma.f64 d0,  d11, d12", d0,  d11, i32, f2u0(INFINITY), f2u1(INFINITY), d12, i32, f2u0(-5786.47), f2u1(-5786.47));
+    TESTINSN_bin_f64("vfma.f64 d27, d21, d16", d27, d21, i32, f2u0(456.2489562), f2u1(456.2489562), d16, i32, f2u0(-7.2945676), f2u1(-7.2945676));
+    TESTINSN_bin_f64("vfma.f64 d0,  d5,  d2",  d0,  d5,  i32, f2u0(INFINITY), f2u1(INFINITY), d2, i32, f2u0(-INFINITY), f2u1(-INFINITY));
+    TESTINSN_bin_f64("vfma.f64 d20, d13, d15", d20, d13, i32, f2u0(-INFINITY), f2u1(-INFINITY), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f64("vfma.f64 d10, d23, d15", d10, d23, i32, f2u0(INFINITY), f2u1(INFINITY), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f32("vfma.f32 s0,  s11, s12", s0,  s11, i32, f2u(-INFINITY), s12, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfma.f32 s7,  s1,  s6",  s7,  s1,  i32, f2u(INFINITY), s6, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfma.f32 s0,  s5,  s2",  s0,  s5,  i32, f2u(NAN), s2, i32, f2u(-1.0));
+    TESTINSN_bin_f32("vfma.f32 s10, s13, s15", s10, s13, i32, f2u(NAN), s15, i32, f2u(0.0));
+    TESTINSN_bin_f32("vfma.f32 s10, s13, s15", s10, s13, i32, f2u(NAN), s15, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfma.f32 s20, s25, s22", s20, s25, i32, f2u(23.04), s22, i32, f2u(-45.5687));
+    TESTINSN_bin_f32("vfma.f32 s23, s24, s25", s23, s24, i32, f2u(-347856.475), s25, i32, f2u(1346));
+    TESTINSN_bin_f32("vfma.f32 s20, s31, s12", s20, s31, i32, f2u(48755), s12, i32, f2u(-45786.476));
+    TESTINSN_bin_f32("vfma.f32 s19, s25, s27", s19, s25, i32, f2u(95867.76), s27, i32, f2u(17065));
+    TESTINSN_bin_f32("vfma.f32 s30, s15, s2",  s30, s15, i32, f2u(-45667.24), s2, i32, f2u(-248562.76));
+    TESTINSN_bin_f32("vfma.f32 s23, s24, s5",  s23, s24, i32, f2u(24), s5, i32, f2u(1346));
+    TESTINSN_bin_f32("vfma.f32 s10, s11, s2",  s10, s11, i32, f2u(48755), s2, i32, f2u(1089));
+    TESTINSN_bin_f32("vfma.f32 s29, s15, s7",  s29, s15, i32, f2u(214), s7, i32, f2u(1752065));
+    TESTINSN_bin_f32("vfma.f32 s30, s11, s12", s30, s11, i32, f2u(356047.56), s12, i32, f2u(5867.009));
+    TESTINSN_bin_f32("vfma.f32 s27, s21, s6",  s27, s21, i32, f2u(34.00046), s6, i32, f2u(0.0024575));
+    TESTINSN_bin_f32("vfma.f32 s30, s31, s2",  s30, s31, i32, f2u(2754), s2, i32, f2u(107));
+    TESTINSN_bin_f32("vfma.f32 s13, s24, s5",  s13, s24, i32, f2u(874), s5, i32, f2u(1384.6));
+    TESTINSN_bin_f32("vfma.f32 s10, s11, s2",  s10, s11, i32, f2u(487.587), s2, i32, f2u(109));
+    TESTINSN_bin_f32("vfma.f32 s29, s25, s7",  s29, s25, i32, f2u(-INFINITY), s7, i32, f2u(1752));
+    TESTINSN_bin_f32("vfma.f32 s0,  s11, s12", s0,  s11, i32, f2u(INFINITY), s12, i32, f2u(-5786.47));
+    TESTINSN_bin_f32("vfma.f32 s27, s21, s16", s27, s21, i32, f2u(456.2489562), s16, i32, f2u(-7.2945676));
+    TESTINSN_bin_f32("vfma.f32 s0,  s5,  s2",  s0,  s5,  i32, f2u(INFINITY), s2, i32, f2u(-INFINITY));
+    TESTINSN_bin_f32("vfma.f32 s20, s13, s15", s20, s13, i32, f2u(-INFINITY), s15, i32, f2u(0.0));
+    TESTINSN_bin_f32("vfma.f32 s10, s23, s15", s10, s23, i32, f2u(INFINITY), s15, i32, f2u(0.0));
+
+    printf("---- VFMS (fp, VFPv4) ----\n");
+    TESTINSN_bin_f64("vfms.f64 d0,  d11, d12", d0,  d11, i32, f2u0(-INFINITY), f2u1(-INFINITY), d12, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfms.f64 d7,  d1,  d6",  d7,  d1,  i32, f2u0(INFINITY), f2u1(INFINITY), d6, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfms.f64 d0,  d5,  d2",  d0,  d5,  i32, f2u0(NAN), f2u1(NAN), d2, i32, f2u0(-1.0), f2u1(-1.0));
+    TESTINSN_bin_f64("vfms.f64 d10, d13, d15", d10, d13, i32, f2u0(NAN), f2u1(NAN), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f64("vfms.f64 d10, d13, d15", d10, d13, i32, f2u0(NAN), f2u1(NAN), d15, i32, f2u0(NAN), f2u1(NAN));
+    TESTINSN_bin_f64("vfms.f64 d20, d25, d22", d20, d25, i32, f2u0(23.04), f2u1(23.04), d22, i32, f2u0(-45.5687), f2u1(-45.5687));
+    TESTINSN_bin_f64("vfms.f64 d23, d24, d25", d23, d24, i32, f2u0(-347856.475), f2u1(-347856.475), d25, i32, f2u0(1346), f2u1(1346));
+    TESTINSN_bin_f64("vfms.f64 d20, d31, d12", d20, d31, i32, f2u0(48755), f2u1(48755), d12, i32, f2u0(-45786.476), f2u1(-45786.476));
+    TESTINSN_bin_f64("vfms.f64 d19, d25, d27", d19, d25, i32, f2u0(95867.76), f2u1(95867.76), d27, i32, f2u0(17065), f2u1(17065));
+    TESTINSN_bin_f64("vfms.f64 d30, d15, d2",  d30, d15, i32, f2u0(-45667.24), f2u1(-45667.24), d2, i32, f2u0(-248562.76), f2u1(-248562.76));
+    TESTINSN_bin_f64("vfms.f64 d23, d24, d5",  d23, d24, i32, f2u0(24), f2u1(24), d5, i32, f2u0(1346), f2u1(1346));
+    TESTINSN_bin_f64("vfms.f64 d10, d11, d2",  d10, d11, i32, f2u0(48755), f2u1(48755), d2, i32, f2u0(1089), f2u1(1089));
+    TESTINSN_bin_f64("vfms.f64 d29, d15, d7",  d29, d15, i32, f2u0(214), f2u1(214), d7, i32, f2u0(1752065), f2u1(1752065));
+    TESTINSN_bin_f64("vfms.f64 d30, d11, d12", d30, d11, i32, f2u0(356047.56), f2u1(356047.56), d12, i32, f2u0(5867.009), f2u1(5867.009));
+    TESTINSN_bin_f64("vfms.f64 d27, d21, d6",  d27, d21, i32, f2u0(34.00046), f2u1(34.00046), d6, i32, f2u0(0.0024575), f2u1(0.0024575));
+    TESTINSN_bin_f64("vfms.f64 d30, d31, d2",  d30, d31, i32, f2u0(2754), f2u1(2754), d2, i32, f2u0(107), f2u1(107));
+    TESTINSN_bin_f64("vfms.f64 d13, d24, d5",  d13, d24, i32, f2u0(874), f2u1(874), d5, i32, f2u0(1384.6), f2u1(1384.6));
+    TESTINSN_bin_f64("vfms.f64 d10, d11, d2",  d10, d11, i32, f2u0(487.587), f2u1(487.587), d2, i32, f2u0(109), f2u1(109));
+    TESTINSN_bin_f64("vfms.f64 d29, d25, d7",  d29, d25, i32, f2u0(-INFINITY), f2u1(-INFINITY), d7, i32, f2u0(1752), f2u1(1752));
+    TESTINSN_bin_f64("vfms.f64 d0,  d11, d12", d0,  d11, i32, f2u0(INFINITY), f2u1(INFINITY), d12, i32, f2u0(-5786.47), f2u1(-5786.47));
+    TESTINSN_bin_f64("vfms.f64 d27, d21, d16", d27, d21, i32, f2u0(456.2489562), f2u1(456.2489562), d16, i32, f2u0(-7.2945676), f2u1(-7.2945676));
+    TESTINSN_bin_f64("vfms.f64 d0,  d5,  d2",  d0,  d5,  i32, f2u0(INFINITY), f2u1(INFINITY), d2, i32, f2u0(-INFINITY), f2u1(-INFINITY));
+    TESTINSN_bin_f64("vfms.f64 d20, d13, d15", d20, d13, i32, f2u0(-INFINITY), f2u1(-INFINITY), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f64("vfms.f64 d10, d23, d15", d10, d23, i32, f2u0(INFINITY), f2u1(INFINITY), d15, i32, f2u0(0.0), f2u1(0.0));
+    TESTINSN_bin_f32("vfms.f32 s0,  s11, s12", s0,  s11, i32, f2u(-INFINITY), s12, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfms.f32 s7,  s1,  s6",  s7,  s1,  i32, f2u(INFINITY), s6, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfms.f32 s0,  s5,  s2",  s0,  s5,  i32, f2u(NAN), s2, i32, f2u(-1.0));
+    TESTINSN_bin_f32("vfms.f32 s10, s13, s15", s10, s13, i32, f2u(NAN), s15, i32, f2u(0.0));
+    TESTINSN_bin_f32("vfms.f32 s10, s13, s15", s10, s13, i32, f2u(NAN), s15, i32, f2u(NAN));
+    TESTINSN_bin_f32("vfms.f32 s20, s25, s22", s20, s25, i32, f2u(23.04), s22, i32, f2u(-45.5687));
+    TESTINSN_bin_f32("vfms.f32 s23, s24, s25", s23, s24, i32, f2u(-347856.475), s25, i32, f2u(1346));
+    TESTINSN_bin_f32("vfms.f32 s20, s31, s12", s20, s31, i32, f2u(48755), s12, i32, f2u(-45786.476));
+    TESTINSN_bin_f32("vfms.f32 s19, s25, s27", s19, s25, i32, f2u(95867.76), s27, i32, f2u(17065));
+    TESTINSN_bin_f32("vfms.f32 s30, s15, s2",  s30, s15, i32, f2u(-45667.24), s2, i32, f2u(-248562.76));
+    TESTINSN_bin_f32("vfms.f32 s23, s24, s5",  s23, s24, i32, f2u(24), s5, i32, f2u(1346));
+    TESTINSN_bin_f32("vfms.f32 s10, s11, s2",  s10, s11, i32, f2u(48755), s2, i32, f2u(1089));
+    TESTINSN_bin_f32("vfms.f32 s29, s15, s7",  s29, s15, i32, f2u(214), s7, i32, f2u(1752065));
+    TESTINSN_bin_f32("vfms.f32 s30, s11, s12", s30, s11, i32, f2u(356047.56), s12, i32, f2u(5867.009));
+    TESTINSN_bin_f32("vfms.f32 s27, s21, s6",  s27, s21, i32, f2u(34.00046), s6, i32, f2u(0.0024575));
+    TESTINSN_bin_f32("vfms.f32 s30, s31, s2",  s30, s31, i32, f2u(2754), s2, i32, f2u(107));
+    TESTINSN_bin_f32("vfms.f32 s13, s24, s5",  s13, s24, i32, f2u(874), s5, i32, f2u(1384.6));
+    TESTINSN_bin_f32("vfms.f32 s10, s11, s2",  s10, s11, i32, f2u(487.587), s2, i32, f2u(109));
+    TESTINSN_bin_f32("vfms.f32 s29, s25, s7",  s29, s25, i32, f2u(-INFINITY), s7, i32, f2u(1752));
+    TESTINSN_bin_f32("vfms.f32 s0,  s11, s12", s0,  s11, i32, f2u(INFINITY), s12, i32, f2u(-5786.47));
+    TESTINSN_bin_f32("vfms.f32 s27, s21, s16", s27, s21, i32, f2u(456.2489562), s16, i32, f2u(-7.2945676));
+    TESTINSN_bin_f32("vfms.f32 s0,  s5,  s2",  s0,  s5,  i32, f2u(INFINITY), s2, i32, f2u(-INFINITY));
+    TESTINSN_bin_f32("vfms.f32 s20, s13, s15", s20, s13, i32, f2u(-INFINITY), s15, i32, f2u(0.0));
+    TESTINSN_bin_f32("vfms.f32 s10, s23, s15", s10, s23, i32, f2u(INFINITY), s15, i32, f2u(0.0));
+
+    return 0;
+}
diff --git a/none/tests/arm/vfpv4_fma.stderr.exp b/none/tests/arm/vfpv4_fma.stderr.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/none/tests/arm/vfpv4_fma.stderr.exp
diff --git a/none/tests/arm/vfpv4_fma.stdout.exp b/none/tests/arm/vfpv4_fma.stdout.exp
new file mode 100644
index 0000000..fc1be90
--- /dev/null
+++ b/none/tests/arm/vfpv4_fma.stdout.exp
@@ -0,0 +1,98 @@
+---- VFMA (fp, VFPv4) ----
+vfma.f64 d0,  d11, d12   :: Qd 0x7ff80000 0x00000000  Qm 0xfff00000 00000000  Qn 0x7ff80000 00000000
+vfma.f64 d7,  d1,  d6    :: Qd 0x7ff80000 0x00000000  Qm 0x7ff00000 00000000  Qn 0x7ff80000 00000000
+vfma.f64 d0,  d5,  d2    :: Qd 0x7ff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0xbff00000 00000000
+vfma.f64 d10, d13, d15   :: Qd 0x7ff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0x00000000 00000000
+vfma.f64 d10, d13, d15   :: Qd 0x7ff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0x7ff80000 00000000
+vfma.f64 d20, d25, d22   :: Qd 0xc0906794 0x842f8549  Qm 0x40370a3d 70a3d70a  Qn 0xc046c8cb 295e9e1b
+vfma.f64 d23, d24, d25   :: Qd 0xc1bbe864 0x1f579999  Qm 0xc1153b41 e6666666  Qn 0x40950800 00000000
+vfma.f64 d20, d31, d12   :: Qd 0xc1e0a1cf 0xd2abe8f6  Qm 0x40e7ce60 00000000  Qn 0xc0e65b4f 3b645a1d
+vfma.f64 d19, d25, d27   :: Qd 0x41d860c7 0xf71a1999  Qm 0x40f767bc 28f5c28f  Qn 0x40d0aa40 00000000
+vfma.f64 d30, d15, d2    :: Qd 0x420524a9 0x817febf4  Qm 0xc0e64c67 ae147ae1  Qn 0xc10e5796 147ae148
+vfma.f64 d23, d24, d5    :: Qd 0x40df8c00 0x800001fc  Qm 0x40380000 00000000  Qn 0x40950800 00000000
+vfma.f64 d10, d11, d2    :: Qd 0x41895139 0x98100000  Qm 0x40e7ce60 00000000  Qn 0x40910400 00000000
+vfma.f64 d29, d15, d7    :: Qd 0x41b65928 0xd6020000  Qm 0x406ac000 00000000  Qn 0x413abc01 00000000
+vfma.f64 d30, d11, d12   :: Qd 0x41df20a6 0xd7bd2cb0  Qm 0x4115bb3e 3d70a3d7  Qn 0x40b6eb02 4dd2f1aa
+vfma.f64 d27, d21, d6    :: Qd 0x3fb763ef 0x4799be48  Qm 0x4041000f 12c27a63  Qn 0x3f6421c0 44284dfd
+vfma.f64 d30, d31, d2    :: Qd 0x4111fc58 0x08000020  Qm 0x40a58400 00000000  Qn 0x405ac000 00000000
+vfma.f64 d13, d24, d5    :: Qd 0x4132771c 0x6866666e  Qm 0x408b5000 00000000  Qn 0x4095a266 66666666
+vfma.f64 d10, d11, d2    :: Qd 0x40e9f35f 0xb4bc6b7d  Qm 0x407e7964 5a1cac08  Qn 0x405b4000 00000000
+vfma.f64 d29, d25, d7    :: Qd 0xfff00000 0x00000000  Qm 0xfff00000 00000000  Qn 0x409b6000 00000000
+vfma.f64 d0,  d11, d12   :: Qd 0xfff00000 0x00000000  Qm 0x7ff00000 00000000  Qn 0xc0b69a78 51eb851f
+vfma.f64 d27, d21, d16   :: Qd 0xc0aa0043 0x17cbec9d  Qm 0x407c83fb b97f122f  Qn 0xc01d2da3 2101d847
+vfma.f64 d0,  d5,  d2    :: Qd 0xfff00000 0x00000000  Qm 0x7ff00000 00000000  Qn 0xfff00000 00000000
+vfma.f64 d20, d13, d15   :: Qd 0x7ff80000 0x00000000  Qm 0xfff00000 00000000  Qn 0x00000000 00000000
+vfma.f64 d10, d23, d15   :: Qd 0x7ff80000 0x00000000  Qm 0x7ff00000 00000000  Qn 0x00000000 00000000
+vfma.f32 s0,  s11, s12   :: Qd 0x55555555 0x7fc00000  Sm (i32)0xff800000  Sn (i32)0x7fc00000
+vfma.f32 s7,  s1,  s6    :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7f800000  Sn (i32)0x7fc00000
+vfma.f32 s0,  s5,  s2    :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7fc00000  Sn (i32)0xbf800000
+vfma.f32 s10, s13, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7fc00000  Sn (i32)0x00000000
+vfma.f32 s10, s13, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7fc00000  Sn (i32)0x7fc00000
+vfma.f32 s20, s25, s22   :: Qd 0x55555555 0xc4833ce4  Sm (i32)0x41b851ec  Sn (i32)0xc2364659
+vfma.f32 s23, s24, s25   :: Qd 0x55555555 0xcddf4321  Sm (i32)0xc8a9da0f  Sn (i32)0x44a84000
+vfma.f32 s20, s31, s12   :: Qd 0x55555555 0xcf050e7f  Sm (i32)0x473e7300  Sn (i32)0xc732da7a
+vfma.f32 s19, s25, s27   :: Qd 0x55555555 0x4ec3063f  Sm (i32)0x47bb3de1  Sn (i32)0x46855200
+vfma.f32 s30, s15, s2    :: Qd 0x55555555 0x5029254c  Sm (i32)0xc732633d  Sn (i32)0xc872bcb1
+vfma.f32 s23, s24, s5    :: Qd 0x55555555 0x46fc6000  Sm (i32)0x41c00000  Sn (i32)0x44a84000
+vfma.f32 s10, s11, s2    :: Qd 0x55555555 0x4c4a89cd  Sm (i32)0x473e7300  Sn (i32)0x44882000
+vfma.f32 s29, s15, s7    :: Qd 0x55555555 0x4db2c947  Sm (i32)0x43560000  Sn (i32)0x49d5e008
+vfma.f32 s30, s11, s12   :: Qd 0x55555555 0x4ef90536  Sm (i32)0x48add9f2  Sn (i32)0x45b75812
+vfma.f32 s27, s21, s6    :: Qd 0x55555555 0x3dab1f7a  Sm (i32)0x42080079  Sn (i32)0x3b210e02
+vfma.f32 s30, s31, s2    :: Qd 0x55555555 0x488fe2c0  Sm (i32)0x452c2000  Sn (i32)0x42d60000
+vfma.f32 s13, s24, s5    :: Qd 0x55555555 0x4993b8e3  Sm (i32)0x445a8000  Sn (i32)0x44ad1333
+vfma.f32 s10, s11, s2    :: Qd 0x55555555 0x474f9afc  Sm (i32)0x43f3cb23  Sn (i32)0x42da0000
+vfma.f32 s29, s25, s7    :: Qd 0x55555555 0xff800000  Sm (i32)0xff800000  Sn (i32)0x44db0000
+vfma.f32 s0,  s11, s12   :: Qd 0x55555555 0xff800000  Sm (i32)0x7f800000  Sn (i32)0xc5b4d3c3
+vfma.f32 s27, s21, s16   :: Qd 0x55555555 0xc5500239  Sm (i32)0x43e41fde  Sn (i32)0xc0e96d19
+vfma.f32 s0,  s5,  s2    :: Qd 0x55555555 0xff800000  Sm (i32)0x7f800000  Sn (i32)0xff800000
+vfma.f32 s20, s13, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0xff800000  Sn (i32)0x00000000
+vfma.f32 s10, s23, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7f800000  Sn (i32)0x00000000
+---- VFMS (fp, VFPv4) ----
+vfms.f64 d0,  d11, d12   :: Qd 0x7ff80000 0x00000000  Qm 0xfff00000 00000000  Qn 0x7ff80000 00000000
+vfms.f64 d7,  d1,  d6    :: Qd 0x7ff80000 0x00000000  Qm 0x7ff00000 00000000  Qn 0x7ff80000 00000000
+vfms.f64 d0,  d5,  d2    :: Qd 0xfff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0xbff00000 00000000
+vfms.f64 d10, d13, d15   :: Qd 0xfff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0x00000000 00000000
+vfms.f64 d10, d13, d15   :: Qd 0xfff80000 0x00000000  Qm 0x7ff80000 00000000  Qn 0x7ff80000 00000000
+vfms.f64 d20, d25, d22   :: Qd 0x409067a4 0x842fc4c9  Qm 0x40370a3d 70a3d70a  Qn 0xc046c8cb 295e9e1b
+vfms.f64 d23, d24, d25   :: Qd 0x41bbe864 0x1f5b9999  Qm 0xc1153b41 e6666666  Qn 0x40950800 00000000
+vfms.f64 d20, d31, d12   :: Qd 0x41e0a1cf 0xd2ac68f6  Qm 0x40e7ce60 00000000  Qn 0xc0e65b4f 3b645a1d
+vfms.f64 d19, d25, d27   :: Qd 0xc1d860c7 0xf7191999  Qm 0x40f767bc 28f5c28f  Qn 0x40d0aa40 00000000
+vfms.f64 d30, d15, d2    :: Qd 0xc20524a9 0x817fcbf4  Qm 0xc0e64c67 ae147ae1  Qn 0xc10e5796 147ae148
+vfms.f64 d23, d24, d5    :: Qd 0xc0df8bff 0x7ffffe04  Qm 0x40380000 00000000  Qn 0x40950800 00000000
+vfms.f64 d10, d11, d2    :: Qd 0xc1895139 0x97f00000  Qm 0x40e7ce60 00000000  Qn 0x40910400 00000000
+vfms.f64 d29, d15, d7    :: Qd 0xc1b65928 0xd5fe0000  Qm 0x406ac000 00000000  Qn 0x413abc01 00000000
+vfms.f64 d30, d11, d12   :: Qd 0xc1df20a6 0xd7bc2cb0  Qm 0x4115bb3e 3d70a3d7  Qn 0x40b6eb02 4dd2f1aa
+vfms.f64 d27, d21, d6    :: Qd 0xbfb363ef 0x37b9be48  Qm 0x4041000f 12c27a63  Qn 0x3f6421c0 44284dfd
+vfms.f64 d30, d31, d2    :: Qd 0xc111fc57 0xf7ffffe0  Qm 0x40a58400 00000000  Qn 0x405ac000 00000000
+vfms.f64 d13, d24, d5    :: Qd 0xc132771c 0x6466665e  Qm 0x408b5000 00000000  Qn 0x4095a266 66666666
+vfms.f64 d10, d11, d2    :: Qd 0xc0e9f35f 0x34bc6981  Qm 0x407e7964 5a1cac08  Qn 0x405b4000 00000000
+vfms.f64 d29, d25, d7    :: Qd 0x7ff00000 0x00000000  Qm 0xfff00000 00000000  Qn 0x409b6000 00000000
+vfms.f64 d0,  d11, d12   :: Qd 0x7ff00000 0x00000000  Qm 0x7ff00000 00000000  Qn 0xc0b69a78 51eb851f
+vfms.f64 d27, d21, d16   :: Qd 0x40aa004b 0x17cc0c5d  Qm 0x407c83fb b97f122f  Qn 0xc01d2da3 2101d847
+vfms.f64 d0,  d5,  d2    :: Qd 0x7ff00000 0x00000000  Qm 0x7ff00000 00000000  Qn 0xfff00000 00000000
+vfms.f64 d20, d13, d15   :: Qd 0x7ff80000 0x00000000  Qm 0xfff00000 00000000  Qn 0x00000000 00000000
+vfms.f64 d10, d23, d15   :: Qd 0x7ff80000 0x00000000  Qm 0x7ff00000 00000000  Qn 0x00000000 00000000
+vfms.f32 s0,  s11, s12   :: Qd 0x55555555 0x7fc00000  Sm (i32)0xff800000  Sn (i32)0x7fc00000
+vfms.f32 s7,  s1,  s6    :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7f800000  Sn (i32)0x7fc00000
+vfms.f32 s0,  s5,  s2    :: Qd 0x55555555 0xffc00000  Sm (i32)0x7fc00000  Sn (i32)0xbf800000
+vfms.f32 s10, s13, s15   :: Qd 0x55555555 0xffc00000  Sm (i32)0x7fc00000  Sn (i32)0x00000000
+vfms.f32 s10, s13, s15   :: Qd 0x55555555 0xffc00000  Sm (i32)0x7fc00000  Sn (i32)0x7fc00000
+vfms.f32 s20, s25, s22   :: Qd 0x55555555 0x44833ce4  Sm (i32)0x41b851ec  Sn (i32)0xc2364659
+vfms.f32 s23, s24, s25   :: Qd 0x55555555 0x4ddf4321  Sm (i32)0xc8a9da0f  Sn (i32)0x44a84000
+vfms.f32 s20, s31, s12   :: Qd 0x55555555 0x4f050e7f  Sm (i32)0x473e7300  Sn (i32)0xc732da7a
+vfms.f32 s19, s25, s27   :: Qd 0x55555555 0xcec3063f  Sm (i32)0x47bb3de1  Sn (i32)0x46855200
+vfms.f32 s30, s15, s2    :: Qd 0x55555555 0xd029254c  Sm (i32)0xc732633d  Sn (i32)0xc872bcb1
+vfms.f32 s23, s24, s5    :: Qd 0x55555555 0xc6fc6000  Sm (i32)0x41c00000  Sn (i32)0x44a84000
+vfms.f32 s10, s11, s2    :: Qd 0x55555555 0xcc4a89cd  Sm (i32)0x473e7300  Sn (i32)0x44882000
+vfms.f32 s29, s15, s7    :: Qd 0x55555555 0xcdb2c947  Sm (i32)0x43560000  Sn (i32)0x49d5e008
+vfms.f32 s30, s11, s12   :: Qd 0x55555555 0xcef90536  Sm (i32)0x48add9f2  Sn (i32)0x45b75812
+vfms.f32 s27, s21, s6    :: Qd 0x55555555 0xbdab1f7a  Sm (i32)0x42080079  Sn (i32)0x3b210e02
+vfms.f32 s30, s31, s2    :: Qd 0x55555555 0xc88fe2c0  Sm (i32)0x452c2000  Sn (i32)0x42d60000
+vfms.f32 s13, s24, s5    :: Qd 0x55555555 0xc993b8e3  Sm (i32)0x445a8000  Sn (i32)0x44ad1333
+vfms.f32 s10, s11, s2    :: Qd 0x55555555 0xc74f9afc  Sm (i32)0x43f3cb23  Sn (i32)0x42da0000
+vfms.f32 s29, s25, s7    :: Qd 0x55555555 0x7f800000  Sm (i32)0xff800000  Sn (i32)0x44db0000
+vfms.f32 s0,  s11, s12   :: Qd 0x55555555 0x7f800000  Sm (i32)0x7f800000  Sn (i32)0xc5b4d3c3
+vfms.f32 s27, s21, s16   :: Qd 0x55555555 0x45500239  Sm (i32)0x43e41fde  Sn (i32)0xc0e96d19
+vfms.f32 s0,  s5,  s2    :: Qd 0x55555555 0x7f800000  Sm (i32)0x7f800000  Sn (i32)0xff800000
+vfms.f32 s20, s13, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0xff800000  Sn (i32)0x00000000
+vfms.f32 s10, s23, s15   :: Qd 0x55555555 0x7fc00000  Sm (i32)0x7f800000  Sn (i32)0x00000000
diff --git a/none/tests/arm/vfpv4_fma.vgtest b/none/tests/arm/vfpv4_fma.vgtest
new file mode 100644
index 0000000..0284a3d
--- /dev/null
+++ b/none/tests/arm/vfpv4_fma.vgtest
@@ -0,0 +1,2 @@
+prog: vfpv4_fma
+vgopts: -q