Skip to content

Commit 090e291

Browse files
authored
runtime_intrinsics.c: Correct max_double (JuliaLang#57124)
Closes JuliaLang#57119.
1 parent eed3365 commit 090e291

File tree

2 files changed

+80
-6
lines changed

2 files changed

+80
-6
lines changed

src/runtime_intrinsics.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,17 +1424,17 @@ bi_fintrinsic(_min, min_float)
14241424
float max_float(float x, float y) JL_NOTSAFEPOINT
14251425
{
14261426
float diff = x - y;
1427-
float argmin = signbit(diff) ? y : x;
1427+
float argmax = signbit(diff) ? y : x;
14281428
int is_nan = isnan(x) || isnan(y);
1429-
return is_nan ? diff : argmin;
1429+
return is_nan ? diff : argmax;
14301430
}
14311431

14321432
double max_double(double x, double y) JL_NOTSAFEPOINT
14331433
{
14341434
double diff = x - y;
1435-
double argmin = signbit(diff) ? x : y;
1435+
double argmax = signbit(diff) ? y : x;
14361436
int is_nan = isnan(x) || isnan(y);
1437-
return is_nan ? diff : argmin;
1437+
return is_nan ? diff : argmax;
14381438
}
14391439

14401440
#define _max(a, b) sizeof(a) == sizeof(float) ? max_float(a, b) : max_double(a, b)

test/intrinsics.jl

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,81 @@ macro test_intrinsic(intr, args...)
147147
end
148148
end
149149

150+
@testset "Float64 intrinsics" begin
151+
# unary
152+
@test_intrinsic Core.Intrinsics.abs_float Float64(-3.3) Float64(3.3)
153+
@test_intrinsic Core.Intrinsics.neg_float Float64(3.3) Float64(-3.3)
154+
@test_intrinsic Core.Intrinsics.fpext Float64 Float64(3.3) Float64(3.3)
155+
156+
# binary
157+
@test_intrinsic Core.Intrinsics.add_float Float64(3.3) Float64(2) Float64(5.3)
158+
@test_intrinsic Core.Intrinsics.sub_float Float64(3.3) Float64(2) Float64(1.2999999999999998)
159+
@test_intrinsic Core.Intrinsics.mul_float Float64(3.3) Float64(2) Float64(6.6)
160+
@test_intrinsic Core.Intrinsics.div_float Float64(3.3) Float64(2) Float64(1.65)
161+
@test_intrinsic Core.Intrinsics.max_float Float64(1.0) Float64(2.0) Float64(2.0)
162+
@test_intrinsic Core.Intrinsics.min_float Float64(1.0) Float64(2.0) Float64(1.0)
163+
164+
# ternary
165+
@test_intrinsic Core.Intrinsics.fma_float Float64(3.3) Float64(4.4) Float64(5.5) Float64(20.02)
166+
@test_intrinsic Core.Intrinsics.muladd_float Float64(3.3) Float64(4.4) Float64(5.5) Float64(20.02)
167+
168+
# boolean
169+
@test_intrinsic Core.Intrinsics.eq_float Float64(3.3) Float64(3.3) true
170+
@test_intrinsic Core.Intrinsics.eq_float Float64(3.3) Float64(2) false
171+
@test_intrinsic Core.Intrinsics.ne_float Float64(3.3) Float64(3.3) false
172+
@test_intrinsic Core.Intrinsics.ne_float Float64(3.3) Float64(2) true
173+
@test_intrinsic Core.Intrinsics.le_float Float64(3.3) Float64(3.3) true
174+
@test_intrinsic Core.Intrinsics.le_float Float64(3.3) Float64(2) false
175+
176+
# conversions
177+
@test_intrinsic Core.Intrinsics.sitofp Float64 3 Float64(3.0)
178+
@test_intrinsic Core.Intrinsics.uitofp Float64 UInt(3) Float64(3.0)
179+
@test_intrinsic Core.Intrinsics.fptosi Int Float64(3.3) 3
180+
@test_intrinsic Core.Intrinsics.fptoui UInt Float64(3.3) UInt(3)
181+
end
182+
183+
@testset "Float32 intrinsics" begin
184+
# unary
185+
@test_intrinsic Core.Intrinsics.abs_float Float32(-3.3) Float32(3.3)
186+
@test_intrinsic Core.Intrinsics.neg_float Float32(3.3) Float32(-3.3)
187+
@test_intrinsic Core.Intrinsics.fpext Float32 Float32(3.3) Float32(3.3)
188+
@test_intrinsic Core.Intrinsics.fpext Float64 Float32(3.3) 3.299999952316284
189+
@test_intrinsic Core.Intrinsics.fptrunc Float32 Float64(3.3) Float32(3.3)
190+
191+
# binary
192+
@test_intrinsic Core.Intrinsics.add_float Float32(3.3) Float32(2) Float32(5.3)
193+
@test_intrinsic Core.Intrinsics.sub_float Float32(3.3) Float32(2) Float32(1.3)
194+
@test_intrinsic Core.Intrinsics.mul_float Float32(3.3) Float32(2) Float32(6.6)
195+
@test_intrinsic Core.Intrinsics.div_float Float32(3.3) Float32(2) Float32(1.65)
196+
@test_intrinsic Core.Intrinsics.max_float Float32(1.0) Float32(2.0) Float32(2.0)
197+
@test_intrinsic Core.Intrinsics.min_float Float32(1.0) Float32(2.0) Float32(1.0)
198+
199+
# ternary
200+
@test_intrinsic Core.Intrinsics.fma_float Float32(3.3) Float32(4.4) Float32(5.5) Float32(20.02)
201+
@test_intrinsic Core.Intrinsics.muladd_float Float32(3.3) Float32(4.4) Float32(5.5) Float32(20.02)
202+
203+
# boolean
204+
@test_intrinsic Core.Intrinsics.eq_float Float32(3.3) Float32(3.3) true
205+
@test_intrinsic Core.Intrinsics.eq_float Float32(3.3) Float32(2) false
206+
@test_intrinsic Core.Intrinsics.ne_float Float32(3.3) Float32(3.3) false
207+
@test_intrinsic Core.Intrinsics.ne_float Float32(3.3) Float32(2) true
208+
@test_intrinsic Core.Intrinsics.le_float Float32(3.3) Float32(3.3) true
209+
@test_intrinsic Core.Intrinsics.le_float Float32(3.3) Float32(2) false
210+
211+
# conversions
212+
@test_intrinsic Core.Intrinsics.sitofp Float32 3 Float32(3.0)
213+
@test_intrinsic Core.Intrinsics.uitofp Float32 UInt(3) Float32(3.0)
214+
@test_intrinsic Core.Intrinsics.fptosi Int Float32(3.3) 3
215+
@test_intrinsic Core.Intrinsics.fptoui UInt Float32(3.3) UInt(3)
216+
end
217+
150218
@testset "Float16 intrinsics" begin
151219
# unary
220+
@test_intrinsic Core.Intrinsics.abs_float Float16(-3.3) Float16(3.3)
152221
@test_intrinsic Core.Intrinsics.neg_float Float16(3.3) Float16(-3.3)
222+
# See <https://github.com/JuliaLang/julia/issues/57130>
223+
#broken @test_intrinsic Core.Intrinsics.fpext Float16 Float16(3.3) Float16(3.3)
224+
@test_broken Core.Intrinsics.fpext(Float16, Float16(3.3)) === Float16(3.3)
153225
@test_intrinsic Core.Intrinsics.fpext Float32 Float16(3.3) 3.3007812f0
154226
@test_intrinsic Core.Intrinsics.fpext Float64 Float16(3.3) 3.30078125
155227
@test_intrinsic Core.Intrinsics.fptrunc Float16 Float32(3.3) Float16(3.3)
@@ -160,6 +232,8 @@ end
160232
@test_intrinsic Core.Intrinsics.sub_float Float16(3.3) Float16(2) Float16(1.301)
161233
@test_intrinsic Core.Intrinsics.mul_float Float16(3.3) Float16(2) Float16(6.6)
162234
@test_intrinsic Core.Intrinsics.div_float Float16(3.3) Float16(2) Float16(1.65)
235+
@test_intrinsic Core.Intrinsics.max_float Float16(1.0) Float16(2.0) Float16(2.0)
236+
@test_intrinsic Core.Intrinsics.min_float Float16(1.0) Float16(2.0) Float16(1.0)
163237

164238
# ternary
165239
@test_intrinsic Core.Intrinsics.fma_float Float16(3.3) Float16(4.4) Float16(5.5) Float16(20.02)
@@ -174,8 +248,8 @@ end
174248
@test_intrinsic Core.Intrinsics.le_float Float16(3.3) Float16(2) false
175249

176250
# conversions
177-
@test_intrinsic Core.Intrinsics.sitofp Float16 3 Float16(3f0)
178-
@test_intrinsic Core.Intrinsics.uitofp Float16 UInt(3) Float16(3f0)
251+
@test_intrinsic Core.Intrinsics.sitofp Float16 3 Float16(3.0)
252+
@test_intrinsic Core.Intrinsics.uitofp Float16 UInt(3) Float16(3.0)
179253
@test_intrinsic Core.Intrinsics.fptosi Int Float16(3.3) 3
180254
@test_intrinsic Core.Intrinsics.fptoui UInt Float16(3.3) UInt(3)
181255
end

0 commit comments

Comments
 (0)