xref: /openbsd-src/lib/libc/arch/aarch64/gen/fpgetsticky.c (revision dd81489db8c6745c0e25d81d82e97f90d8886b12)
1*dd81489dSjsg /*	$OpenBSD: fpgetsticky.c,v 1.3 2022/08/29 02:01:18 jsg Exp $	*/
2c7933ddeSpatrick /*
3c7933ddeSpatrick  * Copyright (C) 2014 Andrew Turner
4c7933ddeSpatrick  * All rights reserved.
5c7933ddeSpatrick  *
6c7933ddeSpatrick  * Redistribution and use in source and binary forms, with or without
7c7933ddeSpatrick  * modification, are permitted provided that the following conditions
8c7933ddeSpatrick  * are met:
9c7933ddeSpatrick  * 1. Redistributions of source code must retain the above copyright
10c7933ddeSpatrick  *    notice, this list of conditions and the following disclaimer.
11c7933ddeSpatrick  * 2. Redistributions in binary form must reproduce the above copyright
12c7933ddeSpatrick  *    notice, this list of conditions and the following disclaimer in the
13c7933ddeSpatrick  *    documentation and/or other materials provided with the distribution.
14c7933ddeSpatrick  *
15c7933ddeSpatrick  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16c7933ddeSpatrick  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17c7933ddeSpatrick  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18c7933ddeSpatrick  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19c7933ddeSpatrick  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20c7933ddeSpatrick  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21c7933ddeSpatrick  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22c7933ddeSpatrick  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23c7933ddeSpatrick  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24c7933ddeSpatrick  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25c7933ddeSpatrick  * SUCH DAMAGE.
26c7933ddeSpatrick  *
27c7933ddeSpatrick  */
28c7933ddeSpatrick 
29c7933ddeSpatrick #include <sys/types.h>
30c7933ddeSpatrick #include <ieeefp.h>
31c7933ddeSpatrick 
32c7933ddeSpatrick #ifdef __weak_alias
33c7933ddeSpatrick __weak_alias(_fpgetsticky,fpgetsticky);
34c7933ddeSpatrick #endif
35c7933ddeSpatrick 
36c7933ddeSpatrick #define FP_X_MASK	(FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL | FP_X_IMP)
37c7933ddeSpatrick 
38c7933ddeSpatrick fp_except
fpgetsticky(void)39c7933ddeSpatrick fpgetsticky(void)
40c7933ddeSpatrick {
41c7933ddeSpatrick 	fp_except old;
42c7933ddeSpatrick 
43*dd81489dSjsg 	__asm volatile("mrs %x0, fpcr" : "=&r"(old));
44c7933ddeSpatrick 
45c7933ddeSpatrick 	return (old & FP_X_MASK);
46c7933ddeSpatrick }
47