2017-04-08 Jim Wilson <jim.wilson@linaro.org>
+ * simulator.c (do_vec_FCVTL): New.
+ (do_vec_op1): Call do_vec_FCVTL.
+
* simulator.c (do_scalar_FCMGE_zero, do_scalar_FCMLE_zero,
do_scalar_FCMGT_zero, do_scalar_FCMEQ_zero, do_scalar_FCMLT_zero): New.
(do_scalar_vec): Add calls to new functions.
}
}
+/* Float point vector convert to longer (precision). */
+static void
+do_vec_FCVTL (sim_cpu *cpu)
+{
+ /* instr[31] = 0
+ instr[30] = half (0) / all (1)
+ instr[29,23] = 00 1110 0
+ instr[22] = single (0) / double (1)
+ instr[21,10] = 10 0001 0111 10
+ instr[9,5] = Rn
+ instr[4,0] = Rd. */
+
+ unsigned rn = INSTR (9, 5);
+ unsigned rd = INSTR (4, 0);
+ unsigned full = INSTR (30, 30);
+ unsigned i;
+
+ NYI_assert (31, 31, 0);
+ NYI_assert (29, 23, 0x1C);
+ NYI_assert (21, 10, 0x85E);
+
+ TRACE_DECODE (cpu, "emulated at line %d", __LINE__);
+ if (INSTR (22, 22))
+ {
+ for (i = 0; i < 2; i++)
+ aarch64_set_vec_double (cpu, rd, i,
+ aarch64_get_vec_float (cpu, rn, i + 2*full));
+ }
+ else
+ {
+ HALT_NYI;
+
+#if 0
+ /* TODO: Implement missing half-float support. */
+ for (i = 0; i < 4; i++)
+ aarch64_set_vec_float (cpu, rd, i,
+ aarch64_get_vec_halffloat (cpu, rn, i + 4*full));
+#endif
+ }
+}
+
static void
do_vec_FABS (sim_cpu *cpu)
{
case 0x33: do_vec_FMLA (cpu); return;
case 0x35: do_vec_fadd (cpu); return;
+ case 0x1E:
+ switch (INSTR (20, 16))
+ {
+ case 0x01: do_vec_FCVTL (cpu); return;
+ default: HALT_NYI;
+ }
+
case 0x2E:
switch (INSTR (20, 16))
{
--- /dev/null
+# mach: aarch64
+
+# Check the FP convert to longer precision: fcvtl, fcvtl2.
+# Test values 1.5, -1.5, INTMAX, and INT_MIN.
+
+.include "testutils.inc"
+
+ .data
+ .align 4
+input:
+ .word 1069547520
+ .word 3217031168
+ .word 1325400064
+ .word 3472883712
+d1p5:
+ .word 0
+ .word 1073217536
+dm1p5:
+ .word 0
+ .word -1074266112
+dimax:
+ .word 0
+ .word 1105199104
+dimin:
+ .word 0
+ .word -1042284544
+
+ start
+ adrp x0, input
+ add x0, x0, #:lo12:input
+ ld1 {v0.4s}, [x0]
+
+ fcvtl v1.2d, v0.2s
+ mov x1, v1.d[0]
+ adrp x2, d1p5
+ ldr x3, [x2, #:lo12:d1p5]
+ cmp x1, x3
+ bne .Lfailure
+ mov x1, v1.d[1]
+ adrp x2, dm1p5
+ ldr x3, [x2, #:lo12:dm1p5]
+ cmp x1, x3
+ bne .Lfailure
+
+ fcvtl2 v2.2d, v0.4s
+ mov x1, v2.d[0]
+ adrp x2, dimax
+ ldr x3, [x2, #:lo12:dimax]
+ cmp x1, x3
+ bne .Lfailure
+ mov x1, v2.d[1]
+ adrp x2, dimin
+ ldr x3, [x2, #:lo12:dimin]
+ cmp x1, x3
+ bne .Lfailure
+
+ pass
+.Lfailure:
+ fail