summaryrefslogtreecommitdiff
path: root/src/lj_vmmath.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_vmmath.c')
-rw-r--r--src/lj_vmmath.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/lj_vmmath.c b/src/lj_vmmath.c
new file mode 100644
index 00000000..d357b4e3
--- /dev/null
+++ b/src/lj_vmmath.c
@@ -0,0 +1,97 @@
1/*
2** Math helper functions for assembler VM.
3** Copyright (C) 2005-2011 Mike Pall. See Copyright Notice in luajit.h
4*/
5
6#define lj_vmmath_c
7#define LUA_CORE
8
9#include <math.h>
10
11#include "lj_obj.h"
12#if LJ_HASJIT
13#include "lj_ir.h"
14#endif
15#include "lj_vm.h"
16
17/* -- Helper functions for generated machine code ------------------------- */
18
19#if LJ_TARGET_X86ORX64
20/* Wrapper functions to avoid linker issues on OSX. */
21LJ_FUNCA double lj_vm_sinh(double x) { return sinh(x); }
22LJ_FUNCA double lj_vm_cosh(double x) { return cosh(x); }
23LJ_FUNCA double lj_vm_tanh(double x) { return tanh(x); }
24#endif
25
26#if LJ_HASJIT
27
28#if defined(__ANDROID__) || defined(__symbian__)
29double lj_vm_log2(double a)
30{
31 return log(a) * 1.4426950408889634074;
32}
33#endif
34
35#if defined(__symbian__)
36double lj_vm_exp2(double a)
37{
38 return exp(a * 0.6931471805599453);
39}
40#endif
41
42#if !LJ_TARGET_X86ORX64
43/* Unsigned x^k. */
44static double lj_vm_powui(double x, uint32_t k)
45{
46 double y;
47 lua_assert(k != 0);
48 for (; (k & 1) == 0; k >>= 1) x *= x;
49 y = x;
50 if ((k >>= 1) != 0) {
51 for (;;) {
52 x *= x;
53 if (k == 1) break;
54 if (k & 1) y *= x;
55 k >>= 1;
56 }
57 y *= x;
58 }
59 return y;
60}
61
62/* Signed x^k. */
63double lj_vm_powi(double x, int32_t k)
64{
65 if (k > 1)
66 return lj_vm_powui(x, (uint32_t)k);
67 else if (k == 1)
68 return x;
69 else if (k == 0)
70 return 1;
71 else
72 return 1.0 / lj_vm_powui(x, (uint32_t)-k);
73}
74
75/* Computes fpm(x) for extended math functions. */
76double lj_vm_foldfpm(double x, int fpm)
77{
78 switch (fpm) {
79 case IRFPM_FLOOR: return lj_vm_floor(x);
80 case IRFPM_CEIL: return lj_vm_ceil(x);
81 case IRFPM_TRUNC: return lj_vm_trunc(x);
82 case IRFPM_SQRT: return sqrt(x);
83 case IRFPM_EXP: return exp(x);
84 case IRFPM_EXP2: return lj_vm_exp2(x);
85 case IRFPM_LOG: return log(x);
86 case IRFPM_LOG2: return lj_vm_log2(x);
87 case IRFPM_LOG10: return log10(x);
88 case IRFPM_SIN: return sin(x);
89 case IRFPM_COS: return cos(x);
90 case IRFPM_TAN: return tan(x);
91 default: lua_assert(0);
92 }
93 return 0;
94}
95#endif
96
97#endif