1 #include <stdio.h> 2 3 /* Test various BFP ops: 4 - square root 5 - load negative 6 - load positive 7 - load complement 8 */ 9 10 void sqebr(float in) 11 { 12 float out; 13 14 __asm__ volatile("sqebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 15 printf("sqebr %f -> %f\n", in, out); 16 } 17 18 void sqdbr(double in) 19 { 20 double out; 21 22 __asm__ volatile("sqdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 23 printf("sqdbr %f -> %f\n", in, out); 24 } 25 26 void lnebr(float in) 27 { 28 float out; 29 30 __asm__ volatile("lnebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 31 printf("lnebr %f -> %f\n", in, out); 32 } 33 34 void lndbr(double in) 35 { 36 double out; 37 38 __asm__ volatile("lndbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 39 printf("lndbr %f -> %f\n", in, out); 40 } 41 42 void lpebr(float in) 43 { 44 float out; 45 46 __asm__ volatile("lpebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 47 printf("lpebr %f -> %f\n", in, out); 48 } 49 50 void lpdbr(double in) 51 { 52 double out; 53 54 __asm__ volatile("lpdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 55 printf("lpdbr %f -> %f\n", in, out); 56 } 57 58 void lcebr(float in) 59 { 60 float out; 61 62 __asm__ volatile("lcebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 63 printf("lcebr %f -> %f\n", in, out); 64 } 65 66 void lcdbr(double in) 67 { 68 double out; 69 70 __asm__ volatile("lcdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); 71 printf("lcdbr %f -> %f\n", in, out); 72 } 73 74 void lder(double prev, float in) 75 { 76 unsigned long out; 77 78 __asm__ volatile("lder %[prev],%[in]\n\t" 79 "std %[prev],%[out]" : 80 [out]"=R"(out) : [prev]"f"(prev), [in]"f"(in)); 81 printf("lder %f -> %lx\n", in, out); 82 } 83 84 void lde(double prev, float in) 85 { 86 unsigned long out; 87 88 __asm__ volatile("lde %[prev],%[in]\n\t" 89 "std %[prev],%[out]" : 90 [out]"=R"(out) : [prev]"f"(prev), [in]"R"(in)); 91 printf("lde %f -> %lx\n", in, out); 92 } 93 94 int main(void) 95 { 96 // square root 97 sqebr(121.0f); // 4 byte values 98 sqdbr(144.0); // 8 bytes values 99 100 // load negative 101 lnebr(-2.5f); // 4 byte values 102 lnebr(12.5f); // 4 byte values 103 104 lndbr(-0.5); // 8 byte values 105 lndbr(42.5); // 8 byte values 106 107 // load positive 108 lpebr(-2.5f); // 4 byte values 109 lpebr(12.5f); // 4 byte values 110 111 lpdbr(-0.5); // 8 byte values 112 lpdbr(42.5); // 8 byte values 113 114 // load complement 115 lcebr(-23.5f); // 4 byte values 116 lcebr(123.5f); // 4 byte values 117 118 lcdbr(-17.5); // 8 byte values 119 lcdbr(234.5); // 8 byte values 120 121 // load lengthened 122 lder(0.2, 321.5f); 123 lder(0.9, -8388607.f); 124 lde(0.2, -321.5f); 125 lde(0.9, 8388607.f); 126 127 return 0; 128 } 129