1 % (c) 2020-2026 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(external_functions_soft_floats,[
6
7 'SFADD16'/3,
8 'SFSUB16'/3,
9 'SFMUL16'/3,
10 'SFDIV16'/3,
11 'SFSQRT16'/2,
12 'SFMULADD16'/4,
13
14 'SFADD32'/3,
15 'SFSUB32'/3,
16 'SFMUL32'/3,
17 'SFDIV32'/3,
18 'SFSQRT32'/2,
19 'SFMULADD32'/4,
20
21 'SFADD64'/3,
22 'SFSUB64'/3,
23 'SFMUL64'/3,
24 'SFDIV64'/3,
25 'SFSQRT64'/2,
26 'SFMULADD64'/4,
27
28 'SFADD80'/3,
29 'SFSUB80'/3,
30 'SFMUL80'/3,
31 'SFDIV80'/3,
32 'SFSQRT80'/2,
33
34 'SFADD128'/3,
35 'SFSUB128'/3,
36 'SFMUL128'/3,
37 'SFDIV128'/3,
38 'SFSQRT128'/2,
39 'SFMULADD128'/4
40 ]).
41
42 % -------------------------------
43
44 % softfloat functions.
45
46 :- use_module(extension('softfloat/softfloat')).
47
48 'SFADD16'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
49 init_softfloat,
50 add16(X,Y,R).
51
52 'SFSUB16'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
53 init_softfloat,
54 sub16(X,Y,R).
55
56 'SFMUL16'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
57 init_softfloat,
58 mul16(X,Y,R).
59
60 'SFDIV16'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
61 init_softfloat,
62 div16(X,Y,R).
63
64 'SFSQRT16'(term(floating(X)),term(floating(R))) :-
65 init_softfloat,
66 sqrt16(X,R).
67
68 'SFMULADD16'(term(floating(X)),term(floating(Y)),term(floating(Z)),term(floating(R))) :-
69 init_softfloat,
70 muladd16(X,Y,Z,R).
71 %32bit
72
73 'SFADD32'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
74 init_softfloat,
75 add32(X,Y,R).
76
77 'SFSUB32'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
78 init_softfloat,
79 sub32(X,Y,R).
80
81 'SFMUL32'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
82 init_softfloat,
83 mul32(X,Y,R).
84
85 'SFDIV32'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
86 init_softfloat,
87 div32(X,Y,R).
88
89 'SFSQRT32'(term(floating(X)),term(floating(R))) :-
90 init_softfloat,
91 sqrt32(X,R).
92
93 'SFMULADD32'(term(floating(X)),term(floating(Y)),term(floating(Z)),term(floating(R))) :-
94 init_softfloat,
95 muladd32(X,Y,Z,R).
96
97 %32bit
98 %64bit
99
100 'SFADD64'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
101 init_softfloat,
102 add64(X,Y,R).
103
104 'SFSUB64'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
105 init_softfloat,
106 sub64(X,Y,R).
107
108 'SFMUL64'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
109 init_softfloat,
110 mul64(X,Y,R).
111
112 'SFDIV64'(term(floating(X)),term(floating(Y)),term(floating(R))) :-
113 init_softfloat,
114 div64(X,Y,R).
115
116 'SFSQRT64'(term(floating(X)),term(floating(R))) :-
117 init_softfloat,
118 sqrt64(X,R).
119
120 'SFMULADD64'(term(floating(X)),term(floating(Y)),term(floating(Z)),term(floating(R))) :-
121 init_softfloat,
122 muladd64(X,Y,Z,R).
123 %64bit
124 %80bit
125 'SFADD80'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
126 init_softfloat,
127 add80(X1,X2,Y1,Y2,R1,R2).
128
129 'SFSUB80'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
130 init_softfloat,
131 sub80(X1,X2,Y1,Y2,R1,R2).
132
133 'SFMUL80'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
134 init_softfloat,
135 mul80(X1,X2,Y1,Y2,R1,R2).
136
137 'SFDIV80'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
138 init_softfloat,
139 div80(X1,X2,Y1,Y2,R1,R2).
140
141 'SFSQRT80'( (int(X1),int(X2)),(int(R1),int(R2)) ) :-
142 init_softfloat,
143 sqrt80(X1,X2,R1,R2).
144 %80bit
145 %128bit
146 'SFADD128'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
147 init_softfloat,
148 add128(X1,X2,Y1,Y2,R1,R2).
149
150 'SFSUB128'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
151 init_softfloat,
152 sub128(X1,X2,Y1,Y2,R1,R2).
153
154 'SFMUL128'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
155 init_softfloat,
156 mul128(X1,X2,Y1,Y2,R1,R2).
157
158 'SFDIV128'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(R1),int(R2))) :-
159 init_softfloat,
160 div128(X1,X2,Y1,Y2,R1,R2).
161
162 'SFSQRT128'((int(X1),int(X2)),(int(R1),int(R2))) :-
163 init_softfloat,
164 sqrt128(X1,X2,R1,R2).
165
166 'SFMULADD128'((int(X1),int(X2)),(int(Y1),int(Y2)),(int(Z1),int(Z2)),(int(R1),int(R2))) :-
167 init_softfloat,
168 muladd128(X1,X2,Y1,Y2,Z1,Z2,R1,R2).
169 %128bit