aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2024-09-14 10:12:54 +0200
committerGeorg-Johann Lay <avr@gjlay.de>2024-09-14 14:54:06 +0200
commita900349485cc4753084527bf0234f173967979b0 (patch)
treec9a44f2621393d70acf2921a372de7fa9762e3b0 /gcc
parent99b8be43d7c548db127ee4f4d0918c55edc68b3f (diff)
downloadgcc-a900349485cc4753084527bf0234f173967979b0.zip
gcc-a900349485cc4753084527bf0234f173967979b0.tar.gz
gcc-a900349485cc4753084527bf0234f173967979b0.tar.bz2
AVR: Use rtx code copysign.
gcc/ * config/avr/avr.md (UNSPEC_COPYSIGN): Remove define_enum. (copysignsf3): Use copysign instead of UNSPEC_COPYSIGN. Allow const_double for operand 2.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/avr/avr.md17
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index 429f537..2abf3c3 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -87,7 +87,6 @@
UNSPEC_FMUL
UNSPEC_FMULS
UNSPEC_FMULSU
- UNSPEC_COPYSIGN
UNSPEC_INSERT_BITS
UNSPEC_ROUND
])
@@ -9272,12 +9271,18 @@
;; Copysign
(define_insn "copysignsf3"
- [(set (match_operand:SF 0 "register_operand" "=r")
- (unspec:SF [(match_operand:SF 1 "register_operand" "0")
- (match_operand:SF 2 "register_operand" "r")]
- UNSPEC_COPYSIGN))]
+ [(set (match_operand:SF 0 "register_operand" "=r")
+ (copysign:SF (match_operand:SF 1 "register_operand" "0")
+ (match_operand:SF 2 "nonmemory_operand" "rF")))]
""
- "bst %D2,7\;bld %D0,7"
+ {
+ if (const_double_operand (operands[2], SFmode))
+ {
+ rtx xmsb = simplify_gen_subreg (QImode, operands[2], SFmode, 3);
+ return INTVAL (xmsb) < 0 ? "set\;bld %D0,7" : "clt\;bld %D0,7";
+ }
+ return "bst %D2,7\;bld %D0,7";
+ }
[(set_attr "length" "2")])
;; Swap Bytes (change byte-endianness)