[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [ARM - FCVT inst] : Difference in calculated value
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [ARM - FCVT inst] : Difference in calculated value |
Date: |
Fri, 22 Aug 2014 15:28:20 +0100 |
On 19 August 2014 13:39, Gaurav Sharma <address@hidden> wrote:
> I am running a simple bare metal program with only the above specified
> instruction
>
> [Instrn]
> fcvt h16 s25
>
> [register values]
> SIMD register [25] = 0x9EA82A22AB98FBA8L
> FPCR = 0x40ae2f54 [with according mask removing the UFE and other
> unnecessary bit]
Thanks. My test case produced from that:
===begin===
/* aarch64-linux-gnu-gcc -g -Wall -o fcvt fcvt.c -static */
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void do_fcvt(uint32_t fpcr, uint64_t a)
{
uint64_t r;
printf("a = 0x%016" PRIx64 " fpcr = 0x%08x\n", a, fpcr);
__asm__ volatile(
"fmov d25, %[a]\n"
"mrs x3, FPCR\n"
"msr FPCR, %[fpcr]\n"
"isb\n"
"fcvt h16, s25\n"
"msr FPCR, x3\n"
"isb\n"
"fmov %[r], d16\n"
: [r] "=r" (r)
: [a] "r" (a),
[fpcr] "r" (fpcr)
: "d16", "d25", "x3"
);
printf("result = 0x%016" PRIx64 "\n", r);
}
int main(void)
{
do_fcvt(0x40ae2f54 & 0x07f70000, 0x9EA82A22AB98FBA8ull);
return 0;
}
===endit===
which on a Fast Model produces:
address@hidden:~# ./fcvt
a = 0x9ea82a22ab98fba8 fpcr = 0x00a60000
result = 0x0000000000008001
and on QEMU:
e104462:trusty:qemu$ ./build/x86/aarch64-linux-user/qemu-aarch64 /tmp/fcvt
a = 0x9ea82a22ab98fba8 fpcr = 0x40ae2f54
result = 0x0000000000008000
so we are indeed getting the rounding wrong here.
thanks
-- PMM