| 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 |