aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jumper/SkJumper_misc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/jumper/SkJumper_misc.h')
-rw-r--r--src/jumper/SkJumper_misc.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/jumper/SkJumper_misc.h b/src/jumper/SkJumper_misc.h
new file mode 100644
index 0000000000..96035bd084
--- /dev/null
+++ b/src/jumper/SkJumper_misc.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkJumper_misc_DEFINED
+#define SkJumper_misc_DEFINED
+
+#include "SkJumper.h" // for memcpy()
+
+// Miscellany used by SkJumper_stages.cpp and SkJumper_vectors.h.
+
+// Every function in this file should be marked static and inline using SI.
+#define SI static inline
+
+template <typename T, typename P>
+SI T unaligned_load(const P* p) { // const void* would work too, but const P* helps ARMv7 codegen.
+ T v;
+ memcpy(&v, p, sizeof(v));
+ return v;
+}
+
+template <typename Dst, typename Src>
+SI Dst bit_cast(const Src& src) {
+ static_assert(sizeof(Dst) == sizeof(Src), "");
+ return unaligned_load<Dst>(&src);
+}
+
+// A couple functions for embedding constants directly into code,
+// so that no .const or .literal4 section is created.
+SI int C(int x) {
+#if defined(JUMPER) && defined(__x86_64__)
+ // Move x-the-compile-time-constant as a literal into x-the-register.
+ asm("mov %1, %0" : "=r"(x) : "i"(x));
+#endif
+ return x;
+}
+SI float C(float f) {
+ int x = C(unaligned_load<int>(&f));
+ return unaligned_load<float>(&x);
+}
+
+// Syntax sugar to make C() easy to use for constant literals.
+SI int operator "" _i(unsigned long long int i) { return C( (int)i); }
+SI float operator "" _f( long double f) { return C((float)f); }
+
+#endif//SkJumper_misc_DEFINED