source: trunk/lib/builtins.hpp @ 1528

Last change on this file since 1528 was 1528, checked in by ksherdy, 8 years ago

Added builtins.hpp.

File size: 2.2 KB
Line 
1/*
2    builtin - Compiler dependent builtin function wrappers.
3
4    Idealized SIMD Operations with SSE versions
5    Copyright (C) 2011, Robert D. Cameron, Kenneth S. Herdy.
6    Licensed to the public under the Open Software License 3.0.
7    Licensed to International Characters Inc.
8       under the Academic Free License version 3.0.
9 */
10
11#ifndef BUILTINS_HPP_
12#define BUILTINS_HPP_
13
14#include "config.hpp"
15
16static IDISA_INLINE long likely(long x);
17static IDISA_INLINE long unlikely(long x);
18static IDISA_INLINE unsigned long cfzl(unsigned long x) IDISA_ALWAYS_INLINE;
19static IDISA_INLINE unsigned long cbzl(unsigned long x) IDISA_ALWAYS_INLINE;
20static IDISA_INLINE unsigned long cfzll(unsigned long x) IDISA_ALWAYS_INLINE;
21static IDISA_INLINE unsigned long cbzll(unsigned long x) IDISA_ALWAYS_INLINE;
22
23#if defined (_MSC_VER)
24        static IDISA_INLINE long likely(long x) {
25                return x;
26        }
27        static IDISA_INLINE long unlikely(long x) {
28                return x;
29        }
30
31        #include <intrin.h>
32        #pragma intrinsic(_BitScanForward)
33        static IDISA_INLINE unsigned long cfzl(unsigned long x) { // Precondition: x > 0
34                unsigned long zeroes;
35                _BitScanForward(&zeroes, x);
36                return zeroes;
37        }
38
39        static IDISA_INLINE unsigned long cbzl(unsigned long x) {
40                unsigned long zeroes;
41                _BitScanReverse(&zeroes, x);
42                return zeroes;
43        }
44
45        static IDISA_INLINE unsigned long cfzll(unsigned long long x) { // TODO - test
46                unsigned __int64 zeroes;
47                _BitScanForward(&zeroes, x);
48                return zeroes;
49        }
50
51        static IDISA_INLINE unsigned long cbzll(unsigned long long x) { // TODO - test
52                unsigned __int64 zeroes;
53                _BitScanReverse(&zeroes, x);
54                return zeroes;
55        }
56
57#elif defined (__GNUC__)
58        static IDISA_INLINE long likely(long x) {
59                return __builtin_expect(x, 1);
60        }
61
62        static IDISA_INLINE long unlikely(long x) {
63                return __builtin_expect(x, 0);
64        }
65
66        static IDISA_INLINE unsigned long cfzl(unsigned long x) {
67                return __builtin_ctzl(x);
68        }
69
70        static IDISA_INLINE unsigned long cbzl(unsigned long x) {
71                return __builtin_clzl(x);
72        }
73
74        static IDISA_INLINE unsigned long cfzll(unsigned long long x) {
75                return __builtin_ctzll(x);
76        }
77
78        static IDISA_INLINE unsigned long cbzll(unsigned long long x) {
79                return __builtin_clzll(x);
80        }
81
82#endif
83
84#endif /* BUILTINS_HPP */
Note: See TracBrowser for help on using the repository browser.