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 6void 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 15void 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 24void 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 33void 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 42int 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