diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 88247185779baec67f3dc38ebcedeaecf35b4d18..8a0a77b957fb09bee1bd30d934131e3607804ed9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-10  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* pa/quadlib.c (_U_Qfneg): Toggle sign bit instead of subtracting from
+	zero.
+
 2005-04-10  Kazu Hirata  <kazu@cs.umass.edu>
 
 	* config/arm/arm.c: Fix a comment typo.
diff --git a/gcc/config/pa/quadlib.c b/gcc/config/pa/quadlib.c
index 6dbfdcfe9a58877489ee25a057814bbf6bf2c03f..c377417bdcf70094408113c143ae8107b555954d 100644
--- a/gcc/config/pa/quadlib.c
+++ b/gcc/config/pa/quadlib.c
@@ -1,5 +1,5 @@
 /* Subroutines for long double support.
-   Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -160,11 +160,19 @@ _U_Qfcomp (long double a, long double b)
 }
 
 
-/* This violates the IEEE standard.  It is better to multiply by -1.0L.  */
+/* Negate long double A.  */
 long double
 _U_Qfneg (long double a)
 {
-  return (0.0L - a);
+  union
+   {
+     long double ld;
+     int i[4];
+   } u;
+
+  u.ld = a;
+  u.i[0] ^= 0x80000000;
+  return u.ld;
 }
 
 #ifdef __LP64__