Rcpp Version 1.0.14
Loading...
Searching...
No Matches
unroll.h
Go to the documentation of this file.
1// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
2//
3// unroll.h: Rcpp R/C++ interface class library -- loop unrolling macro
4//
5// Copyright (C) 2010 - 2017 Dirk Eddelbuettel and Romain Francois
6//
7// This file is part of Rcpp.
8//
9// Rcpp is free software: you can redistribute it and/or modify it
10// under the terms of the GNU General Public License as published by
11// the Free Software Foundation, either version 2 of the License, or
12// (at your option) any later version.
13//
14// Rcpp is distributed in the hope that it will be useful, but
15// WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU General Public License for more details.
18//
19// You should have received a copy of the GNU General Public License
20// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
21
22#ifndef Rcpp__macros_unroll_h
23#define Rcpp__macros_unroll_h
24
25#define RCPP_LOOP_UNROLL_PTR(TARGET,SOURCE) \
26R_xlen_t __trip_count = n >> 2 ; \
27R_xlen_t i = 0 ; \
28for ( ; __trip_count > 0 ; --__trip_count) { \
29 *TARGET++ = SOURCE[i++] ; \
30 *TARGET++ = SOURCE[i++] ; \
31 *TARGET++ = SOURCE[i++] ; \
32 *TARGET++ = SOURCE[i++] ; \
33} \
34switch (n - i){ \
35 case 3: \
36 *TARGET++ = SOURCE[i++] ; \
37 case 2: \
38 *TARGET++ = SOURCE[i++] ; \
39 case 1: \
40 *TARGET++ = SOURCE[i++] ; \
41 case 0: \
42 default: \
43 {} \
44}
45
46
47#define RCPP_LOOP_UNROLL(TARGET,SOURCE) \
48R_xlen_t __trip_count = n >> 2 ; \
49R_xlen_t i = 0 ; \
50for ( ; __trip_count > 0 ; --__trip_count) { \
51 TARGET[i] = SOURCE[i] ; i++ ; \
52 TARGET[i] = SOURCE[i] ; i++ ; \
53 TARGET[i] = SOURCE[i] ; i++ ; \
54 TARGET[i] = SOURCE[i] ; i++ ; \
55} \
56switch (n - i){ \
57 case 3: \
58 TARGET[i] = SOURCE[i] ; i++ ; /* fallthrough */ \
59 case 2: \
60 TARGET[i] = SOURCE[i] ; i++ ; /* fallthrough */ \
61 case 1: \
62 TARGET[i] = SOURCE[i] ; i++ ; /* fallthrough */ \
63 case 0: \
64 default: \
65 {} \
66}
67
68#define RCPP_LOOP_UNROLL_LHSFUN(TARGET,FUN,SOURCE) \
69R_xlen_t __trip_count = n >> 2 ; \
70R_xlen_t i = 0 ; \
71for ( ; __trip_count > 0 ; --__trip_count) { \
72 TARGET[FUN(i)] = SOURCE[i] ; i++ ; \
73 TARGET[FUN(i)] = SOURCE[i] ; i++ ; \
74 TARGET[FUN(i)] = SOURCE[i] ; i++ ; \
75 TARGET[FUN(i)] = SOURCE[i] ; i++ ; \
76} \
77switch (n - i){ \
78 case 3: \
79 TARGET[FUN(i)] = SOURCE[i] ; i++ ; /* fallthrough */ \
80 case 2: \
81 TARGET[FUN(i)] = SOURCE[i] ; i++ ; /* fallthrough */ \
82 case 1: \
83 TARGET[FUN(i)] = SOURCE[i] ; i++ ; /* fallthrough */ \
84 case 0: \
85 default: \
86 {} \
87}
88
89#endif