1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 24 */ 25 /* 26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 30 extern void __vsqrtf(int, float *, int, float *, int); 31 32 #if !defined(LIBMVEC_SO_BUILD) 33 #if defined(ARCH_v8plusa) || defined(ARCH_v8plusb) || defined(ARCH_v9a) || defined(ARCH_v9b) 34 #define CHECK_ULTRA3 35 #endif 36 #endif /* !defined(LIBMVEC_SO_BUILD) */ 37 38 #ifdef CHECK_ULTRA3 39 #include <strings.h> 40 #define sysinfo _sysinfo 41 #include <sys/systeminfo.h> 42 43 #define BUFLEN 257 44 45 static int use_ultra3 = 0; 46 47 extern void __vsqrtf_ultra3(int, float *, int, float *, int); 48 #endif 49 50 #pragma weak vsqrtf_ = __vsqrtf_ 51 52 /* just invoke the serial function */ 53 void 54 __vsqrtf_(int *n, float *x, int *stridex, float *y, int *stridey) 55 { 56 #ifdef CHECK_ULTRA3 57 int u; 58 char buf[BUFLEN]; 59 60 u = use_ultra3; 61 if (!u) { 62 /* use __vsqrtf_ultra3 on Cheetah (and ???) */ 63 if (sysinfo(SI_ISALIST, buf, BUFLEN) > 0 && !strncmp(buf, "sparcv9+vis2", 12)) 64 u = 3; 65 else 66 u = 1; 67 use_ultra3 = u; 68 } 69 if (u & 2) 70 __vsqrtf_ultra3(*n, x, *stridex, y, *stridey); 71 else 72 #endif 73 __vsqrtf(*n, x, *stridex, y, *stridey); 74 } 75