Bug 34813 - Casting Double to Int64 yields invalid value on PowerPC
Summary: Casting Double to Int64 yields invalid value on PowerPC
Status: NEW
Alias: None
Product: Runtime
Classification: Mono
Component: JIT (show other bugs)
Version: 4.0.0
Hardware: Other Linux
: --- normal
Target Milestone: ---
Assignee: Bugzilla
Depends on:
Reported: 2015-10-13 09:26 UTC by Pavel Dyntera
Modified: 2015-10-14 10:06 UTC (History)
2 users (show)

See Also:
Is this bug a regression?: ---
Last known good build:


Description Pavel Dyntera 2015-10-13 09:26:28 UTC
When following code C# is executed on PowerPC (32bit) architecture, result value yields zero (0) instead of 5000. The actual device is custom PowerPC router with OpenWrt distribution targetted to PPC40x.

double a = 5000.5;
long b = (long)a;
Console.WriteLine("b = {0}", b);

I have found similar or same issue described on: http://mono.1490590.n4.nabble.com/CONV-i8-conversion-problem-on-E500-power-pc-td4658483.html

In the 'gint64 mono_fconv_i8 (double v)' method defined in 'jit-calls.c', the 'double v' parameter seems to be always interpreted as zero, regardless of actual value in IL.
Comment 1 Pavel Dyntera 2015-10-13 09:35:19 UTC
Bug seems to be similar to https://bugzilla.xamarin.com/show_bug.cgi?format=multiple&id=7981 , except there it is reported for the MIPS architecture.
Comment 2 Pavel Dyntera 2015-10-14 10:06:19 UTC
I have narrowed the problem to use of floating point registers when performing internal call. JIT emits instructions that uses floating point registers (to a degree), but the actual internal call method implementation (mono_fconv_i8) seems to use integer register to access the 'double v' parameter.

This could probably an issue of the toochain I am to cross compile mono or its configuration.

Note You need to log in before you can comment on or make changes to this bug.