summaryrefslogtreecommitdiff
path: root/usr/src/libm/src/mvec/vsqrt_.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/libm/src/mvec/vsqrt_.c')
-rw-r--r--usr/src/libm/src/mvec/vsqrt_.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/usr/src/libm/src/mvec/vsqrt_.c b/usr/src/libm/src/mvec/vsqrt_.c
new file mode 100644
index 0000000..c0d6bbf
--- /dev/null
+++ b/usr/src/libm/src/mvec/vsqrt_.c
@@ -0,0 +1,87 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "@(#)vsqrt_.c 1.4 06/01/31 SMI"
+
+extern void __vsqrt( int, double *, int, double *, int );
+
+#pragma weak vsqrt_ = __vsqrt_
+
+#ifndef LIBMTSK_BASED
+
+/* just invoke the serial function */
+void
+__vsqrt_( int *n, double *x, int *stridex, double *y, int *stridey )
+{
+ __vsqrt( *n, x, *stridex, y, *stridey );
+}
+
+#else
+
+#include "mtsk.h"
+
+static double *xp, *yp;
+static int sx, sy;
+
+/* m-function for parallel vsqrt */
+void
+__vsqrt_mfunc( struct MFunctionBlock *MFunctionBlockPtr, int LowerBound,
+ int UpperBound, int Step )
+{
+ __vsqrt( UpperBound - LowerBound + 1, xp + sx * LowerBound, sx,
+ yp + sy * LowerBound, sy );
+}
+
+void
+__vsqrt_( int *n, double *x, int *stridex, double *y, int *stridey )
+{
+ struct MFunctionBlock m;
+ int i;
+
+ /* if ncpus < 2, we are already in a parallel construct, or there
+ aren't enough vector elements to bother parallelizing, just
+ invoke the serial function */
+ i = __mt_getncpus_();
+ if ( i < 2 || *n < ( i << 3 ) || __mt_inepc_() || __mt_inapc_() )
+ {
+ __vsqrt( *n, x, *stridex, y, *stridey );
+ return;
+ }
+
+ /* should be safe, we already know we're not in a parallel region */
+ xp = x;
+ sx = *stridex;
+ yp = y;
+ sy = *stridey;
+
+ m.MFunctionPtr = &__vsqrt_mfunc;
+ m.LowerBound = 0;
+ m.UpperBound = *n - 1;
+ m.Step = 1;
+ __mt_dopar_vfun_( m.MFunctionPtr, m.LowerBound, m.UpperBound, m.Step );
+}
+
+#endif