aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2011-06-03 17:12:46 +0200
committerMike Pall <mike>2011-06-03 17:15:44 +0200
commiteec28aa9fdf5f733a4f7d2628fc060eac66ab713 (patch)
treed37d099e35e86df696d0b130cf98b098cd604d12
parent77bb8de93da29cc3b1a3fbc2f605f8b70841657b (diff)
downloadluajit-eec28aa9fdf5f733a4f7d2628fc060eac66ab713.tar.gz
luajit-eec28aa9fdf5f733a4f7d2628fc060eac66ab713.tar.bz2
luajit-eec28aa9fdf5f733a4f7d2628fc060eac66ab713.zip
Move math helpers to lj_vmmath.c. Add missing log2/exp2 for Symbian.
-rw-r--r--src/Makefile2
-rw-r--r--src/Makefile.dep26
-rw-r--r--src/buildvm_x64.h14
-rw-r--r--src/buildvm_x64win.h14
-rw-r--r--src/buildvm_x86.dasc16
-rw-r--r--src/buildvm_x86.h14
-rw-r--r--src/lib_math.c4
-rw-r--r--src/lj_asm_x86.h4
-rw-r--r--src/lj_ir.c66
-rw-r--r--src/lj_ircall.h4
-rw-r--r--src/lj_opt_split.c2
-rw-r--r--src/lj_vm.h15
-rw-r--r--src/lj_vmmath.c97
-rw-r--r--src/ljamalg.c1
14 files changed, 160 insertions, 119 deletions
diff --git a/src/Makefile b/src/Makefile
index 03e45d2d..c99d8577 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -359,7 +359,7 @@ LJLIB_C= $(LJLIB_O:.o=.c)
359 359
360LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o \ 360LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o \
361 lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o \ 361 lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o \
362 lj_state.o lj_dispatch.o lj_vmevent.o lj_api.o \ 362 lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_api.o \
363 lj_lex.o lj_parse.o \ 363 lj_lex.o lj_parse.o \
364 lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \ 364 lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \
365 lj_opt_dce.o lj_opt_loop.o lj_opt_split.o \ 365 lj_opt_dce.o lj_opt_loop.o lj_opt_split.o \
diff --git a/src/Makefile.dep b/src/Makefile.dep
index 8e0d7a1c..8bc891ad 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -166,22 +166,24 @@ lj_udata.o: lj_udata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
166lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 166lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
167 lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \ 167 lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \
168 lj_vm.h lj_vmevent.h 168 lj_vm.h lj_vmevent.h
169lj_vmmath.o: lj_vmmath.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
170 lj_ir.h lj_vm.h
169ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \ 171ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \
170 lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h \ 172 lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h \
171 lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h \ 173 lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h \
172 lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_err.c \ 174 lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_err.c \
173 lj_ff.h lj_ffdef.h lj_char.c lj_char.h lj_bc.c lj_bcdef.h lj_obj.c \ 175 lj_ff.h lj_ffdef.h lj_char.c lj_char.h lj_bc.c lj_bcdef.h lj_obj.c \
174 lj_str.c lj_tab.c lj_func.c lj_udata.c lj_meta.c lj_state.c lj_lex.h \ 176 lj_str.c lj_tab.c lj_func.c lj_udata.c lj_meta.c lj_state.c lj_lex.h \
175 lj_alloc.h lj_dispatch.c luajit.h lj_vmevent.c lj_vmevent.h lj_api.c \ 177 lj_alloc.h lj_dispatch.c luajit.h lj_vmevent.c lj_vmevent.h lj_vmmath.c \
176 lj_parse.h lj_lex.c lualib.h lj_parse.c lj_ctype.c lj_cdata.c lj_cconv.h \ 178 lj_api.c lj_parse.h lj_lex.c lualib.h lj_parse.c lj_ctype.c lj_cdata.c \
177 lj_cconv.c lj_ccall.c lj_ccall.h lj_carith.c lj_carith.h lj_clib.c \ 179 lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_carith.c lj_carith.h \
178 lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_ircall.h \ 180 lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c \
179 lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \ 181 lj_ircall.h lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h \
180 lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c lj_mcode.c \ 182 lj_opt_narrow.c lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c \
181 lj_mcode.h lj_snap.c lj_target.h lj_target_*.h lj_record.c lj_record.h \ 183 lj_mcode.c lj_mcode.h lj_snap.c lj_target.h lj_target_*.h lj_record.c \
182 lj_ffrecord.h lj_crecord.c lj_crecord.h lj_ffrecord.c lj_recdef.h \ 184 lj_record.h lj_ffrecord.h lj_crecord.c lj_crecord.h lj_ffrecord.c \
183 lj_asm.c lj_asm.h lj_emit_*.h lj_asm_*.h lj_trace.c lj_gdbjit.h \ 185 lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h lj_asm_*.h lj_trace.c \
184 lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c lj_libdef.h lib_math.c \ 186 lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c lj_libdef.h \
185 lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c \ 187 lib_math.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c \
186 lib_bit.c lib_jit.c lib_ffi.c lib_init.c 188 lib_debug.c lib_bit.c lib_jit.c lib_ffi.c lib_init.c
187luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h 189luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h
diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h
index 918e514a..4a96493f 100644
--- a/src/buildvm_x64.h
+++ b/src/buildvm_x64.h
@@ -879,7 +879,7 @@ enum {
879 GLOB_ff_math_log, 879 GLOB_ff_math_log,
880 GLOB_ff_math_log10, 880 GLOB_ff_math_log10,
881 GLOB_ff_math_exp, 881 GLOB_ff_math_exp,
882 GLOB_vm_exp, 882 GLOB_vm_exp_x87,
883 GLOB_ff_math_sin, 883 GLOB_ff_math_sin,
884 GLOB_ff_math_cos, 884 GLOB_ff_math_cos,
885 GLOB_ff_math_tan, 885 GLOB_ff_math_tan,
@@ -939,7 +939,7 @@ enum {
939 GLOB_vm_ceil_sse, 939 GLOB_vm_ceil_sse,
940 GLOB_vm_trunc_sse, 940 GLOB_vm_trunc_sse,
941 GLOB_vm_mod, 941 GLOB_vm_mod,
942 GLOB_vm_exp2, 942 GLOB_vm_exp2_x87,
943 GLOB_vm_exp2raw, 943 GLOB_vm_exp2raw,
944 GLOB_vm_pow_sse, 944 GLOB_vm_pow_sse,
945 GLOB_vm_powi_sse, 945 GLOB_vm_powi_sse,
@@ -1040,7 +1040,7 @@ static const char *const globnames[] = {
1040 "ff_math_log", 1040 "ff_math_log",
1041 "ff_math_log10", 1041 "ff_math_log10",
1042 "ff_math_exp", 1042 "ff_math_exp",
1043 "vm_exp", 1043 "vm_exp_x87",
1044 "ff_math_sin", 1044 "ff_math_sin",
1045 "ff_math_cos", 1045 "ff_math_cos",
1046 "ff_math_tan", 1046 "ff_math_tan",
@@ -1100,7 +1100,7 @@ static const char *const globnames[] = {
1100 "vm_ceil_sse", 1100 "vm_ceil_sse",
1101 "vm_trunc_sse", 1101 "vm_trunc_sse",
1102 "vm_mod", 1102 "vm_mod",
1103 "vm_exp2", 1103 "vm_exp2_x87",
1104 "vm_exp2raw", 1104 "vm_exp2raw",
1105 "vm_pow_sse", 1105 "vm_pow_sse",
1106 "vm_powi_sse", 1106 "vm_powi_sse",
@@ -1132,9 +1132,9 @@ static const char *const extnames[] = {
1132 "lj_tab_next", 1132 "lj_tab_next",
1133 "lj_tab_getinth@8", 1133 "lj_tab_getinth@8",
1134 "lj_ffh_coroutine_wrap_err@8", 1134 "lj_ffh_coroutine_wrap_err@8",
1135 "lj_wrapper_sinh", 1135 "lj_vm_sinh",
1136 "lj_wrapper_cosh", 1136 "lj_vm_cosh",
1137 "lj_wrapper_tanh", 1137 "lj_vm_tanh",
1138 "lj_str_new", 1138 "lj_str_new",
1139 "lj_tab_len@4", 1139 "lj_tab_len@4",
1140 "lj_gc_step@4", 1140 "lj_gc_step@4",
diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h
index 59499a78..9dbad9a3 100644
--- a/src/buildvm_x64win.h
+++ b/src/buildvm_x64win.h
@@ -876,7 +876,7 @@ enum {
876 GLOB_ff_math_log, 876 GLOB_ff_math_log,
877 GLOB_ff_math_log10, 877 GLOB_ff_math_log10,
878 GLOB_ff_math_exp, 878 GLOB_ff_math_exp,
879 GLOB_vm_exp, 879 GLOB_vm_exp_x87,
880 GLOB_ff_math_sin, 880 GLOB_ff_math_sin,
881 GLOB_ff_math_cos, 881 GLOB_ff_math_cos,
882 GLOB_ff_math_tan, 882 GLOB_ff_math_tan,
@@ -936,7 +936,7 @@ enum {
936 GLOB_vm_ceil_sse, 936 GLOB_vm_ceil_sse,
937 GLOB_vm_trunc_sse, 937 GLOB_vm_trunc_sse,
938 GLOB_vm_mod, 938 GLOB_vm_mod,
939 GLOB_vm_exp2, 939 GLOB_vm_exp2_x87,
940 GLOB_vm_exp2raw, 940 GLOB_vm_exp2raw,
941 GLOB_vm_pow_sse, 941 GLOB_vm_pow_sse,
942 GLOB_vm_powi_sse, 942 GLOB_vm_powi_sse,
@@ -1037,7 +1037,7 @@ static const char *const globnames[] = {
1037 "ff_math_log", 1037 "ff_math_log",
1038 "ff_math_log10", 1038 "ff_math_log10",
1039 "ff_math_exp", 1039 "ff_math_exp",
1040 "vm_exp", 1040 "vm_exp_x87",
1041 "ff_math_sin", 1041 "ff_math_sin",
1042 "ff_math_cos", 1042 "ff_math_cos",
1043 "ff_math_tan", 1043 "ff_math_tan",
@@ -1097,7 +1097,7 @@ static const char *const globnames[] = {
1097 "vm_ceil_sse", 1097 "vm_ceil_sse",
1098 "vm_trunc_sse", 1098 "vm_trunc_sse",
1099 "vm_mod", 1099 "vm_mod",
1100 "vm_exp2", 1100 "vm_exp2_x87",
1101 "vm_exp2raw", 1101 "vm_exp2raw",
1102 "vm_pow_sse", 1102 "vm_pow_sse",
1103 "vm_powi_sse", 1103 "vm_powi_sse",
@@ -1128,9 +1128,9 @@ static const char *const extnames[] = {
1128 "lj_tab_next", 1128 "lj_tab_next",
1129 "lj_tab_getinth@8", 1129 "lj_tab_getinth@8",
1130 "lj_ffh_coroutine_wrap_err@8", 1130 "lj_ffh_coroutine_wrap_err@8",
1131 "lj_wrapper_sinh", 1131 "lj_vm_sinh",
1132 "lj_wrapper_cosh", 1132 "lj_vm_cosh",
1133 "lj_wrapper_tanh", 1133 "lj_vm_tanh",
1134 "lj_str_new", 1134 "lj_str_new",
1135 "lj_tab_len@4", 1135 "lj_tab_len@4",
1136 "lj_gc_step@4", 1136 "lj_gc_step@4",
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index b8be39fb..6fde191d 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -2028,7 +2028,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
2028 } 2028 }
2029 |.ffunc_n math_log, fldln2; fyl2x; jmp ->fff_resn 2029 |.ffunc_n math_log, fldln2; fyl2x; jmp ->fff_resn
2030 |.ffunc_n math_log10, fldlg2; fyl2x; jmp ->fff_resn 2030 |.ffunc_n math_log10, fldlg2; fyl2x; jmp ->fff_resn
2031 |.ffunc_n math_exp; call ->vm_exp; jmp ->fff_resn 2031 |.ffunc_n math_exp; call ->vm_exp_x87; jmp ->fff_resn
2032 | 2032 |
2033 |.ffunc_n math_sin; fsin; jmp ->fff_resn 2033 |.ffunc_n math_sin; fsin; jmp ->fff_resn
2034 |.ffunc_n math_cos; fcos; jmp ->fff_resn 2034 |.ffunc_n math_cos; fcos; jmp ->fff_resn
@@ -2055,7 +2055,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
2055 | .endif 2055 | .endif
2056 ||} 2056 ||}
2057 | mov RB, BASE 2057 | mov RB, BASE
2058 | call extern lj_wrapper_ .. func 2058 | call extern lj_vm_ .. func
2059 | mov BASE, RB 2059 | mov BASE, RB
2060 | .if X64 2060 | .if X64
2061 | jmp ->fff_resxmm0 2061 | jmp ->fff_resxmm0
@@ -3169,9 +3169,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
3169 |// FP exponentiation e^x and 2^x. Called by math.exp fast function and 3169 |// FP exponentiation e^x and 2^x. Called by math.exp fast function and
3170 |// from JIT code. Arg/ret on x87 stack. No int/xmm regs modified. 3170 |// from JIT code. Arg/ret on x87 stack. No int/xmm regs modified.
3171 |// Caveat: needs 3 slots on x87 stack! 3171 |// Caveat: needs 3 slots on x87 stack!
3172 |->vm_exp: 3172 |->vm_exp_x87:
3173 | fldl2e; fmulp st1 // e^x ==> 2^(x*log2(e)) 3173 | fldl2e; fmulp st1 // e^x ==> 2^(x*log2(e))
3174 |->vm_exp2: 3174 |->vm_exp2_x87:
3175 | .if X64WIN 3175 | .if X64WIN
3176 | .define expscratch, dword [rsp+8] // Use scratch area. 3176 | .define expscratch, dword [rsp+8] // Use scratch area.
3177 | .elif X64 3177 | .elif X64
@@ -3444,11 +3444,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
3444 | cmp fpmop, 5; ja >2 3444 | cmp fpmop, 5; ja >2
3445 | .if X64WIN; pop rax; .endif 3445 | .if X64WIN; pop rax; .endif
3446 | je >1 3446 | je >1
3447 | call ->vm_exp 3447 | call ->vm_exp_x87
3448 | .if X64WIN; push rax; .endif 3448 | .if X64WIN; push rax; .endif
3449 | jmp >7 3449 | jmp >7
3450 |1: 3450 |1:
3451 | call ->vm_exp2 3451 | call ->vm_exp2_x87
3452 | .if X64WIN; push rax; .endif 3452 | .if X64WIN; push rax; .endif
3453 | jmp >7 3453 | jmp >7
3454 |2: ; cmp fpmop, 7; je >1; ja >2 3454 |2: ; cmp fpmop, 7; je >1; ja >2
@@ -3487,7 +3487,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
3487 | fld qword [esp+4] 3487 | fld qword [esp+4]
3488 | ret 3488 | ret
3489 |2: ; fld qword [esp+4] 3489 |2: ; fld qword [esp+4]
3490 | cmp fpmop, 5; jb ->vm_exp; je ->vm_exp2 3490 | cmp fpmop, 5; jb ->vm_exp_x87; je ->vm_exp2_x87
3491 |2: ; cmp fpmop, 7; je >1; ja >2 3491 |2: ; cmp fpmop, 7; je >1; ja >2
3492 | fldln2; fxch; fyl2x; ret 3492 | fldln2; fxch; fyl2x; ret
3493 |1: ; fld1; fxch; fyl2x; ret 3493 |1: ; fld1; fxch; fyl2x; ret
@@ -3505,7 +3505,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
3505 | cmp fpmop, 1; jb ->vm_floor; je ->vm_ceil 3505 | cmp fpmop, 1; jb ->vm_floor; je ->vm_ceil
3506 | cmp fpmop, 3; jb ->vm_trunc; ja >2 3506 | cmp fpmop, 3; jb ->vm_trunc; ja >2
3507 | fsqrt; ret 3507 | fsqrt; ret
3508 |2: ; cmp fpmop, 5; jb ->vm_exp; je ->vm_exp2 3508 |2: ; cmp fpmop, 5; jb ->vm_exp_x87; je ->vm_exp2_x87
3509 | cmp fpmop, 7; je >1; ja >2 3509 | cmp fpmop, 7; je >1; ja >2
3510 | fldln2; fxch; fyl2x; ret 3510 | fldln2; fxch; fyl2x; ret
3511 |1: ; fld1; fxch; fyl2x; ret 3511 |1: ; fld1; fxch; fyl2x; ret
diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h
index 1493381b..44f47339 100644
--- a/src/buildvm_x86.h
+++ b/src/buildvm_x86.h
@@ -925,7 +925,7 @@ enum {
925 GLOB_ff_math_log, 925 GLOB_ff_math_log,
926 GLOB_ff_math_log10, 926 GLOB_ff_math_log10,
927 GLOB_ff_math_exp, 927 GLOB_ff_math_exp,
928 GLOB_vm_exp, 928 GLOB_vm_exp_x87,
929 GLOB_ff_math_sin, 929 GLOB_ff_math_sin,
930 GLOB_ff_math_cos, 930 GLOB_ff_math_cos,
931 GLOB_ff_math_tan, 931 GLOB_ff_math_tan,
@@ -985,7 +985,7 @@ enum {
985 GLOB_vm_ceil_sse, 985 GLOB_vm_ceil_sse,
986 GLOB_vm_trunc_sse, 986 GLOB_vm_trunc_sse,
987 GLOB_vm_mod, 987 GLOB_vm_mod,
988 GLOB_vm_exp2, 988 GLOB_vm_exp2_x87,
989 GLOB_vm_exp2raw, 989 GLOB_vm_exp2raw,
990 GLOB_vm_pow_sse, 990 GLOB_vm_pow_sse,
991 GLOB_vm_powi_sse, 991 GLOB_vm_powi_sse,
@@ -1086,7 +1086,7 @@ static const char *const globnames[] = {
1086 "ff_math_log", 1086 "ff_math_log",
1087 "ff_math_log10", 1087 "ff_math_log10",
1088 "ff_math_exp", 1088 "ff_math_exp",
1089 "vm_exp", 1089 "vm_exp_x87",
1090 "ff_math_sin", 1090 "ff_math_sin",
1091 "ff_math_cos", 1091 "ff_math_cos",
1092 "ff_math_tan", 1092 "ff_math_tan",
@@ -1146,7 +1146,7 @@ static const char *const globnames[] = {
1146 "vm_ceil_sse", 1146 "vm_ceil_sse",
1147 "vm_trunc_sse", 1147 "vm_trunc_sse",
1148 "vm_mod", 1148 "vm_mod",
1149 "vm_exp2", 1149 "vm_exp2_x87",
1150 "vm_exp2raw", 1150 "vm_exp2raw",
1151 "vm_pow_sse", 1151 "vm_pow_sse",
1152 "vm_powi_sse", 1152 "vm_powi_sse",
@@ -1177,9 +1177,9 @@ static const char *const extnames[] = {
1177 "lj_tab_next", 1177 "lj_tab_next",
1178 "lj_tab_getinth@8", 1178 "lj_tab_getinth@8",
1179 "lj_ffh_coroutine_wrap_err@8", 1179 "lj_ffh_coroutine_wrap_err@8",
1180 "lj_wrapper_sinh", 1180 "lj_vm_sinh",
1181 "lj_wrapper_cosh", 1181 "lj_vm_cosh",
1182 "lj_wrapper_tanh", 1182 "lj_vm_tanh",
1183 "lj_str_new", 1183 "lj_str_new",
1184 "lj_tab_len@4", 1184 "lj_tab_len@4",
1185 "lj_gc_step@4", 1185 "lj_gc_step@4",
diff --git a/src/lib_math.c b/src/lib_math.c
index 24501139..917b5e7b 100644
--- a/src/lib_math.c
+++ b/src/lib_math.c
@@ -84,10 +84,6 @@ LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX)
84LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi) 84LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi)
85LJLIB_PUSH(1e310) LJLIB_SET(huge) 85LJLIB_PUSH(1e310) LJLIB_SET(huge)
86 86
87LJ_FUNCA double lj_wrapper_sinh(double x) { return sinh(x); }
88LJ_FUNCA double lj_wrapper_cosh(double x) { return cosh(x); }
89LJ_FUNCA double lj_wrapper_tanh(double x) { return tanh(x); }
90
91/* ------------------------------------------------------------------------ */ 87/* ------------------------------------------------------------------------ */
92 88
93/* This implements a Tausworthe PRNG with period 2^223. Based on: 89/* This implements a Tausworthe PRNG with period 2^223. Based on:
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
index b7712b36..c89bc521 100644
--- a/src/lj_asm_x86.h
+++ b/src/lj_asm_x86.h
@@ -1591,8 +1591,8 @@ static void asm_fpmath(ASMState *as, IRIns *ir)
1591 } 1591 }
1592 emit_rmro(as, XO_FSTPq, XOg_FSTPq, RID_ESP, ofs); 1592 emit_rmro(as, XO_FSTPq, XOg_FSTPq, RID_ESP, ofs);
1593 switch (fpm) { /* st0 = lj_vm_*(st0) */ 1593 switch (fpm) { /* st0 = lj_vm_*(st0) */
1594 case IRFPM_EXP: emit_call(as, lj_vm_exp); break; 1594 case IRFPM_EXP: emit_call(as, lj_vm_exp_x87); break;
1595 case IRFPM_EXP2: emit_call(as, lj_vm_exp2); break; 1595 case IRFPM_EXP2: emit_call(as, lj_vm_exp2_x87); break;
1596 case IRFPM_SIN: emit_x87op(as, XI_FSIN); break; 1596 case IRFPM_SIN: emit_x87op(as, XI_FSIN); break;
1597 case IRFPM_COS: emit_x87op(as, XI_FCOS); break; 1597 case IRFPM_COS: emit_x87op(as, XI_FCOS); break;
1598 case IRFPM_TAN: emit_x87op(as, XI_FPOP); emit_x87op(as, XI_FPTAN); break; 1598 case IRFPM_TAN: emit_x87op(as, XI_FPOP); emit_x87op(as, XI_FPTAN); break;
diff --git a/src/lj_ir.c b/src/lj_ir.c
index 749b7f12..8f22e085 100644
--- a/src/lj_ir.c
+++ b/src/lj_ir.c
@@ -37,72 +37,6 @@
37/* Pass IR on to next optimization in chain (FOLD). */ 37/* Pass IR on to next optimization in chain (FOLD). */
38#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) 38#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
39 39
40/* -- Helper functions for generated machine code ------------------------- */
41
42#ifdef __ANDROID__
43/* Android doesn't have log2(). Oh well. */
44#define log2 lj_vm_log2
45static double lj_vm_log2(double a)
46{
47 return log(a) * 1.4426950408889634074;
48}
49#endif
50
51#if !LJ_TARGET_X86ORX64
52/* Unsigned x^k. */
53static double lj_vm_powui(double x, uint32_t k)
54{
55 double y;
56 lua_assert(k != 0);
57 for (; (k & 1) == 0; k >>= 1) x *= x;
58 y = x;
59 if ((k >>= 1) != 0) {
60 for (;;) {
61 x *= x;
62 if (k == 1) break;
63 if (k & 1) y *= x;
64 k >>= 1;
65 }
66 y *= x;
67 }
68 return y;
69}
70
71/* Signed x^k. */
72static double lj_vm_powi(double x, int32_t k)
73{
74 if (k > 1)
75 return lj_vm_powui(x, (uint32_t)k);
76 else if (k == 1)
77 return x;
78 else if (k == 0)
79 return 1;
80 else
81 return 1.0 / lj_vm_powui(x, (uint32_t)-k);
82}
83
84/* Computes fpm(x) for extended math functions. */
85double lj_vm_foldfpm(double x, int fpm)
86{
87 switch (fpm) {
88 case IRFPM_FLOOR: return lj_vm_floor(x);
89 case IRFPM_CEIL: return lj_vm_ceil(x);
90 case IRFPM_TRUNC: return lj_vm_trunc(x);
91 case IRFPM_SQRT: return sqrt(x);
92 case IRFPM_EXP: return exp(x);
93 case IRFPM_EXP2: return exp2(x);
94 case IRFPM_LOG: return log(x);
95 case IRFPM_LOG2: return log2(x);
96 case IRFPM_LOG10: return log10(x);
97 case IRFPM_SIN: return sin(x);
98 case IRFPM_COS: return cos(x);
99 case IRFPM_TAN: return tan(x);
100 default: lua_assert(0);
101 }
102 return 0;
103}
104#endif
105
106/* -- IR tables ----------------------------------------------------------- */ 40/* -- IR tables ----------------------------------------------------------- */
107 41
108/* IR instruction modes. */ 42/* IR instruction modes. */
diff --git a/src/lj_ircall.h b/src/lj_ircall.h
index b83a0a81..1cbee91c 100644
--- a/src/lj_ircall.h
+++ b/src/lj_ircall.h
@@ -91,9 +91,9 @@ typedef struct CCallInfo {
91 _(lj_vm_trunc, ARG1_FP, N, NUM, 0) \ 91 _(lj_vm_trunc, ARG1_FP, N, NUM, 0) \
92 _(sqrt, ARG1_FP, N, NUM, 0) \ 92 _(sqrt, ARG1_FP, N, NUM, 0) \
93 _(exp, ARG1_FP, N, NUM, 0) \ 93 _(exp, ARG1_FP, N, NUM, 0) \
94 _(exp2, ARG1_FP, N, NUM, 0) \ 94 _(lj_vm_exp2, ARG1_FP, N, NUM, 0) \
95 _(log, ARG1_FP, N, NUM, 0) \ 95 _(log, ARG1_FP, N, NUM, 0) \
96 _(log2, ARG1_FP, N, NUM, 0) \ 96 _(lj_vm_log2, ARG1_FP, N, NUM, 0) \
97 _(log10, ARG1_FP, N, NUM, 0) \ 97 _(log10, ARG1_FP, N, NUM, 0) \
98 _(sin, ARG1_FP, N, NUM, 0) \ 98 _(sin, ARG1_FP, N, NUM, 0) \
99 _(cos, ARG1_FP, N, NUM, 0) \ 99 _(cos, ARG1_FP, N, NUM, 0) \
diff --git a/src/lj_opt_split.c b/src/lj_opt_split.c
index ea9b6fe3..0a1d87cb 100644
--- a/src/lj_opt_split.c
+++ b/src/lj_opt_split.c
@@ -274,7 +274,7 @@ static void split_ir(jit_State *J)
274 IRIns *irm12 = IR(irm3->op1); 274 IRIns *irm12 = IR(irm3->op1);
275 IRIns *irl1 = IR(irm12->op1); 275 IRIns *irl1 = IR(irm12->op1);
276 if (irm12->op1 > J->loopref && irl1->o == IR_CALLN && 276 if (irm12->op1 > J->loopref && irl1->o == IR_CALLN &&
277 irl1->op2 == IRCALL_log2) { 277 irl1->op2 == IRCALL_lj_vm_log2) {
278 IRRef tmp = irl1->op1; /* Recycle first two args from LOG2. */ 278 IRRef tmp = irl1->op1; /* Recycle first two args from LOG2. */
279 IRRef arg3 = irm3->op2, arg4 = irm4->op2; 279 IRRef arg3 = irm3->op2, arg4 = irm4->op2;
280 J->cur.nins--; 280 J->cur.nins--;
diff --git a/src/lj_vm.h b/src/lj_vm.h
index 649280d0..3941dad9 100644
--- a/src/lj_vm.h
+++ b/src/lj_vm.h
@@ -51,14 +51,25 @@ LJ_ASMF void lj_vm_exit_interp(void);
51LJ_ASMF void lj_vm_floor_sse(void); 51LJ_ASMF void lj_vm_floor_sse(void);
52LJ_ASMF void lj_vm_ceil_sse(void); 52LJ_ASMF void lj_vm_ceil_sse(void);
53LJ_ASMF void lj_vm_trunc_sse(void); 53LJ_ASMF void lj_vm_trunc_sse(void);
54LJ_ASMF void lj_vm_exp(void); 54LJ_ASMF void lj_vm_exp_x87(void);
55LJ_ASMF void lj_vm_exp2(void); 55LJ_ASMF void lj_vm_exp2_x87(void);
56LJ_ASMF void lj_vm_pow_sse(void); 56LJ_ASMF void lj_vm_pow_sse(void);
57LJ_ASMF void lj_vm_powi_sse(void); 57LJ_ASMF void lj_vm_powi_sse(void);
58#else 58#else
59LJ_ASMF double lj_vm_floor(double); 59LJ_ASMF double lj_vm_floor(double);
60LJ_ASMF double lj_vm_ceil(double); 60LJ_ASMF double lj_vm_ceil(double);
61LJ_ASMF double lj_vm_trunc(double); 61LJ_ASMF double lj_vm_trunc(double);
62LJ_ASMF double lj_vm_powi(double, int32_t);
63#if defined(__ANDROID__) || defined(__symbian__)
64LJ_ASMF double lj_vm_log2(double);
65#else
66#define lj_vm_log2 log2
67#endif
68#if defined(__symbian__)
69LJ_ASMF double lj_vm_exp2(double);
70#else
71#define lj_vm_exp2 exp2
72#endif
62#endif 73#endif
63#endif 74#endif
64 75
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
diff --git a/src/ljamalg.c b/src/ljamalg.c
index 5d90c002..3d1f3938 100644
--- a/src/ljamalg.c
+++ b/src/ljamalg.c
@@ -41,6 +41,7 @@
41#include "lj_state.c" 41#include "lj_state.c"
42#include "lj_dispatch.c" 42#include "lj_dispatch.c"
43#include "lj_vmevent.c" 43#include "lj_vmevent.c"
44#include "lj_vmmath.c"
44#include "lj_api.c" 45#include "lj_api.c"
45#include "lj_lex.c" 46#include "lj_lex.c"
46#include "lj_parse.c" 47#include "lj_parse.c"