ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / util / util_types_int4_impl.h
1 /*
2  * Copyright 2011-2017 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __UTIL_TYPES_INT4_IMPL_H__
18 #define __UTIL_TYPES_INT4_IMPL_H__
19
20 #ifndef __UTIL_TYPES_H__
21 #  error "Do not include this file directly, include util_types.h instead."
22 #endif
23
24 #ifndef __KERNEL_GPU__
25 #  include <cstdio>
26 #endif
27
28 CCL_NAMESPACE_BEGIN
29
30 #ifndef __KERNEL_GPU__
31 #  ifdef __KERNEL_SSE__
32 __forceinline int4::int4()
33 {
34 }
35
36 __forceinline int4::int4(const int4 &a) : m128(a.m128)
37 {
38 }
39
40 __forceinline int4::int4(const __m128i &a) : m128(a)
41 {
42 }
43
44 __forceinline int4::operator const __m128i &() const
45 {
46   return m128;
47 }
48
49 __forceinline int4::operator __m128i &()
50 {
51   return m128;
52 }
53
54 __forceinline int4 &int4::operator=(const int4 &a)
55 {
56   m128 = a.m128;
57   return *this;
58 }
59 #  endif /* __KERNEL_SSE__ */
60
61 __forceinline int int4::operator[](int i) const
62 {
63   util_assert(i >= 0);
64   util_assert(i < 4);
65   return *(&x + i);
66 }
67
68 __forceinline int &int4::operator[](int i)
69 {
70   util_assert(i >= 0);
71   util_assert(i < 4);
72   return *(&x + i);
73 }
74
75 ccl_device_inline int4 make_int4(int i)
76 {
77 #  ifdef __KERNEL_SSE__
78   int4 a(_mm_set1_epi32(i));
79 #  else
80   int4 a = {i, i, i, i};
81 #  endif
82   return a;
83 }
84
85 ccl_device_inline int4 make_int4(int x, int y, int z, int w)
86 {
87 #  ifdef __KERNEL_SSE__
88   int4 a(_mm_set_epi32(w, z, y, x));
89 #  else
90   int4 a = {x, y, z, w};
91 #  endif
92   return a;
93 }
94
95 ccl_device_inline int4 make_int4(const float3 &f)
96 {
97 #  ifdef __KERNEL_SSE__
98   int4 a(_mm_cvtps_epi32(f.m128));
99 #  else
100   int4 a = {(int)f.x, (int)f.y, (int)f.z, (int)f.w};
101 #  endif
102   return a;
103 }
104
105 ccl_device_inline int4 make_int4(const float4 &f)
106 {
107 #  ifdef __KERNEL_SSE__
108   int4 a(_mm_cvtps_epi32(f.m128));
109 #  else
110   int4 a = {(int)f.x, (int)f.y, (int)f.z, (int)f.w};
111 #  endif
112   return a;
113 }
114
115 ccl_device_inline void print_int4(const char *label, const int4 &a)
116 {
117   printf("%s: %d %d %d %d\n", label, a.x, a.y, a.z, a.w);
118 }
119 #endif /* __KERNEL_GPU__ */
120
121 CCL_NAMESPACE_END
122
123 #endif /* __UTIL_TYPES_INT4_IMPL_H__ */