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