Rcpp Version 1.0.9
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) \
26 R_xlen_t __trip_count = n >> 2 ; \
27 R_xlen_t i = 0 ; \
28 for ( ; __trip_count > 0 ; --__trip_count) { \
29  *TARGET++ = SOURCE[i++] ; \
30  *TARGET++ = SOURCE[i++] ; \
31  *TARGET++ = SOURCE[i++] ; \
32  *TARGET++ = SOURCE[i++] ; \
33 } \
34 switch (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) \
48 R_xlen_t __trip_count = n >> 2 ; \
49 R_xlen_t i = 0 ; \
50 for ( ; __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 } \
56 switch (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) \
69 R_xlen_t __trip_count = n >> 2 ; \
70 R_xlen_t i = 0 ; \
71 for ( ; __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 } \
77 switch (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