From 7f01b2539b5d54a9f8c89881772882c453cd7135 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Wed, 28 Jul 2004 19:16:10 +0000 Subject: [PATCH] Add notes on bug involving casting ulong -> double, thanks to Nate Begeman. llvm-svn: 15307 --- llvm/lib/Target/PowerPC/README.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/llvm/lib/Target/PowerPC/README.txt b/llvm/lib/Target/PowerPC/README.txt index e11449efdf95..d881fc9a2418 100644 --- a/llvm/lib/Target/PowerPC/README.txt +++ b/llvm/lib/Target/PowerPC/README.txt @@ -6,6 +6,23 @@ Current bugs: * large fixed-size allocas not correct, although should be closer to working. Added code in PPCRegisterInfo.cpp to do >16bit subtractions to the stack pointer. +* ulong to double. ahhh, here's the problem: + floatdidf assumes signed longs. so if the high but of a ulong + just happens to be set, you get the wrong sign. The fix for this + is to call cmpdi2 to compare against zero, if so shift right by one, + convert to fp, and multiply by (add to itself). the sequence would + look like: + {r3:r4} holds ulong a; + li r5, 0 + li r6, 0 (set r5:r6 to ulong 0) + call cmpdi2 ==> sets r3 <, =, > 0 + if r3 > 0 + call floatdidf as usual + else + shift right ulong a, 1 (we could use emitShift) + call floatdidf + fadd f1, f1, f1 (fp left shift by 1) +* linking llvmg++ .s files with gcc instead of g++ Codegen improvements needed: * no alias analysis causes us to generate slow code for Shootout/matrix