1 % (c) 2009-2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen,
2 % Heinrich Heine Universitaet Duesseldorf
3 % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html)
4
5 :- module(softfloat, [
6 init_softfloat/0,
7 %itosf16/3, % Not defined anywhere
8
9 add16/3,
10 mul16/3,
11 sub16/3,
12 div16/3,
13 sqrt16/2,
14 muladd16/4,
15
16 add32/3,
17 mul32/3,
18 sub32/3,
19 div32/3,
20 sqrt32/2,
21 muladd32/4,
22
23 add64/3,
24 mul64/3,
25 sub64/3,
26 div64/3,
27 sqrt64/2,
28 muladd64/4,
29
30 add128/6,
31 mul128/6,
32 sub128/6,
33 div128/6,
34 sqrt128/4,
35 muladd128/8,
36
37 add80/6,
38 mul80/6,
39 sub80/6,
40 div80/6,
41 sqrt80/4
42 ]).
43
44
45 :- use_module(probsrc(module_information),[module_info/2]).
46 :- module_info(group,cbc).
47 :- module_info(description,'This module provides software floating point operations via the berkley softfloat library.').
48
49 foreign_resource(softfloat,
50 [init,
51
52 add16,
53 mul16,
54 sub16,
55 div16,
56 sqrt16,
57 muladd16,
58
59 add32,
60 mul32,
61 sub32,
62 div32,
63 sqrt32,
64 muladd32,
65
66 add64,
67 mul64,
68 sub64,
69 div64,
70 sqrt64,
71 muladd64,
72
73 add128,
74 mul128,
75 sub128,
76 div128,
77 sqrt128,
78 muladd128,
79
80 add80,
81 mul80,
82 sub80,
83 div80,
84 sqrt80]).
85
86 foreign(init, c, init).
87
88 foreign(add16, c, add16(+float,+float,-float)).
89 foreign(mul16, c, mul16(+float,+float,-float)).
90 foreign(sub16, c, sub16(+float,+float,-float)).
91 foreign(div16, c, div16(+float,+float,-float)).
92 foreign(sqrt16, c, sqrt16(+float,-float)).
93 foreign(muladd16, c, muladd16(+float,+float,+float,-float)).
94
95 foreign(add32, c, add32(+float,+float,-float)).
96 foreign(mul32, c, mul32(+float,+float,-float)).
97 foreign(sub32, c, sub32(+float,+float,-float)).
98 foreign(div32, c, div32(+float,+float,-float)).
99 foreign(sqrt32, c, sqrt32(+float,-float)).
100 foreign(muladd32, c, muladd32(+float,+float,+float,-float)).
101
102 foreign(add64, c, add64(+float,+float,-float)).
103 foreign(mul64, c, mul64(+float,+float,-float)).
104 foreign(sub64, c, sub64(+float,+float,-float)).
105 foreign(div64, c, div64(+float,+float,-float)).
106 foreign(sqrt64, c, sqrt64(+float,-float)).
107 foreign(muladd64, c, muladd64(+float,+float,+float,-float)).
108
109 foreign(add80, c, add80(+integer,+integer, +integer,+integer, -integer,-integer)).
110 foreign(mul80, c, mul80(+integer,+integer, +integer,+integer, -integer,-integer)).
111 foreign(sub80, c, sub80(+integer,+integer, +integer,+integer, -integer,-integer)).
112 foreign(div80, c, div80(+integer,+integer, +integer,+integer, -integer,-integer)).
113 foreign(sqrt80, c, sqrt80(+integer,+integer, -integer,-integer)).
114
115 foreign(add128, c, add128(+integer,+integer, +integer,+integer, -integer,-integer)).
116 foreign(mul128, c, mul128(+integer,+integer, +integer,+integer, -integer,-integer)).
117 foreign(sub128, c, sub128(+integer,+integer, +integer,+integer, -integer,-integer)).
118 foreign(div128, c, div128(+integer,+integer, +integer,+integer, -integer,-integer)).
119 foreign(sqrt128, c, sqrt128(+integer,+integer, -integer,-integer)).
120 foreign(muladd128, c, muladd128(+integer,+integer, +integer,+integer, +integer,+integer, -integer,-integer)).
121
122 :- dynamic is_initialised/0.
123
124 init_softfloat :- is_initialised,!.
125 init_softfloat :-
126 safe_load_foreign_resource(softfloat),
127 init,
128 assertz(is_initialised).
129
130 safe_load_foreign_resource(R) :-
131 E=error(existence_error(_,_),_),
132 % print(loading_foreign_resource(R)),nl,
133 catch(
134 load_foreign_resource(library(R)),
135 E,
136 (format(user_error,'~n! Could not load ~w library!~n! Check that it is available in the lib folder of ProB.~n~n',[R]),throw(E))).