[compiler-rt][AVR] Use correct return value for __ledf2 etc
authorAyke van Laethem <aykevanlaethem@gmail.com>
Wed, 4 May 2022 16:37:28 +0000 (18:37 +0200)
committerAyke van Laethem <aykevanlaethem@gmail.com>
Wed, 4 May 2022 20:51:39 +0000 (22:51 +0200)
Previously the default was long, which is 32-bit on AVR. But avr-gcc
expects a smaller value: it reads the return value from r24.

This is actually a regression from https://reviews.llvm.org/D98205.
Before D98205, the return value was an enum (which was 2 bytes in size)
which was compatible with the 1-byte return value that avr-gcc was
expecting. But long is 4 bytes and thus places the significant return
value in a different register.

Differential Revision: https://reviews.llvm.org/D124939

compiler-rt/lib/builtins/fp_compare_impl.inc

index 40fc7df..a9a4f6f 100644 (file)
@@ -18,6 +18,9 @@ typedef int CMP_RESULT;
 #elif __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 4
 // LLP64 ABIs use long long instead of long.
 typedef long long CMP_RESULT;
+#elif __AVR__
+// AVR uses a single byte for the return value.
+typedef char CMP_RESULT;
 #else
 // Otherwise the comparison functions return long.
 typedef long CMP_RESULT;