Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / s390 / bits / byteswap-16.h
bloba2d77d74fd17bc87b03742873505d0b7775f585d
1 /* Macros to swap the order of bytes in 16-bit integer values. s390 version
2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
3 Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
4 This file is part of the GNU C Library.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 #ifndef _BITS_BYTESWAP_H
21 # error "Never use <bits/byteswap-16.h> directly; include <byteswap.h> instead."
22 #endif
24 #include <bits/wordsize.h>
26 /* Swap bytes in 16 bit value. */
27 #if defined __GNUC__ && __GNUC__ >= 2
28 # if __WORDSIZE == 64
29 # define __bswap_16(x) \
30 (__extension__ \
31 ({ unsigned short int __v, __x = (unsigned short int) (x); \
32 if (__builtin_constant_p (x)) \
33 __v = __bswap_constant_16 (__x); \
34 else { \
35 unsigned short int __tmp = (unsigned short int) (__x); \
36 __asm__ __volatile__ ( \
37 "lrvh %0,%1" \
38 : "=&d" (__v) : "m" (__tmp) ); \
39 } \
40 __v; }))
41 # else
42 # define __bswap_16(x) \
43 (__extension__ \
44 ({ unsigned short int __v, __x = (unsigned short int) (x); \
45 if (__builtin_constant_p (x)) \
46 __v = __bswap_constant_16 (__x); \
47 else { \
48 unsigned short int __tmp = (unsigned short int) (__x); \
49 __asm__ __volatile__ ( \
50 "sr %0,%0\n" \
51 "la 1,%1\n" \
52 "icm %0,2,1(1)\n" \
53 "ic %0,0(1)" \
54 : "=&d" (__v) : "m" (__tmp) : "1"); \
55 } \
56 __v; }))
57 # endif
58 #else
59 /* This is better than nothing. */
60 static __inline unsigned short int
61 __bswap_16 (unsigned short int __bsx)
63 return __bswap_constant_16 (__bsx);
65 #endif