]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/intrinsics/mvbits.c
Update copyright years.
[thirdparty/gcc.git] / libgfortran / intrinsics / mvbits.c
CommitLineData
1ee3acfb 1/* Implementation of the MVBITS intrinsic
8d9254fc 2 Copyright (C) 2004-2020 Free Software Foundation, Inc.
56746a07 3 Contributed by Tobias Schlüter
1ee3acfb
AP
4
5This file is part of the GNU Fortran 95 runtime library (libgfortran).
6
7Libgfortran is free software; you can redistribute it and/or
57dea9f6 8modify it under the terms of the GNU General Public
1ee3acfb 9License as published by the Free Software Foundation; either
748086b7 10version 3 of the License, or (at your option) any later version.
1ee3acfb
AP
11
12Libgfortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
57dea9f6 15GNU General Public License for more details.
1ee3acfb 16
748086b7
JJ
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
1ee3acfb
AP
25
26/* TODO: This should be replaced by a compiler builtin. */
27
28#ifndef SUB_NAME
29#include <libgfortran.h>
30#endif
31
32#ifdef SUB_NAME
33/* MVBITS copies LEN bits starting at bit position FROMPOS from FROM
34 into TO, starting at bit position TOPOS. */
35
37058415
FXC
36extern void SUB_NAME (const TYPE *, const int *, const int *, TYPE *,
37 const int *);
7d7b8bfe
RH
38export_proto(SUB_NAME);
39
1ee3acfb 40void
37058415
FXC
41SUB_NAME (const TYPE *from, const int *frompos, const int *len, TYPE *to,
42 const int *topos)
1ee3acfb
AP
43{
44 TYPE oldbits, newbits, lenmask;
45
43ff4e9a 46 lenmask = (*len == sizeof (TYPE)*8) ? ~(TYPE)0 : ((TYPE)1 << *len) - 1;
1ee3acfb
AP
47 newbits = (((UTYPE)(*from) >> *frompos) & lenmask) << *topos;
48 oldbits = *to & (~(lenmask << *topos));
49
50 *to = newbits | oldbits;
51}
52#endif
53
54#ifndef SUB_NAME
56746a07
TS
55# define TYPE GFC_INTEGER_1
56# define UTYPE GFC_UINTEGER_1
57# define SUB_NAME mvbits_i1
58# include "mvbits.c"
59# undef SUB_NAME
60# undef TYPE
61# undef UTYPE
62
63# define TYPE GFC_INTEGER_2
64# define UTYPE GFC_UINTEGER_2
65# define SUB_NAME mvbits_i2
66# include "mvbits.c"
67# undef SUB_NAME
68# undef TYPE
69# undef UTYPE
70
1ee3acfb
AP
71# define TYPE GFC_INTEGER_4
72# define UTYPE GFC_UINTEGER_4
7d7b8bfe 73# define SUB_NAME mvbits_i4
1ee3acfb
AP
74# include "mvbits.c"
75# undef SUB_NAME
76# undef TYPE
77# undef UTYPE
78
79# define TYPE GFC_INTEGER_8
80# define UTYPE GFC_UINTEGER_8
7d7b8bfe 81# define SUB_NAME mvbits_i8
1ee3acfb
AP
82# include "mvbits.c"
83# undef SUB_NAME
84# undef TYPE
85# undef UTYPE
0238e1e9 86
50060d9a 87#if defined (HAVE_GFC_INTEGER_16)
0238e1e9
SK
88# define TYPE GFC_INTEGER_16
89# define UTYPE GFC_UINTEGER_16
90# define SUB_NAME mvbits_i16
91# include "mvbits.c"
92# undef SUB_NAME
93# undef TYPE
94# undef UTYPE
1ee3acfb 95#endif
50060d9a 96#endif