From c1d6dca694d001efe3d332db539348a9829d3869 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 4 May 2022 18:37:28 +0200 Subject: [PATCH] [compiler-rt][AVR] Use correct return value for __ledf2 etc 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 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler-rt/lib/builtins/fp_compare_impl.inc b/compiler-rt/lib/builtins/fp_compare_impl.inc index 40fc7df..a9a4f6f 100644 --- a/compiler-rt/lib/builtins/fp_compare_impl.inc +++ b/compiler-rt/lib/builtins/fp_compare_impl.inc @@ -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; -- 2.7.4