aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/simd.h
blob: 4aad7f158dcbe45f9c03377102970783fe69ec7a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/* SPDX-License-Identifier: GPL-2.0
 *
 * Copyright (C) 2015-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 */

#include <linux/simd.h>
#ifndef _ASM_SIMD_H
#define _ASM_SIMD_H

#include <asm/fpu/api.h>

/*
 * may_use_simd - whether it is allowable at this time to issue SIMD
 *                instructions or access the SIMD register file
 */
static __must_check inline bool may_use_simd(void)
{
	return irq_fpu_usable();
}

static inline void simd_get(simd_context_t *ctx)
{
#if !defined(CONFIG_UML)
	*ctx = may_use_simd() ? HAVE_FULL_SIMD : HAVE_NO_SIMD;
#else
	*ctx = HAVE_NO_SIMD;
#endif
}

static inline void simd_put(simd_context_t *ctx)
{
#if !defined(CONFIG_UML)
	if (*ctx & HAVE_SIMD_IN_USE)
		kernel_fpu_end();
#endif
	*ctx = HAVE_NO_SIMD;
}

static __must_check inline bool simd_use(simd_context_t *ctx)
{
#if !defined(CONFIG_UML)
	if (!(*ctx & HAVE_FULL_SIMD))
		return false;
	if (*ctx & HAVE_SIMD_IN_USE)
		return true;
	kernel_fpu_begin();
	*ctx |= HAVE_SIMD_IN_USE;
	return true;
#else
	return false;
#endif
}

#endif /* _ASM_SIMD_H */