The implementation of an float ordered <= looks buggy, but maybe I'm not reading the assembly right. This is lesf2vfp.S in compiler-rt, and it has this code: // extern int __lesf2vfp(float a, float b); // // Returns one iff a <= b and neither is NaN. // Uses Darwin calling convention where single precision arguments are passsed // like 32-bit ints // DEFINE_COMPILERRT_FUNCTION(__lesf2vfp) fmsr s14, r0 // move from GPR 0 to float register fmsr s15, r1 // move from GPR 1 to float register fcmps s14, s15 fmstat movls r0, #1 // set result register to 1 if equal movhi r0, #0 bx lr If I read this right, the high bits of r0 are always cleared (by the movhi) while the low bits are conditionally set to 1 (by the movls), but there's nothing to clear the r0's low bits in the false case. Is this a bug or have I misunderstood the assembly? Nick -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100407/d2a2a64b/attachment.html>
movhi means mov if unsigned Higher movls means mov if unsigned Lower or Same so depending on the comparison result r0 holds 1 or 0 Rodolph. From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Nick Lewycky Sent: 08 April 2010 06:51 To: LLVM Developers Mailing List Cc: Steve Canon Subject: [LLVMdev] compiler-rt's arm vfp o<= implementation The implementation of an float ordered <= looks buggy, but maybe I'm not reading the assembly right. This is lesf2vfp.S in compiler-rt, and it has this code: // extern int __lesf2vfp(float a, float b); // // Returns one iff a <= b and neither is NaN. // Uses Darwin calling convention where single precision arguments are passsed // like 32-bit ints // DEFINE_COMPILERRT_FUNCTION(__lesf2vfp) fmsr s14, r0 // move from GPR 0 to float register fmsr s15, r1 // move from GPR 1 to float register fcmps s14, s15 fmstat movls r0, #1 // set result register to 1 if equal movhi r0, #0 bx lr If I read this right, the high bits of r0 are always cleared (by the movhi) while the low bits are conditionally set to 1 (by the movls), but there's nothing to clear the r0's low bits in the false case. Is this a bug or have I misunderstood the assembly? Nick -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100408/225d9739/attachment.html>