| Issue |
84316
|
| Summary |
[PowerPC] llvm generates NaN in __fixunsdfdi for PPC-32 e500mc
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
Long5hot
|
Set FPSCR register value accordingly
(1) FP invalid exc. enable
(2) FP overflow exc. enable
(3) FP underflow exc. enable
(4) FP divide by zero exc. enable
Below test calls __fixunsdfdi from compiler-rt while typecasting from double to unsigned long long.
```
void testIntrinsic (unsigned int fpErrorOptions) {
double d = 2147483456.000000;
uint64_t ui64_var = (uint64_t)(d);
kprintf("Double = %f, uint64_t = %16.16X sizeof(uint64_t)=%d\n", d, ui64_var, sizeof(uint64_t));
d= 2147483712.000000;
kprintf("Converting to uint64_t...\n");
ui64_var = (uint64_t)(d);
kprintf("Converted to uint64_t...\n");
kprintf("Double = %f, uint64_t = %16.16X count=%d\n", d, ui64_var);
}
```
```
long long unsigned __fixunsdfdi(double a) {
if (a <= 0.0)
return 0;
unsigned int high = a / 4294967296.f;
unsigned int low = a - (double)high * 4294967296.f;
return ((long long unsigned int)high << 32) | low;
}
```
**llvm generates NaN for input **2147483712.000000** on PowerPC-32 e500mc and GNU does not for the same compiler-rt __fixunsdfdi .**
`clang --target=ppc32 -mcpu=e500mc -mlong-double-64 -mno-spe`
Assembly generated by llvm for __fixunsdfdi
```
.text
.file "llvm-fixunsdfdi.c"
.section .rodata.cst4,"aM",@progbits,4
.p2align 2, 0x0 # -- Begin function __fixunsdfdi
.LCPI0_0:
.long 0x00000000 # float 0
.LCPI0_1:
.long 0x4f800000 # float 4.2949673E+9
.LCPI0_2:
.long 0x4f000000 # float 2.14748365E+9
.LCPI0_3:
.long 0x59800000 # float 4.50359963E+15
.text
.globl __fixunsdfdi
.p2align 4
.type __fixunsdfdi,@function
__fixunsdfdi: # @__fixunsdfdi
.Lfunc_begin0:
# %bb.0:
stwu 1, -80(1)
stw 31, 76(1)
mr 31, 1
stfd 1, 56(31)
lfd 0, 56(31)
lis 3, .LCPI0_0@ha
lfs 1, .LCPI0_0@l(3)
fcmpu 7, 0, 1
mfcr 3 # cr7
rotlwi 3, 3, 28
stw 3, 20(31)
mfcr 3 # cr7
lwz 4, 20(31)
rotlwi 4, 4, 4
mtcrf 1, 4 # cr7
clrlwi 4, 3, 31
mfcr 3 # cr7
rlwinm 3, 3, 30, 31, 31
or 3, 3, 4
cmplwi 3, 0
bne 0, .LBB0_2
b .LBB0_1
.LBB0_1:
li 3, 0
stw 3, 68(31)
stw 3, 64(31)
b .LBB0_3
.LBB0_2:
lfd 0, 56(31)
lis 3, .LCPI0_1@ha
lfs 2, .LCPI0_1@l(3)
fdiv 0, 0, 2
lis 3, .LCPI0_2@ha
lfs 1, .LCPI0_2@l(3)
fsub 3, 0, 1
fctiwz 3, 3
addi 3, 31, 36
stfiwx 3, 0, 3
fctiwz 3, 0
addi 3, 31, 32
stfiwx 3, 0, 3
fcmpu 0, 0, 1
lwz 3, 36(31)
xoris 4, 3, 32768
lwz 3, 32(31)
isellt 3, 3, 4
stw 3, 52(31)
lfd 3, 56(31)
lwz 3, 52(31)
lis 4, 17200
stw 4, 40(31)
stw 3, 44(31)
lfd 0, 40(31)
lis 3, .LCPI0_3@ha
lfs 4, .LCPI0_3@l(3)
fsub 0, 0, 4
fneg 0, 0
fmadd 0, 0, 2, 3
fsub 2, 0, 1
fctiwz 2, 2
addi 3, 31, 28
stfiwx 2, 0, 3
fctiwz 2, 0
addi 3, 31, 24
stfiwx 2, 0, 3
fcmpu 0, 0, 1
lwz 3, 28(31)
xoris 4, 3, 32768
lwz 3, 24(31)
isellt 3, 3, 4
stw 3, 48(31)
lwz 3, 52(31)
lwz 4, 48(31)
stw 4, 68(31)
stw 3, 64(31)
b .LBB0_3
.LBB0_3:
lwz 3, 64(31)
lwz 4, 68(31)
lwz 31, 76(1)
addi 1, 1, 80
blr
.Lfunc_end0:
.size __fixunsdfdi, .Lfunc_end0-.Lfunc_begin0
# -- End function
.ident "clang version 17.0.6.1"
.section ".note.GNU-stack","",@progbits
.addrsig
```
Assembly Generated by GNU for the same __fixunsdfdi
```
.p2align 4,,15
.globl __fixunsdfdi
.type __fixunsdfdi, @function
__fixunsdfdi:
lis 9,.LC1@ha
lfs 0,.LC1@l(9)
fcmpu 7,1,0
cror 30,28,30
beq- 7,.L7
lis 9,.LC3@ha
stwu 1,-32(1)
lfs 0,.LC3@l(9)
lis 9,.LC5@ha
lfs 12,.LC5@l(9)
fmul 0,1,0
fcmpu 7,0,12
cror 30,29,30
beq- 7,.L3
fctiwz 0,0
addi 10,1,28
lfs 12,.LC5@l(9)
stfiwx 0,0,10
lis 10,0x4330
stw 10,8(1)
lis 10,.LC7@ha
lfs 0,.LC7@l(10)
lis 10,.LC9@ha
lwz 3,28(1)
lfs 11,.LC9@l(10)
stw 3,12(1)
lfd 10,8(1)
fsub 0,10,0
fneg 0,0
fmadd 1,0,11,1
fcmpu 7,1,12
cror 30,29,30
beq- 7,.L5
.L13:
fctiwz 1,1
addi 9,1,20
stfiwx 1,0,9
lwz 4,20(1)
addi 1,1,32
blr
.p2align 4,,15
.L3:
fsub 0,0,12
addi 10,1,24
lfs 12,.LC5@l(9)
fctiwz 0,0
stfiwx 0,0,10
lis 10,0x4330
stw 10,8(1)
lis 10,.LC7@ha
lfs 0,.LC7@l(10)
lis 10,.LC9@ha
lwz 3,24(1)
lfs 11,.LC9@l(10)
addis 3,3,0x8000
stw 3,12(1)
lfd 10,8(1)
fsub 0,10,0
fneg 0,0
fmadd 1,0,11,1
fcmpu 7,1,12
cror 30,29,30
bne+ 7,.L13
.L5:
fsub 1,1,12
addi 9,1,16
fctiwz 1,1
stfiwx 1,0,9
lwz 4,16(1)
addi 1,1,32
addis 4,4,0x8000
blr
.p2align 4,,15
.L7:
li 3,0
li 4,0
blr
.size __fixunsdfdi,.-__fixunsdfdi
.section .rodata.cst4,"aM",@progbits,4
.align 2
.LC1:
.long 0
.LC3:
.long 796917760
.LC5:
.long 1325400064
.LC7:
.long 1501560832
.LC9:
.long 1333788672
.ident "GCC: (Wind River VxWorks GCC 8.3.0.5 - 2022.02.07) 8.3.0"
.gnu_attribute 4, 9
.section .note.GNU-stack,"",@progbits
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs