authorgravatar for jan.hafer@rwth-aachen.deJan Philipp Hafer <jan.hafer@rwth-aachen.de> 2023-02-11 13:36:33+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-02-12 00:10:27+02:00
loge10c0eefde9f994deac55406f9cd099f8a1f56ed
tree99050b8c99b38756448f321c145b926d0efff95c
parentca0528209fc2a70fc52013b36439a093db0ac6e2

compiler_rt: add __powihf2, __powisf2, __powidf2, __powitf2, __powixf2

Implementation and tests ported from LLVM release 80. Tests of __powihf2 created from __powisf2 tests with minor adjustments.

5 files changed, 625 insertions(+), 5 deletions(-)

lib/compiler_rt.zig+1
...@@ -23,6 +23,7 @@ comptime {...@@ -23,6 +23,7 @@ comptime {
23 _ = @import("compiler_rt/multf3.zig");23 _ = @import("compiler_rt/multf3.zig");
24 _ = @import("compiler_rt/mulxf3.zig");24 _ = @import("compiler_rt/mulxf3.zig");
2525
26 _ = @import("compiler_rt/powiXf2.zig");
26 _ = @import("compiler_rt/mulc3.zig");27 _ = @import("compiler_rt/mulc3.zig");
27 _ = @import("compiler_rt/mulhc3.zig");28 _ = @import("compiler_rt/mulhc3.zig");
28 _ = @import("compiler_rt/mulsc3.zig");29 _ = @import("compiler_rt/mulsc3.zig");
lib/compiler_rt/README.md+5-5
...@@ -328,11 +328,11 @@ Integer and Float Operations...@@ -328,11 +328,11 @@ Integer and Float Operations
328| ✓ | __negtf2 | f128 | ∅ | f128 | .. |328| ✓ | __negtf2 | f128 | ∅ | f128 | .. |
329| ✓ | __negxf2 | f80 | ∅ | f80 | .. |329| ✓ | __negxf2 | f80 | ∅ | f80 | .. |
330| | | | | | **Floating point raised to integer power** |330| | | | | | **Floating point raised to integer power** |
331| ✗ | __powihf2 | f16 | f16 | f16 | `a ^ b` |331| ✓ | __powihf2 | f16 | i32 | f16 | `a ^ b` |
332| ✗ | __powisf2 | f32 | f32 | f32 | .. |332| ✓ | __powisf2 | f32 | i32 | f32 | .. |
333| ✗ | __powidf2 | f64 | f64 | f64 | .. |333| ✓ | __powidf2 | f64 | i32 | f64 | .. |
334| ✗ | __powitf2 | f128 | f128 | f128 | .. |334| ✓ | __powitf2 | f128 | i32 | f128 | .. |
335| ✗ | __powixf2 | f80 | f80 | f80 | .. |335| ✓ | __powixf2 | f80 | i32 | f80 | .. |
336| ✓ | __mulhc3 | all4 | f16 | f16 | `(a+ib) * (c+id)` |336| ✓ | __mulhc3 | all4 | f16 | f16 | `(a+ib) * (c+id)` |
337| ✓ | __mulsc3 | all4 | f32 | f32 | .. |337| ✓ | __mulsc3 | all4 | f32 | f32 | .. |
338| ✓ | __muldc3 | all4 | f64 | f64 | .. |338| ✓ | __muldc3 | all4 | f64 | f64 | .. |
lib/compiler_rt/powiXf2.zig created+58
...@@ -0,0 +1,58 @@
1//! a raised to integer power of b
2//! ported from https://github.com/llvm-mirror/compiler-rt/blob/release_80/lib/builtins/powisf2.c
3//! Multiplication order (left-to-right or right-to-left) does not matter for
4//! error propagation and this method is optimized for performance, not accuracy.
5
6const builtin = @import("builtin");
7const common = @import("common.zig");
8const std = @import("std");
9
10pub const panic = common.panic;
11
12comptime {
13 @export(__powihf2, .{ .name = "__powihf2", .linkage = common.linkage, .visibility = common.visibility });
14 @export(__powisf2, .{ .name = "__powisf2", .linkage = common.linkage, .visibility = common.visibility });
15 @export(__powidf2, .{ .name = "__powidf2", .linkage = common.linkage, .visibility = common.visibility });
16 @export(__powitf2, .{ .name = "__powitf2", .linkage = common.linkage, .visibility = common.visibility });
17 @export(__powixf2, .{ .name = "__powixf2", .linkage = common.linkage, .visibility = common.visibility });
18}
19
20inline fn powiXf2(comptime FT: type, a: FT, b: i32) FT {
21 var x_a: FT = a;
22 var x_b: i32 = b;
23 const is_recip: bool = b < 0;
24 var r: FT = 1.0;
25 while (true) {
26 if (@bitCast(u32, x_b) & @as(u32, 1) != 0) {
27 r *= x_a;
28 }
29 x_b = @divTrunc(x_b, @as(i32, 2));
30 if (x_b == 0) break;
31 x_a *= x_a; // Multiplication of x_a propagates the error
32 }
33 return if (is_recip) 1 / r else r;
34}
35
36pub fn __powihf2(a: f16, b: i32) callconv(.C) f16 {
37 return powiXf2(f16, a, b);
38}
39
40pub fn __powisf2(a: f32, b: i32) callconv(.C) f32 {
41 return powiXf2(f32, a, b);
42}
43
44pub fn __powidf2(a: f64, b: i32) callconv(.C) f64 {
45 return powiXf2(f64, a, b);
46}
47
48pub fn __powitf2(a: f128, b: i32) callconv(.C) f128 {
49 return powiXf2(f128, a, b);
50}
51
52pub fn __powixf2(a: f80, b: i32) callconv(.C) f80 {
53 return powiXf2(f80, a, b);
54}
55
56test {
57 _ = @import("powiXf2_test.zig");
58}
lib/compiler_rt/powiXf2_test.zig created+556
...@@ -0,0 +1,556 @@
1// ported from https://github.com/llvm-mirror/compiler-rt/blob/release_80/test/builtins/Unit/
2// powisf2_test.c, powidf2_test.c, powitf2_test.c, powixf2_test.c
3// powihf2 adapted from powisf2 tests
4
5const powiXf2 = @import("powiXf2.zig");
6const testing = @import("std").testing;
7const math = @import("std").math;
8
9fn test__powihf2(a: f16, b: i32, expected: f16) !void {
10 var result = powiXf2.__powihf2(a, b);
11 try testing.expectEqual(expected, result);
12}
13
14fn test__powisf2(a: f32, b: i32, expected: f32) !void {
15 var result = powiXf2.__powisf2(a, b);
16 try testing.expectEqual(expected, result);
17}
18
19fn test__powidf2(a: f64, b: i32, expected: f64) !void {
20 var result = powiXf2.__powidf2(a, b);
21 try testing.expectEqual(expected, result);
22}
23
24fn test__powitf2(a: f128, b: i32, expected: f128) !void {
25 var result = powiXf2.__powitf2(a, b);
26 try testing.expectEqual(expected, result);
27}
28
29fn test__powixf2(a: f80, b: i32, expected: f80) !void {
30 var result = powiXf2.__powixf2(a, b);
31 try testing.expectEqual(expected, result);
32}
33
34test "powihf2" {
35 try test__powisf2(0, 0, 1);
36 try test__powihf2(1, 0, 1);
37 try test__powihf2(1.5, 0, 1);
38 try test__powihf2(2, 0, 1);
39 try test__powihf2(math.inf_f16, 0, 1);
40
41 try test__powihf2(-0.0, 0, 1);
42 try test__powihf2(-1, 0, 1);
43 try test__powihf2(-1.5, 0, 1);
44 try test__powihf2(-2, 0, 1);
45 try test__powihf2(-math.inf_f16, 0, 1);
46
47 try test__powihf2(0, 1, 0);
48 try test__powihf2(0, 2, 0);
49 try test__powihf2(0, 3, 0);
50 try test__powihf2(0, 4, 0);
51 try test__powihf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
52 try test__powihf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 0);
53
54 try test__powihf2(-0.0, 1, -0.0);
55 try test__powihf2(-0.0, 2, 0);
56 try test__powihf2(-0.0, 3, -0.0);
57 try test__powihf2(-0.0, 4, 0);
58 try test__powihf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
59 try test__powihf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -0.0);
60
61 try test__powihf2(1, 1, 1);
62 try test__powihf2(1, 2, 1);
63 try test__powihf2(1, 3, 1);
64 try test__powihf2(1, 4, 1);
65 try test__powihf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 1);
66 try test__powihf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 1);
67
68 try test__powihf2(math.inf_f16, 1, math.inf_f16);
69 try test__powihf2(math.inf_f16, 2, math.inf_f16);
70 try test__powihf2(math.inf_f16, 3, math.inf_f16);
71 try test__powihf2(math.inf_f16, 4, math.inf_f16);
72 try test__powihf2(math.inf_f16, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f16);
73 try test__powihf2(math.inf_f16, @bitCast(i32, @as(u32, 0x7FFFFFFF)), math.inf_f16);
74
75 try test__powihf2(-math.inf_f16, 1, -math.inf_f16);
76 try test__powihf2(-math.inf_f16, 2, math.inf_f16);
77 try test__powihf2(-math.inf_f16, 3, -math.inf_f16);
78 try test__powihf2(-math.inf_f16, 4, math.inf_f16);
79 try test__powihf2(-math.inf_f16, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f16);
80 try test__powihf2(-math.inf_f16, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -math.inf_f16);
81 //
82 try test__powihf2(0, -1, math.inf_f16);
83 try test__powihf2(0, -2, math.inf_f16);
84 try test__powihf2(0, -3, math.inf_f16);
85 try test__powihf2(0, -4, math.inf_f16);
86 try test__powihf2(0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f16); // 0 ^ anything = +inf
87 try test__powihf2(0, @bitCast(i32, @as(u32, 0x80000001)), math.inf_f16);
88 try test__powihf2(0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f16);
89
90 try test__powihf2(-0.0, -1, -math.inf_f16);
91 try test__powihf2(-0.0, -2, math.inf_f16);
92 try test__powihf2(-0.0, -3, -math.inf_f16);
93 try test__powihf2(-0.0, -4, math.inf_f16);
94 try test__powihf2(-0.0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f16); // -0 ^ anything even = +inf
95 try test__powihf2(-0.0, @bitCast(i32, @as(u32, 0x80000001)), -math.inf_f16); // -0 ^ anything odd = -inf
96 try test__powihf2(-0.0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f16);
97
98 try test__powihf2(1, -1, 1);
99 try test__powihf2(1, -2, 1);
100 try test__powihf2(1, -3, 1);
101 try test__powihf2(1, -4, 1);
102 try test__powihf2(1, @bitCast(i32, @as(u32, 0x80000002)), 1); // 1.0 ^ anything = 1
103 try test__powihf2(1, @bitCast(i32, @as(u32, 0x80000001)), 1);
104 try test__powihf2(1, @bitCast(i32, @as(u32, 0x80000000)), 1);
105
106 try test__powihf2(math.inf_f16, -1, 0);
107 try test__powihf2(math.inf_f16, -2, 0);
108 try test__powihf2(math.inf_f16, -3, 0);
109 try test__powihf2(math.inf_f16, -4, 0);
110 try test__powihf2(math.inf_f16, @bitCast(i32, @as(u32, 0x80000002)), 0);
111 try test__powihf2(math.inf_f16, @bitCast(i32, @as(u32, 0x80000001)), 0);
112 try test__powihf2(math.inf_f16, @bitCast(i32, @as(u32, 0x80000000)), 0);
113 //
114 try test__powihf2(-math.inf_f16, -1, -0.0);
115 try test__powihf2(-math.inf_f16, -2, 0);
116 try test__powihf2(-math.inf_f16, -3, -0.0);
117 try test__powihf2(-math.inf_f16, -4, 0);
118 try test__powihf2(-math.inf_f16, @bitCast(i32, @as(u32, 0x80000002)), 0);
119 try test__powihf2(-math.inf_f16, @bitCast(i32, @as(u32, 0x80000001)), -0.0);
120 try test__powihf2(-math.inf_f16, @bitCast(i32, @as(u32, 0x80000000)), 0);
121
122 try test__powihf2(2, 10, 1024.0);
123 try test__powihf2(-2, 10, 1024.0);
124 try test__powihf2(2, -10, 1.0 / 1024.0);
125 try test__powihf2(-2, -10, 1.0 / 1024.0);
126
127 try test__powihf2(2, 14, 16384.0);
128 try test__powihf2(-2, 14, 16384.0);
129 try test__powihf2(2, 15, 32768.0);
130 try test__powihf2(-2, 15, -32768.0);
131 try test__powihf2(2, 16, math.inf_f16);
132 try test__powihf2(-2, 16, math.inf_f16);
133
134 try test__powihf2(2, -13, 1.0 / 8192.0);
135 try test__powihf2(-2, -13, -1.0 / 8192.0);
136 try test__powihf2(2, -15, 1.0 / 32768.0);
137 try test__powihf2(-2, -15, -1.0 / 32768.0);
138 try test__powihf2(2, -16, 0.0); // expected = 0.0 = 1/(-2**16)
139 try test__powihf2(-2, -16, 0.0); // expected = 0.0 = 1/(2**16)
140}
141
142test "powisf2" {
143 try test__powisf2(0, 0, 1);
144 try test__powisf2(1, 0, 1);
145 try test__powisf2(1.5, 0, 1);
146 try test__powisf2(2, 0, 1);
147 try test__powisf2(math.inf_f32, 0, 1);
148
149 try test__powisf2(-0.0, 0, 1);
150 try test__powisf2(-1, 0, 1);
151 try test__powisf2(-1.5, 0, 1);
152 try test__powisf2(-2, 0, 1);
153 try test__powisf2(-math.inf_f32, 0, 1);
154
155 try test__powisf2(0, 1, 0);
156 try test__powisf2(0, 2, 0);
157 try test__powisf2(0, 3, 0);
158 try test__powisf2(0, 4, 0);
159 try test__powisf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
160 try test__powisf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 0);
161
162 try test__powisf2(-0.0, 1, -0.0);
163 try test__powisf2(-0.0, 2, 0);
164 try test__powisf2(-0.0, 3, -0.0);
165 try test__powisf2(-0.0, 4, 0);
166 try test__powisf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
167 try test__powisf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -0.0);
168
169 try test__powisf2(1, 1, 1);
170 try test__powisf2(1, 2, 1);
171 try test__powisf2(1, 3, 1);
172 try test__powisf2(1, 4, 1);
173 try test__powisf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 1);
174 try test__powisf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 1);
175
176 try test__powisf2(math.inf_f32, 1, math.inf_f32);
177 try test__powisf2(math.inf_f32, 2, math.inf_f32);
178 try test__powisf2(math.inf_f32, 3, math.inf_f32);
179 try test__powisf2(math.inf_f32, 4, math.inf_f32);
180 try test__powisf2(math.inf_f32, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f32);
181 try test__powisf2(math.inf_f32, @bitCast(i32, @as(u32, 0x7FFFFFFF)), math.inf_f32);
182
183 try test__powisf2(-math.inf_f32, 1, -math.inf_f32);
184 try test__powisf2(-math.inf_f32, 2, math.inf_f32);
185 try test__powisf2(-math.inf_f32, 3, -math.inf_f32);
186 try test__powisf2(-math.inf_f32, 4, math.inf_f32);
187 try test__powisf2(-math.inf_f32, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f32);
188 try test__powisf2(-math.inf_f32, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -math.inf_f32);
189
190 try test__powisf2(0, -1, math.inf_f32);
191 try test__powisf2(0, -2, math.inf_f32);
192 try test__powisf2(0, -3, math.inf_f32);
193 try test__powisf2(0, -4, math.inf_f32);
194 try test__powisf2(0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f32);
195 try test__powisf2(0, @bitCast(i32, @as(u32, 0x80000001)), math.inf_f32);
196 try test__powisf2(0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f32);
197
198 try test__powisf2(-0.0, -1, -math.inf_f32);
199 try test__powisf2(-0.0, -2, math.inf_f32);
200 try test__powisf2(-0.0, -3, -math.inf_f32);
201 try test__powisf2(-0.0, -4, math.inf_f32);
202 try test__powisf2(-0.0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f32);
203 try test__powisf2(-0.0, @bitCast(i32, @as(u32, 0x80000001)), -math.inf_f32);
204 try test__powisf2(-0.0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f32);
205
206 try test__powisf2(1, -1, 1);
207 try test__powisf2(1, -2, 1);
208 try test__powisf2(1, -3, 1);
209 try test__powisf2(1, -4, 1);
210 try test__powisf2(1, @bitCast(i32, @as(u32, 0x80000002)), 1);
211 try test__powisf2(1, @bitCast(i32, @as(u32, 0x80000001)), 1);
212 try test__powisf2(1, @bitCast(i32, @as(u32, 0x80000000)), 1);
213
214 try test__powisf2(math.inf_f32, -1, 0);
215 try test__powisf2(math.inf_f32, -2, 0);
216 try test__powisf2(math.inf_f32, -3, 0);
217 try test__powisf2(math.inf_f32, -4, 0);
218 try test__powisf2(math.inf_f32, @bitCast(i32, @as(u32, 0x80000002)), 0);
219 try test__powisf2(math.inf_f32, @bitCast(i32, @as(u32, 0x80000001)), 0);
220 try test__powisf2(math.inf_f32, @bitCast(i32, @as(u32, 0x80000000)), 0);
221
222 try test__powisf2(-math.inf_f32, -1, -0.0);
223 try test__powisf2(-math.inf_f32, -2, 0);
224 try test__powisf2(-math.inf_f32, -3, -0.0);
225 try test__powisf2(-math.inf_f32, -4, 0);
226 try test__powisf2(-math.inf_f32, @bitCast(i32, @as(u32, 0x80000002)), 0);
227 try test__powisf2(-math.inf_f32, @bitCast(i32, @as(u32, 0x80000001)), -0.0);
228 try test__powisf2(-math.inf_f32, @bitCast(i32, @as(u32, 0x80000000)), 0);
229
230 try test__powisf2(2.0, 10, 1024.0);
231 try test__powisf2(-2, 10, 1024.0);
232 try test__powisf2(2, -10, 1.0 / 1024.0);
233 try test__powisf2(-2, -10, 1.0 / 1024.0);
234 //
235 try test__powisf2(2, 19, 524288.0);
236 try test__powisf2(-2, 19, -524288.0);
237 try test__powisf2(2, -19, 1.0 / 524288.0);
238 try test__powisf2(-2, -19, -1.0 / 524288.0);
239
240 try test__powisf2(2, 31, 2147483648.0);
241 try test__powisf2(-2, 31, -2147483648.0);
242 try test__powisf2(2, -31, 1.0 / 2147483648.0);
243 try test__powisf2(-2, -31, -1.0 / 2147483648.0);
244}
245
246test "powidf2" {
247 try test__powidf2(0, 0, 1);
248 try test__powidf2(1, 0, 1);
249 try test__powidf2(1.5, 0, 1);
250 try test__powidf2(2, 0, 1);
251 try test__powidf2(math.inf_f64, 0, 1);
252
253 try test__powidf2(-0.0, 0, 1);
254 try test__powidf2(-1, 0, 1);
255 try test__powidf2(-1.5, 0, 1);
256 try test__powidf2(-2, 0, 1);
257 try test__powidf2(-math.inf_f64, 0, 1);
258
259 try test__powidf2(0, 1, 0);
260 try test__powidf2(0, 2, 0);
261 try test__powidf2(0, 3, 0);
262 try test__powidf2(0, 4, 0);
263 try test__powidf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
264 try test__powidf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 0);
265
266 try test__powidf2(-0.0, 1, -0.0);
267 try test__powidf2(-0.0, 2, 0);
268 try test__powidf2(-0.0, 3, -0.0);
269 try test__powidf2(-0.0, 4, 0);
270 try test__powidf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
271 try test__powidf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -0.0);
272
273 try test__powidf2(1, 1, 1);
274 try test__powidf2(1, 2, 1);
275 try test__powidf2(1, 3, 1);
276 try test__powidf2(1, 4, 1);
277 try test__powidf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 1);
278 try test__powidf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 1);
279
280 try test__powidf2(math.inf_f64, 1, math.inf_f64);
281 try test__powidf2(math.inf_f64, 2, math.inf_f64);
282 try test__powidf2(math.inf_f64, 3, math.inf_f64);
283 try test__powidf2(math.inf_f64, 4, math.inf_f64);
284 try test__powidf2(math.inf_f64, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f64);
285 try test__powidf2(math.inf_f64, @bitCast(i32, @as(u32, 0x7FFFFFFF)), math.inf_f64);
286
287 try test__powidf2(-math.inf_f64, 1, -math.inf_f64);
288 try test__powidf2(-math.inf_f64, 2, math.inf_f64);
289 try test__powidf2(-math.inf_f64, 3, -math.inf_f64);
290 try test__powidf2(-math.inf_f64, 4, math.inf_f64);
291 try test__powidf2(-math.inf_f64, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f64);
292 try test__powidf2(-math.inf_f64, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -math.inf_f64);
293
294 try test__powidf2(0, -1, math.inf_f64);
295 try test__powidf2(0, -2, math.inf_f64);
296 try test__powidf2(0, -3, math.inf_f64);
297 try test__powidf2(0, -4, math.inf_f64);
298 try test__powidf2(0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f64);
299 try test__powidf2(0, @bitCast(i32, @as(u32, 0x80000001)), math.inf_f64);
300 try test__powidf2(0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f64);
301
302 try test__powidf2(-0.0, -1, -math.inf_f64);
303 try test__powidf2(-0.0, -2, math.inf_f64);
304 try test__powidf2(-0.0, -3, -math.inf_f64);
305 try test__powidf2(-0.0, -4, math.inf_f64);
306 try test__powidf2(-0.0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f64);
307 try test__powidf2(-0.0, @bitCast(i32, @as(u32, 0x80000001)), -math.inf_f64);
308 try test__powidf2(-0.0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f64);
309
310 try test__powidf2(1, -1, 1);
311 try test__powidf2(1, -2, 1);
312 try test__powidf2(1, -3, 1);
313 try test__powidf2(1, -4, 1);
314 try test__powidf2(1, @bitCast(i32, @as(u32, 0x80000002)), 1);
315 try test__powidf2(1, @bitCast(i32, @as(u32, 0x80000001)), 1);
316 try test__powidf2(1, @bitCast(i32, @as(u32, 0x80000000)), 1);
317
318 try test__powidf2(math.inf_f64, -1, 0);
319 try test__powidf2(math.inf_f64, -2, 0);
320 try test__powidf2(math.inf_f64, -3, 0);
321 try test__powidf2(math.inf_f64, -4, 0);
322 try test__powidf2(math.inf_f64, @bitCast(i32, @as(u32, 0x80000002)), 0);
323 try test__powidf2(math.inf_f64, @bitCast(i32, @as(u32, 0x80000001)), 0);
324 try test__powidf2(math.inf_f64, @bitCast(i32, @as(u32, 0x80000000)), 0);
325
326 try test__powidf2(-math.inf_f64, -1, -0.0);
327 try test__powidf2(-math.inf_f64, -2, 0);
328 try test__powidf2(-math.inf_f64, -3, -0.0);
329 try test__powidf2(-math.inf_f64, -4, 0);
330 try test__powidf2(-math.inf_f64, @bitCast(i32, @as(u32, 0x80000002)), 0);
331 try test__powidf2(-math.inf_f64, @bitCast(i32, @as(u32, 0x80000001)), -0.0);
332 try test__powidf2(-math.inf_f64, @bitCast(i32, @as(u32, 0x80000000)), 0);
333
334 try test__powidf2(2, 10, 1024.0);
335 try test__powidf2(-2, 10, 1024.0);
336 try test__powidf2(2, -10, 1.0 / 1024.0);
337 try test__powidf2(-2, -10, 1.0 / 1024.0);
338
339 try test__powidf2(2, 19, 524288.0);
340 try test__powidf2(-2, 19, -524288.0);
341 try test__powidf2(2, -19, 1.0 / 524288.0);
342 try test__powidf2(-2, -19, -1.0 / 524288.0);
343
344 try test__powidf2(2, 31, 2147483648.0);
345 try test__powidf2(-2, 31, -2147483648.0);
346 try test__powidf2(2, -31, 1.0 / 2147483648.0);
347 try test__powidf2(-2, -31, -1.0 / 2147483648.0);
348}
349
350test "powitf2" {
351 try test__powitf2(0, 0, 1);
352 try test__powitf2(1, 0, 1);
353 try test__powitf2(1.5, 0, 1);
354 try test__powitf2(2, 0, 1);
355 try test__powitf2(math.inf_f128, 0, 1);
356
357 try test__powitf2(-0.0, 0, 1);
358 try test__powitf2(-1, 0, 1);
359 try test__powitf2(-1.5, 0, 1);
360 try test__powitf2(-2, 0, 1);
361 try test__powitf2(-math.inf_f128, 0, 1);
362
363 try test__powitf2(0, 1, 0);
364 try test__powitf2(0, 2, 0);
365 try test__powitf2(0, 3, 0);
366 try test__powitf2(0, 4, 0);
367 try test__powitf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
368 try test__powitf2(0, 0x7FFFFFFF, 0);
369
370 try test__powitf2(-0.0, 1, -0.0);
371 try test__powitf2(-0.0, 2, 0);
372 try test__powitf2(-0.0, 3, -0.0);
373 try test__powitf2(-0.0, 4, 0);
374 try test__powitf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
375 try test__powitf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -0.0);
376
377 try test__powitf2(1, 1, 1);
378 try test__powitf2(1, 2, 1);
379 try test__powitf2(1, 3, 1);
380 try test__powitf2(1, 4, 1);
381 try test__powitf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 1);
382 try test__powitf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 1);
383
384 try test__powitf2(math.inf_f128, 1, math.inf_f128);
385 try test__powitf2(math.inf_f128, 2, math.inf_f128);
386 try test__powitf2(math.inf_f128, 3, math.inf_f128);
387 try test__powitf2(math.inf_f128, 4, math.inf_f128);
388 try test__powitf2(math.inf_f128, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f128);
389 try test__powitf2(math.inf_f128, @bitCast(i32, @as(u32, 0x7FFFFFFF)), math.inf_f128);
390
391 try test__powitf2(-math.inf_f128, 1, -math.inf_f128);
392 try test__powitf2(-math.inf_f128, 2, math.inf_f128);
393 try test__powitf2(-math.inf_f128, 3, -math.inf_f128);
394 try test__powitf2(-math.inf_f128, 4, math.inf_f128);
395 try test__powitf2(-math.inf_f128, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f128);
396 try test__powitf2(-math.inf_f128, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -math.inf_f128);
397
398 try test__powitf2(0, -1, math.inf_f128);
399 try test__powitf2(0, -2, math.inf_f128);
400 try test__powitf2(0, -3, math.inf_f128);
401 try test__powitf2(0, -4, math.inf_f128);
402 try test__powitf2(0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f128);
403 try test__powitf2(0, @bitCast(i32, @as(u32, 0x80000001)), math.inf_f128);
404 try test__powitf2(0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f128);
405
406 try test__powitf2(-0.0, -1, -math.inf_f128);
407 try test__powitf2(-0.0, -2, math.inf_f128);
408 try test__powitf2(-0.0, -3, -math.inf_f128);
409 try test__powitf2(-0.0, -4, math.inf_f128);
410 try test__powitf2(-0.0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f128);
411 try test__powitf2(-0.0, @bitCast(i32, @as(u32, 0x80000001)), -math.inf_f128);
412 try test__powitf2(-0.0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f128);
413
414 try test__powitf2(1, -1, 1);
415 try test__powitf2(1, -2, 1);
416 try test__powitf2(1, -3, 1);
417 try test__powitf2(1, -4, 1);
418 try test__powitf2(1, @bitCast(i32, @as(u32, 0x80000002)), 1);
419 try test__powitf2(1, @bitCast(i32, @as(u32, 0x80000001)), 1);
420 try test__powitf2(1, @bitCast(i32, @as(u32, 0x80000000)), 1);
421
422 try test__powitf2(math.inf_f128, -1, 0);
423 try test__powitf2(math.inf_f128, -2, 0);
424 try test__powitf2(math.inf_f128, -3, 0);
425 try test__powitf2(math.inf_f128, -4, 0);
426 try test__powitf2(math.inf_f128, @bitCast(i32, @as(u32, 0x80000002)), 0);
427 try test__powitf2(math.inf_f128, @bitCast(i32, @as(u32, 0x80000001)), 0);
428 try test__powitf2(math.inf_f128, @bitCast(i32, @as(u32, 0x80000000)), 0);
429
430 try test__powitf2(-math.inf_f128, -1, -0.0);
431 try test__powitf2(-math.inf_f128, -2, 0);
432 try test__powitf2(-math.inf_f128, -3, -0.0);
433 try test__powitf2(-math.inf_f128, -4, 0);
434 try test__powitf2(-math.inf_f128, @bitCast(i32, @as(u32, 0x80000002)), 0);
435 try test__powitf2(-math.inf_f128, @bitCast(i32, @as(u32, 0x80000001)), -0.0);
436 try test__powitf2(-math.inf_f128, @bitCast(i32, @as(u32, 0x80000000)), 0);
437
438 try test__powitf2(2, 10, 1024.0);
439 try test__powitf2(-2, 10, 1024.0);
440 try test__powitf2(2, -10, 1.0 / 1024.0);
441 try test__powitf2(-2, -10, 1.0 / 1024.0);
442
443 try test__powitf2(2, 19, 524288.0);
444 try test__powitf2(-2, 19, -524288.0);
445 try test__powitf2(2, -19, 1.0 / 524288.0);
446 try test__powitf2(-2, -19, -1.0 / 524288.0);
447
448 try test__powitf2(2, 31, 2147483648.0);
449 try test__powitf2(-2, 31, -2147483648.0);
450 try test__powitf2(2, -31, 1.0 / 2147483648.0);
451 try test__powitf2(-2, -31, -1.0 / 2147483648.0);
452}
453
454test "powixf2" {
455 try test__powixf2(0, 0, 1);
456 try test__powixf2(1, 0, 1);
457 try test__powixf2(1.5, 0, 1);
458 try test__powixf2(2, 0, 1);
459 try test__powixf2(math.inf_f80, 0, 1);
460
461 try test__powixf2(-0.0, 0, 1);
462 try test__powixf2(-1, 0, 1);
463 try test__powixf2(-1.5, 0, 1);
464 try test__powixf2(-2, 0, 1);
465 try test__powixf2(-math.inf_f80, 0, 1);
466
467 try test__powixf2(0, 1, 0);
468 try test__powixf2(0, 2, 0);
469 try test__powixf2(0, 3, 0);
470 try test__powixf2(0, 4, 0);
471 try test__powixf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
472 try test__powixf2(0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 0);
473
474 try test__powixf2(-0.0, 1, -0.0);
475 try test__powixf2(-0.0, 2, 0);
476 try test__powixf2(-0.0, 3, -0.0);
477 try test__powixf2(-0.0, 4, 0);
478 try test__powixf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 0);
479 try test__powixf2(-0.0, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -0.0);
480
481 try test__powixf2(1, 1, 1);
482 try test__powixf2(1, 2, 1);
483 try test__powixf2(1, 3, 1);
484 try test__powixf2(1, 4, 1);
485 try test__powixf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFE)), 1);
486 try test__powixf2(1, @bitCast(i32, @as(u32, 0x7FFFFFFF)), 1);
487
488 try test__powixf2(math.inf_f80, 1, math.inf_f80);
489 try test__powixf2(math.inf_f80, 2, math.inf_f80);
490 try test__powixf2(math.inf_f80, 3, math.inf_f80);
491 try test__powixf2(math.inf_f80, 4, math.inf_f80);
492 try test__powixf2(math.inf_f80, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f80);
493 try test__powixf2(math.inf_f80, @bitCast(i32, @as(u32, 0x7FFFFFFF)), math.inf_f80);
494
495 try test__powixf2(-math.inf_f80, 1, -math.inf_f80);
496 try test__powixf2(-math.inf_f80, 2, math.inf_f80);
497 try test__powixf2(-math.inf_f80, 3, -math.inf_f80);
498 try test__powixf2(-math.inf_f80, 4, math.inf_f80);
499 try test__powixf2(-math.inf_f80, @bitCast(i32, @as(u32, 0x7FFFFFFE)), math.inf_f80);
500 try test__powixf2(-math.inf_f80, @bitCast(i32, @as(u32, 0x7FFFFFFF)), -math.inf_f80);
501
502 try test__powixf2(0, -1, math.inf_f80);
503 try test__powixf2(0, -2, math.inf_f80);
504 try test__powixf2(0, -3, math.inf_f80);
505 try test__powixf2(0, -4, math.inf_f80);
506 try test__powixf2(0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f80);
507 try test__powixf2(0, @bitCast(i32, @as(u32, 0x80000001)), math.inf_f80);
508 try test__powixf2(0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f80);
509
510 try test__powixf2(-0.0, -1, -math.inf_f80);
511 try test__powixf2(-0.0, -2, math.inf_f80);
512 try test__powixf2(-0.0, -3, -math.inf_f80);
513 try test__powixf2(-0.0, -4, math.inf_f80);
514 try test__powixf2(-0.0, @bitCast(i32, @as(u32, 0x80000002)), math.inf_f80);
515 try test__powixf2(-0.0, @bitCast(i32, @as(u32, 0x80000001)), -math.inf_f80);
516 try test__powixf2(-0.0, @bitCast(i32, @as(u32, 0x80000000)), math.inf_f80);
517
518 try test__powixf2(1, -1, 1);
519 try test__powixf2(1, -2, 1);
520 try test__powixf2(1, -3, 1);
521 try test__powixf2(1, -4, 1);
522 try test__powixf2(1, @bitCast(i32, @as(u32, 0x80000002)), 1);
523 try test__powixf2(1, @bitCast(i32, @as(u32, 0x80000001)), 1);
524 try test__powixf2(1, @bitCast(i32, @as(u32, 0x80000000)), 1);
525
526 try test__powixf2(math.inf_f80, -1, 0);
527 try test__powixf2(math.inf_f80, -2, 0);
528 try test__powixf2(math.inf_f80, -3, 0);
529 try test__powixf2(math.inf_f80, -4, 0);
530 try test__powixf2(math.inf_f80, @bitCast(i32, @as(u32, 0x80000002)), 0);
531 try test__powixf2(math.inf_f80, @bitCast(i32, @as(u32, 0x80000001)), 0);
532 try test__powixf2(math.inf_f80, @bitCast(i32, @as(u32, 0x80000000)), 0);
533
534 try test__powixf2(-math.inf_f80, -1, -0.0);
535 try test__powixf2(-math.inf_f80, -2, 0);
536 try test__powixf2(-math.inf_f80, -3, -0.0);
537 try test__powixf2(-math.inf_f80, -4, 0);
538 try test__powixf2(-math.inf_f80, @bitCast(i32, @as(u32, 0x80000002)), 0);
539 try test__powixf2(-math.inf_f80, @bitCast(i32, @as(u32, 0x80000001)), -0.0);
540 try test__powixf2(-math.inf_f80, @bitCast(i32, @as(u32, 0x80000000)), 0);
541
542 try test__powixf2(2, 10, 1024.0);
543 try test__powixf2(-2, 10, 1024.0);
544 try test__powixf2(2, -10, 1.0 / 1024.0);
545 try test__powixf2(-2, -10, 1.0 / 1024.0);
546
547 try test__powixf2(2, 19, 524288.0);
548 try test__powixf2(-2, 19, -524288.0);
549 try test__powixf2(2, -19, 1.0 / 524288.0);
550 try test__powixf2(-2, -19, -1.0 / 524288.0);
551
552 try test__powixf2(2, 31, 2147483648.0);
553 try test__powixf2(-2, 31, -2147483648.0);
554 try test__powixf2(2, -31, 1.0 / 2147483648.0);
555 try test__powixf2(-2, -31, -1.0 / 2147483648.0);
556}
tools/gen_stubs.zig+5
...@@ -833,6 +833,11 @@ const blacklisted_symbols = [_][]const u8{...@@ -833,6 +833,11 @@ const blacklisted_symbols = [_][]const u8{
833 "__popcountdi2",833 "__popcountdi2",
834 "__popcountsi2",834 "__popcountsi2",
835 "__popcountti2",835 "__popcountti2",
836 "__powidf2",
837 "__powihf2",
838 "__powisf2",
839 "__powitf2",
840 "__powixf2",
836 "__roundh",841 "__roundh",
837 "__roundx",842 "__roundx",
838 "__sincosh",843 "__sincosh",