1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| | #include <math.h>
#include <stdint.h>
double ceil(double x)
{
int32_t old;
int32_t new;
int32_t tmp1;
int32_t tmp2;
__asm__ __volatile__(
"movfcsr2gr %[orig_old], $r0 \n\t"
"li.d %[tmp1], 0x200 \n\t"
"or %[new], %[orig_old], %[tmp1] \n\t"
"li.d %[tmp2], 0xfffffeff \n\t"
"and %[new], %[new], %[tmp2] \n\t"
"movgr2fcsr $r0, %[new] \n\t"
"frint.d %[result], %[orig_x] \n\t"
"movgr2fcsr $r0, %[orig_old] \n\t"
: [result] "+f"(x), [old]"+r"(old), [new]"+r"(new), [tmp1] "+r"(tmp1), [tmp2] "+r"(tmp2)
: [orig_x] "f"(x), [orig_old]"r"(old), [orig_new]"r"(new), [orig_tmp1] "r"(tmp1), [orig_tmp2] "r"(tmp2)
:);
return x;
}
|