2
2
#
3
3
# Copyright (c) 2013 Victor Oliveira <[email protected] >
4
4
# Copyright (c) 2013 Jesse Towner <[email protected] >
5
+ # Copyright (c) 2024 Romaric Jodin <[email protected] >
5
6
#
6
7
# Permission is hereby granted, free of charge, to any person obtaining a copy
7
8
# of this software and associated documentation files (the "Software"), to deal
26
27
#
27
28
# convert_<destTypen><_sat><_roundingMode>(<sourceTypen>)
28
29
30
+ import sys
31
+
32
+ clspv = False
33
+ if len (sys .argv ) == 2 and sys .argv [1 ] == "--clspv" :
34
+ clspv = True
35
+
29
36
types = [
30
37
"char" ,
31
38
"uchar" ,
@@ -251,13 +258,19 @@ def generate_default_conversion(src, dst, mode):
251
258
print ("#endif" )
252
259
253
260
254
- for src in types :
255
- for dst in types :
256
- generate_default_conversion (src , dst , "" )
261
+ # Do not generate default conversion for clspv as they are handle natively
262
+ if not clspv :
263
+ for src in types :
264
+ for dst in types :
265
+ generate_default_conversion (src , dst , "" )
257
266
258
267
for src in int_types :
259
268
for dst in int_types :
260
269
for mode in rounding_modes :
270
+ # Do not generate "_rte" conversion for clspv as they are handle
271
+ # natively
272
+ if clspv and mode == "_rte" :
273
+ continue
261
274
generate_default_conversion (src , dst , mode )
262
275
263
276
#
@@ -307,8 +320,8 @@ def generate_saturated_conversion(src, dst, size):
307
320
# Conversion from float to int
308
321
print (
309
322
""" {DST}{N} y = convert_{DST}{N}(x);
310
- y = select(y, ({DST}{N}){DST_MIN}, {BP}(x < ({SRC}{N}){DST_MIN}){BS});
311
- y = select(y, ({DST}{N}){DST_MAX}, {BP}(x > ({SRC}{N}){DST_MAX}){BS});
323
+ y = select(y, ({DST}{N}){DST_MIN}, {BP}(x <= ({SRC}{N}){DST_MIN}){BS});
324
+ y = select(y, ({DST}{N}){DST_MAX}, {BP}(x >= ({SRC}{N}){DST_MAX}){BS});
312
325
return y;""" .format (
313
326
SRC = src ,
314
327
DST = dst ,
@@ -432,7 +445,10 @@ def generate_float_conversion(src, dst, size, mode, sat):
432
445
print (" return convert_{DST}{N}(x);" .format (DST = dst , N = size ))
433
446
else :
434
447
print (" {DST}{N} r = convert_{DST}{N}(x);" .format (DST = dst , N = size ))
435
- print (" {SRC}{N} y = convert_{SRC}{N}(r);" .format (SRC = src , N = size ))
448
+ if clspv :
449
+ print (" {SRC}{N} y = convert_{SRC}{N}_sat(r);" .format (SRC = src , N = size ))
450
+ else :
451
+ print (" {SRC}{N} y = convert_{SRC}{N}(r);" .format (SRC = src , N = size ))
436
452
if mode == "_rtz" :
437
453
if src in int_types :
438
454
print (
@@ -448,23 +464,59 @@ def generate_float_conversion(src, dst, size, mode, sat):
448
464
else :
449
465
print (" {SRC}{N} abs_x = fabs(x);" .format (SRC = src , N = size ))
450
466
print (" {SRC}{N} abs_y = fabs(y);" .format (SRC = src , N = size ))
451
- print (
452
- " return select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), convert_{BOOL}{N}(abs_y > abs_x));" .format (
453
- DST = dst , N = size , BOOL = bool_type [dst ]
467
+ if clspv :
468
+ print (
469
+ " {BOOL}{N} c = convert_{BOOL}{N}(abs_y > abs_x);" .format (
470
+ BOOL = bool_type [dst ], N = size
471
+ )
472
+ )
473
+ if sizeof_type [src ] >= 4 and src in int_types :
474
+ print (
475
+ " c = c || convert_{BOOL}{N}(({SRC}{N}){SRC_MAX} == x);" .format (
476
+ BOOL = bool_type [dst ], N = size , SRC = src , SRC_MAX = limit_max [src ]
477
+ )
478
+ )
479
+ print (
480
+ " return select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), c);" .format (
481
+ DST = dst , N = size , BOOL = bool_type [dst ], SRC = src
482
+ )
483
+ )
484
+ else :
485
+ print (
486
+ " return select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), convert_{BOOL}{N}(abs_y > abs_x));" .format (
487
+ DST = dst , N = size , BOOL = bool_type [dst ]
488
+ )
454
489
)
455
- )
456
490
if mode == "_rtp" :
457
491
print (
458
492
" return select(r, nextafter(r, ({DST}{N})INFINITY), convert_{BOOL}{N}(y < x));" .format (
459
493
DST = dst , N = size , BOOL = bool_type [dst ]
460
494
)
461
495
)
462
496
if mode == "_rtn" :
463
- print (
464
- " return select(r, nextafter(r, ({DST}{N})-INFINITY), convert_{BOOL}{N}(y > x));" .format (
465
- DST = dst , N = size , BOOL = bool_type [dst ]
497
+ if clspv :
498
+ print (
499
+ " {BOOL}{N} c = convert_{BOOL}{N}(y > x);" .format (
500
+ BOOL = bool_type [dst ], N = size
501
+ )
502
+ )
503
+ if sizeof_type [src ] >= 4 and src in int_types :
504
+ print (
505
+ " c = c || convert_{BOOL}{N}(({SRC}{N}){SRC_MAX} == x);" .format (
506
+ BOOL = bool_type [dst ], N = size , SRC = src , SRC_MAX = limit_max [src ]
507
+ )
508
+ )
509
+ print (
510
+ " return select(r, nextafter(r, ({DST}{N})-INFINITY), c);" .format (
511
+ DST = dst , N = size , BOOL = bool_type [dst ], SRC = src
512
+ )
513
+ )
514
+ else :
515
+ print (
516
+ " return select(r, nextafter(r, ({DST}{N})-INFINITY), convert_{BOOL}{N}(y > x));" .format (
517
+ DST = dst , N = size , BOOL = bool_type [dst ]
518
+ )
466
519
)
467
- )
468
520
469
521
# Footer
470
522
print ("}" )
@@ -484,4 +536,8 @@ def generate_float_conversion(src, dst, size, mode, sat):
484
536
for dst in float_types :
485
537
for size in vector_sizes :
486
538
for mode in rounding_modes :
539
+ # Do not generate "_rte" conversion for clspv as they are
540
+ # handle natively
541
+ if clspv and mode == "_rte" :
542
+ continue
487
543
generate_float_conversion (src , dst , size , mode , "" )
0 commit comments