aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/rtl/hipe_rtl_arch.erl
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2011-11-15 12:27:29 +0100
committerSverker Eriksson <[email protected]>2011-11-17 14:16:16 +0100
commitc0b6c30a98c154a1ea190dd930b53dc4f155e67b (patch)
tree10d482fc47d6b9be331c6c0fcf4951b26adc0d22 /lib/hipe/rtl/hipe_rtl_arch.erl
parent30f85a8d2f81665626e5a94d10ff9b0ea507caac (diff)
downloadotp-c0b6c30a98c154a1ea190dd930b53dc4f155e67b.tar.gz
otp-c0b6c30a98c154a1ea190dd930b53dc4f155e67b.tar.bz2
otp-c0b6c30a98c154a1ea190dd930b53dc4f155e67b.zip
hipe,erts: Allow hipe without floating point exceptions
Diffstat (limited to 'lib/hipe/rtl/hipe_rtl_arch.erl')
-rw-r--r--lib/hipe/rtl/hipe_rtl_arch.erl27
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/hipe/rtl/hipe_rtl_arch.erl b/lib/hipe/rtl/hipe_rtl_arch.erl
index 22cda57a3a..99eb80f3d1 100644
--- a/lib/hipe/rtl/hipe_rtl_arch.erl
+++ b/lib/hipe/rtl/hipe_rtl_arch.erl
@@ -65,7 +65,8 @@
%% alignment/0,
nr_of_return_regs/0,
log2_word_size/0,
- word_size/0
+ word_size/0,
+ mk_fp_check_result/1
]).
-include("hipe_literals.hrl").
@@ -558,6 +559,12 @@ eval_cond_bits(Cond, N, Z, V, C) ->
%%----------------------------------------------------------------------
fwait() ->
+ case ?ERTS_NO_FPE_SIGNALS of
+ 1 -> [];
+ 0 -> fwait_real()
+ end.
+
+fwait_real() ->
case get(hipe_target_arch) of
x86 -> [hipe_rtl:mk_call([], 'fwait', [], [], [], not_remote)];
amd64 -> [hipe_rtl:mk_call([], 'fwait', [], [], [], not_remote)];
@@ -573,6 +580,12 @@ fwait() ->
%% Returns RTL code to restore the FPU after a floating-point exception.
%% @end
handle_fp_exception() ->
+ case ?ERTS_NO_FPE_SIGNALS of
+ 1 -> [];
+ 0 -> handle_real_fp_exception()
+ end.
+
+handle_real_fp_exception() ->
case get(hipe_target_arch) of
x86 ->
ContLbl = hipe_rtl:mk_new_label(),
@@ -655,3 +668,15 @@ nr_of_return_regs() ->
1
%% hipe_amd64_registers:nr_rets();
end.
+
+
+mk_fp_check_result(Result) ->
+ case ?ERTS_NO_FPE_SIGNALS of
+ 0 ->
+ [];
+ 1 ->
+ [hipe_rtl:mk_fstore(proc_pointer(),
+ hipe_rtl:mk_imm(?P_FLOAT_RESULT),
+ Result),
+ hipe_rtl:mk_call([], emulate_fpe, [], [], [], not_remote)]
+ end.