diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index 6545583..2389c05 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -955,6 +955,16 @@ cpow 0.75 1.25 1.0 1.0 xfail-rounding
 cpow 0.75 1.25 1.0 0.0
 cpow 0.75 1.25 0.0 1.0
 
+csin 0.75 1e6
+csin 0.75 -1e6
+csin -0.75 1e6
+csin -0.75 -1e6
+
+csinh 1e6 0.75
+csinh -1e6 0.75
+csinh 1e6 -0.75
+csinh -1e6 -0.75
+
 csqrt 0 0
 csqrt 0 -0
 csqrt -0 0
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 03c3831..ba8e8ff 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -6466,6 +6466,8 @@ static const struct test_c_c_data csin_test_data[] =
     TEST_c_c (csin, 0x1p-16434L, 22730, 1.217853148905605987081057582351152052687e4924L, plus_oflow, OVERFLOW_EXCEPTION),
 #endif
 
+    AUTO_TESTS_c_c (csin),
+
     TEST_c_c (csin, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION),
     TEST_c_c (csin, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION),
   };
@@ -6563,6 +6565,8 @@ static const struct test_c_c_data csinh_test_data[] =
     TEST_c_c (csinh, 22730, 0x1p-16434L, plus_oflow, 1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION),
 #endif
 
+    AUTO_TESTS_c_c (csinh),
+
     TEST_c_c (csinh, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION),
     TEST_c_c (csinh, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION),
   };
diff --git a/math/s_csin.c b/math/s_csin.c
index f1ddb4e..ceee25f 100644
--- a/math/s_csin.c
+++ b/math/s_csin.c
@@ -52,6 +52,9 @@ __csin (__complex__ double x)
 	      cosix = 1.0;
 	    }
 
+	  if (negate)
+	    sinix = -sinix;
+
 	  if (fabs (__imag__ x) > t)
 	    {
 	      double exp_t = __ieee754_exp (t);
@@ -86,9 +89,6 @@ __csin (__complex__ double x)
 	      __imag__ retval = __ieee754_sinh (__imag__ x) * cosix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabs (__real__ retval) < DBL_MIN)
 	    {
 	      volatile double force_underflow
diff --git a/math/s_csinf.c b/math/s_csinf.c
index 6c68189..daca689 100644
--- a/math/s_csinf.c
+++ b/math/s_csinf.c
@@ -52,6 +52,9 @@ __csinf (__complex__ float x)
 	      cosix = 1.0f;
 	    }
 
+	  if (negate)
+	    sinix = -sinix;
+
 	  if (fabsf (__imag__ x) > t)
 	    {
 	      float exp_t = __ieee754_expf (t);
@@ -86,9 +89,6 @@ __csinf (__complex__ float x)
 	      __imag__ retval = __ieee754_sinhf (__imag__ x) * cosix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabsf (__real__ retval) < FLT_MIN)
 	    {
 	      volatile float force_underflow
diff --git a/math/s_csinh.c b/math/s_csinh.c
index c607c2a..d940c97 100644
--- a/math/s_csinh.c
+++ b/math/s_csinh.c
@@ -52,6 +52,9 @@ __csinh (__complex__ double x)
 	      cosix = 1.0;
 	    }
 
+	  if (negate)
+	    cosix = -cosix;
+
 	  if (fabs (__real__ x) > t)
 	    {
 	      double exp_t = __ieee754_exp (t);
@@ -86,9 +89,6 @@ __csinh (__complex__ double x)
 	      __imag__ retval = __ieee754_cosh (__real__ x) * sinix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabs (__real__ retval) < DBL_MIN)
 	    {
 	      volatile double force_underflow
diff --git a/math/s_csinhf.c b/math/s_csinhf.c
index 848f5d1..4e0bc03 100644
--- a/math/s_csinhf.c
+++ b/math/s_csinhf.c
@@ -52,6 +52,9 @@ __csinhf (__complex__ float x)
 	      cosix = 1.0f;
 	    }
 
+	  if (negate)
+	    cosix = -cosix;
+
 	  if (fabsf (__real__ x) > t)
 	    {
 	      float exp_t = __ieee754_expf (t);
@@ -86,9 +89,6 @@ __csinhf (__complex__ float x)
 	      __imag__ retval = __ieee754_coshf (__real__ x) * sinix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabsf (__real__ retval) < FLT_MIN)
 	    {
 	      volatile float force_underflow
diff --git a/math/s_csinhl.c b/math/s_csinhl.c
index a437d16..eeb2212 100644
--- a/math/s_csinhl.c
+++ b/math/s_csinhl.c
@@ -52,6 +52,9 @@ __csinhl (__complex__ long double x)
 	      cosix = 1.0;
 	    }
 
+	  if (negate)
+	    cosix = -cosix;
+
 	  if (fabsl (__real__ x) > t)
 	    {
 	      long double exp_t = __ieee754_expl (t);
@@ -86,9 +89,6 @@ __csinhl (__complex__ long double x)
 	      __imag__ retval = __ieee754_coshl (__real__ x) * sinix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabsl (__real__ retval) < LDBL_MIN)
 	    {
 	      volatile long double force_underflow
diff --git a/math/s_csinl.c b/math/s_csinl.c
index accaeb5..a4b1eb5 100644
--- a/math/s_csinl.c
+++ b/math/s_csinl.c
@@ -52,6 +52,9 @@ __csinl (__complex__ long double x)
 	      cosix = 1.0;
 	    }
 
+	  if (negate)
+	    sinix = -sinix;
+
 	  if (fabsl (__imag__ x) > t)
 	    {
 	      long double exp_t = __ieee754_expl (t);
@@ -86,9 +89,6 @@ __csinl (__complex__ long double x)
 	      __imag__ retval = __ieee754_sinhl (__imag__ x) * cosix;
 	    }
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-
 	  if (fabsl (__real__ retval) < LDBL_MIN)
 	    {
 	      volatile long double force_underflow
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 2e2722d..101831f 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1120,9 +1120,9 @@ ildouble: 3
 ldouble: 3
 
 Function: Real part of "csin_upward":
-double: 1
+double: 2
 float: 3
-idouble: 1
+idouble: 2
 ifloat: 3
 ildouble: 3
 ldouble: 3
@@ -1148,9 +1148,9 @@ idouble: 1
 ifloat: 1
 
 Function: Real part of "csinh_downward":
-double: 1
+double: 2
 float: 2
-idouble: 1
+idouble: 2
 ifloat: 2
 ildouble: 3
 ldouble: 3
