LoongArch: Add fcopysign instructions

Add fcopysign.{s,d} with the names copysign{sf,df}3 so GCC will expand
__builtin_copysign{f,} to a single instruction.

Link: https://sourceware.org/pipermail/libc-alpha/2022-November/143177.html

gcc/ChangeLog:

	* config/loongarch/loongarch.md (UNSPEC_FCOPYSIGN): New unspec.
	(type): Add fcopysign.
	(copysign<mode>3): New instruction template.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/fcopysign.c: New test.
This commit is contained in:
Xi Ruoyao 2022-11-04 15:12:22 +08:00
parent 07b0096e5b
commit 3628025ac6
No known key found for this signature in database
GPG key ID: ACAAD20E19E710E3
2 changed files with 37 additions and 1 deletions

View file

@ -37,6 +37,7 @@
UNSPEC_FCLASS
UNSPEC_FMAX
UNSPEC_FMIN
UNSPEC_FCOPYSIGN
;; Override return address for exception handling.
UNSPEC_EH_RETURN
@ -214,6 +215,7 @@
;; fabs floating point absolute value
;; fneg floating point negation
;; fcmp floating point compare
;; fcopysign floating point copysign
;; fcvt floating point convert
;; fsqrt floating point square root
;; frsqrt floating point reciprocal square root
@ -226,7 +228,7 @@
"unknown,branch,jump,call,load,fpload,fpidxload,store,fpstore,fpidxstore,
prefetch,prefetchx,condmove,mgtf,mftg,const,arith,logical,
shift,slt,signext,clz,trap,imul,idiv,move,
fmove,fadd,fmul,fmadd,fdiv,frdiv,fabs,fneg,fcmp,fcvt,fsqrt,
fmove,fadd,fmul,fmadd,fdiv,frdiv,fabs,fneg,fcmp,fcopysign,fcvt,fsqrt,
frsqrt,accext,accmod,multi,atomic,syncloop,nop,ghost"
(cond [(eq_attr "jirl" "!unset") (const_string "call")
(eq_attr "got" "load") (const_string "load")
@ -976,6 +978,24 @@
(set_attr "mode" "<UNITMODE>")])
;;
;; ....................
;;
;; FLOATING POINT COPYSIGN
;;
;; ....................
(define_insn "copysign<mode>3"
[(set (match_operand:ANYF 0 "register_operand" "=f")
(unspec:ANYF [(match_operand:ANYF 1 "register_operand" "f")
(match_operand:ANYF 2 "register_operand" "f")]
UNSPEC_FCOPYSIGN))]
"TARGET_HARD_FLOAT"
"fcopysign.<fmt>\t%0,%1,%2"
[(set_attr "type" "fcopysign")
(set_attr "mode" "<UNITMODE>")])
;;
;; ...................
;;
;; Count leading zeroes.

View file

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-options "-mdouble-float" } */
/* { dg-final { scan-assembler "fcopysign\\.s" } } */
/* { dg-final { scan-assembler "fcopysign\\.d" } } */
double
my_copysign (double a, double b)
{
return __builtin_copysign (a, b);
}
float
my_copysignf (float a, float b)
{
return __builtin_copysignf (a, b);
}