<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-MailFormatvorlage17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.E-MailFormatvorlage18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=DE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>No progress with my floating point issue.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>I switch to double in my short test application because they can be at least correctly printed (but operations like multiplication does not work).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>using System;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>namespace foobar {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>   public class foo {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>      public static void Main(string[] args) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>         double fa = 1.4;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>         double fb = 1.3;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>         double fab = fa * fb;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>         Console.WriteLine("fa * fb = {0}", fab);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>      }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>   }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>If I am using float instead of double I got very strange results like -3.513059E-06. Maybe interesting is that each time I invoke the app I got a different result for floats.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>With double I can also print the values with Console.WriteLine which is not possible with float. The result here is<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>fa * fb = 1.4<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>whereby the result is always fa (if I change fa to 1.7 I get 1.7 as result).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Following this thread here <a href="http://software.1713.n2.nabble.com/Arm9-NS9215-floating-point-troubles-td5191588.html">http://software.1713.n2.nabble.com/Arm9-NS9215-floating-point-troubles-td5191588.html</a> I could see that I have the same swapped 32bit high/low problem on my target. Unfortunately it did not fix my problem. I could see with my debugger (I am able to remote debug on the target) that several calls to mono_method_to_ir are executed before mono_decompose_soft_float is called where the fix is done in the link above. So I added the fix to mono_method_to_ir in the switch case statement for (*ip) case CEE_LDC_R8 (I tested both variants without success).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>The double value in ip is:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'> (gdb) p/x ip[0]@8<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>$4 = {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xf6, 0x3f}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'> <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>With the fix/hack I got the correct order as it is represented on the target system:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>(gdb) p/x tmp[0]@8<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>$8 = {0x66, 0x66, 0xf6, 0x3f, 0x66, 0x66, 0x66, 0x66}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>6447                            readr8 (tmp, d);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>(gdb) n<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>6451                            ip += 8;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'> (gdb) p *d<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>$7 = 1.3999999999999999<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>This change seems to have no effect on the result but at least I can see the correct values for ‘double *d’ in mono_method_to_ir and ‘DVal d.vald’ in mono_decompose_soft_float.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>In fact I am completely out of ideas where to continue the search for an error (Mono is completely new for me).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>What happens for ‘fa * fb’, where can I break in the code to check some values?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Can I dump out the intermediate representation at some place? Would this help?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Any idea why I get different outputs using floats for each run of the test app?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Any idea why I got the first value fa as result for each run using double?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Any idea, comment, hint would be helpful.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Best regards,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'>Dennis Krzyzaniak<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";mso-fareast-language:DE'>Von:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";mso-fareast-language:DE'> mono-devel-list-bounces@lists.ximian.com [mailto:mono-devel-list-bounces@lists.ximian.com] <b>Im Auftrag von </b>Dennis Krzyzaniak<br><b>Gesendet:</b> Donnerstag, 7. Juni 2012 09:14<br><b>An:</b> mono-devel-list@lists.ximian.com<br><b>Betreff:</b> [Mono-dev] floating point arithmetic on ARMv4t (arm920t)<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi all,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span lang=EN-US>I am still working to get Mono running on an ARM920t (ARMv4t). Currently I am hitting a problem with broken floating point arithmetic on my device. Using this little test app:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>namespace foobar {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   public class foo {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>      public static void Main(string[] args) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         int i = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         float fa = 1.0001F;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         float fb = 0.0001F;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         float fs = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         for (i=0; i<5; i++)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>            fs = fs * fa + fb;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>            Console.WriteLine("float loop {0} {1}", i, fs);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>         }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>      }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Gives the result:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>/host/bin # ./mono hello_world.exe<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>float loop 0 -3.513059E-06<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>float loop 1 -3.513059E-06<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>float loop 2 -3.513059E-06<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>float loop 3 -3.513059E-06<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>float loop 4 -3.513059E-06<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>The processor has no FPU so I used the soft float configuration. I also tried little and big endian build with the same behavior.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>I described my configuration settings in this post: <a href="http://lists.ximian.com/pipermail/mono-devel-list/2012-June/038922.html">http://lists.ximian.com/pipermail/mono-devel-list/2012-June/038922.html</a> . The only new thing is that I am using CFLAGS now to avoid the default optimization level O2 which also breaks my runtime.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>I am completely new to Mono and need some help to find the correct place where the error could result from. I guess it is somewhere in method-to-ir.c? Can you point me to the source code places where maybe some adaptions could be needed that I can test a little bit? I think it is something related to my ARM architecture but I am not sure.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Best regards,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Dennis Krzyzaniak<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p></div></body></html>