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:
parent
07b0096e5b
commit
3628025ac6
2 changed files with 37 additions and 1 deletions
|
@ -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.
|
||||
|
|
16
gcc/testsuite/gcc.target/loongarch/fcopysign.c
Normal file
16
gcc/testsuite/gcc.target/loongarch/fcopysign.c
Normal 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue