xref: /kvm-unit-tests/lib/s390x/asm/float.h (revision dfe993b09719fd684bc497562d88c3c702b3ded0)
12d0d5f41SDavid Hildenbrand /*
22d0d5f41SDavid Hildenbrand  * Copyright (c) 2018 Red Hat Inc
32d0d5f41SDavid Hildenbrand  *
42d0d5f41SDavid Hildenbrand  * Authors:
52d0d5f41SDavid Hildenbrand  *  David Hildenbrand <david@redhat.com>
62d0d5f41SDavid Hildenbrand  *
72d0d5f41SDavid Hildenbrand  * This code is free software; you can redistribute it and/or modify it
82d0d5f41SDavid Hildenbrand  * under the terms of the GNU Library General Public License version 2.
92d0d5f41SDavid Hildenbrand  */
102d0d5f41SDavid Hildenbrand #ifndef _ASM_S390X_FLOAT_H_
112d0d5f41SDavid Hildenbrand #define _ASM_S390X_FLOAT_H_
122d0d5f41SDavid Hildenbrand 
132d0d5f41SDavid Hildenbrand static inline void set_fpc(uint32_t fpc)
142d0d5f41SDavid Hildenbrand {
152d0d5f41SDavid Hildenbrand 	asm volatile("	lfpc	%0\n" : : "m"(fpc) );
162d0d5f41SDavid Hildenbrand }
172d0d5f41SDavid Hildenbrand 
182d0d5f41SDavid Hildenbrand static inline uint32_t get_fpc(void)
192d0d5f41SDavid Hildenbrand {
202d0d5f41SDavid Hildenbrand 	uint32_t fpc;
212d0d5f41SDavid Hildenbrand 
222d0d5f41SDavid Hildenbrand 	asm volatile("	stfpc	%0\n" : "=m"(fpc));
232d0d5f41SDavid Hildenbrand 
242d0d5f41SDavid Hildenbrand 	return fpc;
252d0d5f41SDavid Hildenbrand }
262d0d5f41SDavid Hildenbrand 
27*dfe993b0SThomas Huth static inline uint8_t get_fpc_dxc(void)
282d0d5f41SDavid Hildenbrand {
292d0d5f41SDavid Hildenbrand 	return get_fpc() >> 8;
302d0d5f41SDavid Hildenbrand }
312d0d5f41SDavid Hildenbrand 
322d0d5f41SDavid Hildenbrand static inline void set_fpc_dxc(uint8_t dxc)
332d0d5f41SDavid Hildenbrand {
342d0d5f41SDavid Hildenbrand 	uint32_t fpc = get_fpc();
352d0d5f41SDavid Hildenbrand 
362d0d5f41SDavid Hildenbrand 	fpc = (fpc & ~0xff00) | ((uint32_t)dxc) << 8;
372d0d5f41SDavid Hildenbrand 
382d0d5f41SDavid Hildenbrand 	set_fpc(fpc);
392d0d5f41SDavid Hildenbrand }
402d0d5f41SDavid Hildenbrand 
412d0d5f41SDavid Hildenbrand static inline void afp_enable(void)
422d0d5f41SDavid Hildenbrand {
432d0d5f41SDavid Hildenbrand 	ctl_set_bit(0, 63 - 45);
442d0d5f41SDavid Hildenbrand }
452d0d5f41SDavid Hildenbrand 
462d0d5f41SDavid Hildenbrand static inline void afp_disable(void)
472d0d5f41SDavid Hildenbrand {
482d0d5f41SDavid Hildenbrand 	ctl_clear_bit(0, 63 - 45);
492d0d5f41SDavid Hildenbrand }
502d0d5f41SDavid Hildenbrand 
512d0d5f41SDavid Hildenbrand #endif
52