• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 
3 /* Test BFP multiply and add/sub  32/64-bit. There are no such insns
4    working with 128-bit data */
5 
maebr(float v1,float v2,float v3)6 void maebr(float v1, float v2, float v3)
7 {
8    float r1 = v1;
9 
10    __asm__ volatile("maebr %[r1],%[r3],%[r2]"
11                     : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
12    printf("maebr  %f * %f + %f  -> %f\n", v2, v3, v1, r1);
13 }
14 
madbr(double v1,double v2,double v3)15 void madbr(double v1, double v2, double v3)
16 {
17    double r1 = v1;
18 
19    __asm__ volatile("madbr %[r1],%[r3],%[r2]"
20                     : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
21    printf("madbr  %f * %f + %f  -> %f\n", v2, v3, v1, r1);
22 }
23 
msebr(float v1,float v2,float v3)24 void msebr(float v1, float v2, float v3)
25 {
26    float r1 = v1;
27 
28    __asm__ volatile("msebr %[r1],%[r3],%[r2]"
29                     : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
30    printf("msebr  %f * %f - %f  -> %f\n", v2, v3, v1, r1);
31 }
32 
msdbr(double v1,double v2,double v3)33 void msdbr(double v1, double v2, double v3)
34 {
35    double r1 = v1;
36 
37    __asm__ volatile("msdbr %[r1],%[r3],%[r2]"
38                     : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
39    printf("msdbr  %f * %f - %f  -> %f\n", v2, v3, v1, r1);
40 }
41 
main(void)42 int main(void)
43 {
44    // multiply and add
45    maebr(10.5f, 20.25, 3.0);  // 4 byte values
46    madbr(-10.5, 42.75, -2.0); // 8 byte values
47 
48    // multiply and sub
49    msebr(10.5f, 20.25, 3.0);  // 4 byte values
50    msdbr(-10.5, 42.75, -2.0); // 8 byte values
51 
52    return 0;
53 }
54