@@ -2194,15 +2194,22 @@ PyFloat_Pack4(double x, char *data, int le)
2194
2194
/* correct y if x was a sNaN, transformed to qNaN by conversion */
2195
2195
if (isnan (x )) {
2196
2196
uint64_t v ;
2197
- uint32_t u32 ;
2198
2197
2199
2198
memcpy (& v , & x , 8 );
2200
- memcpy (& u32 , & y , 4 );
2201
-
2199
+ #ifndef __riscv
2202
2200
if ((v & (1ULL << 51 )) == 0 ) {
2201
+ uint32_t u32 ;
2202
+ memcpy (& u32 , & y , 4 );
2203
2203
u32 &= ~(1 << 22 ); /* make sNaN */
2204
+ memcpy (& y , & u32 , 4 );
2204
2205
}
2206
+ #else
2207
+ uint32_t u32 ;
2205
2208
2209
+ memcpy (& u32 , & y , 4 );
2210
+ if ((v & (1ULL << 51 )) == 0 ) {
2211
+ u32 &= ~(1 << 22 );
2212
+ }
2206
2213
/* Workaround RISC-V: "If a NaN value is converted to a
2207
2214
* different floating-point type, the result is the
2208
2215
* canonical NaN of the new type". The canonical NaN here
@@ -2215,6 +2222,7 @@ PyFloat_Pack4(double x, char *data, int le)
2215
2222
u32 += (uint32_t )((v & 0x7ffffffffffffULL ) >> 29 );
2216
2223
2217
2224
memcpy (& y , & u32 , 4 );
2225
+ #endif
2218
2226
}
2219
2227
2220
2228
unsigned char s [sizeof (float )];
@@ -2503,17 +2511,26 @@ PyFloat_Unpack4(const char *data, int le)
2503
2511
2504
2512
/* return sNaN double if x was sNaN float */
2505
2513
if (isnan (x )) {
2506
- double y = x ; /* will make qNaN double */
2507
2514
uint32_t v ;
2508
- uint64_t u64 ;
2509
-
2510
2515
memcpy (& v , & x , 4 );
2511
- memcpy (& u64 , & y , 8 );
2512
2516
2517
+ #ifndef __riscv
2513
2518
if ((v & (1 << 22 )) == 0 ) {
2519
+ double y = x ; /* will make qNaN double */
2520
+ uint64_t u64 ;
2521
+ memcpy (& u64 , & y , 8 );
2514
2522
u64 &= ~(1ULL << 51 ); /* make sNaN */
2523
+ memcpy (& y , & u64 , 8 );
2524
+ return y ;
2515
2525
}
2526
+ #else
2527
+ double y = x ;
2528
+ uint64_t u64 ;
2516
2529
2530
+ memcpy (& u64 , & y , 8 );
2531
+ if ((v & (1 << 22 )) == 0 ) {
2532
+ u64 &= ~(1ULL << 51 );
2533
+ }
2517
2534
/* Workaround RISC-V, see PyFloat_Pack4() */
2518
2535
if (v & (1 << 31 )) {
2519
2536
u64 |= (1ULL << 63 ); /* set sign */
@@ -2524,6 +2541,7 @@ PyFloat_Unpack4(const char *data, int le)
2524
2541
2525
2542
memcpy (& y , & u64 , 8 );
2526
2543
return y ;
2544
+ #endif
2527
2545
}
2528
2546
2529
2547
return x ;
0 commit comments