101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian#include <stdio.h>
201f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
301f771bc6fd369bd10ec0962edd85af1b9b9936fflorian/* Test BFP multiply and add/sub  32/64-bit. There are no such insns
401f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   working with 128-bit data */
501f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
601f771bc6fd369bd10ec0962edd85af1b9b9936fflorianvoid maebr(float v1, float v2, float v3)
701f771bc6fd369bd10ec0962edd85af1b9b9936fflorian{
801f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   float r1 = v1;
901f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
1001f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   __asm__ volatile("maebr %[r1],%[r3],%[r2]"
1101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian                    : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
1201f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   printf("maebr  %f * %f + %f  -> %f\n", v2, v3, v1, r1);
1301f771bc6fd369bd10ec0962edd85af1b9b9936fflorian}
1401f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
1501f771bc6fd369bd10ec0962edd85af1b9b9936fflorianvoid madbr(double v1, double v2, double v3)
1601f771bc6fd369bd10ec0962edd85af1b9b9936fflorian{
1701f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   double r1 = v1;
1801f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
1901f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   __asm__ volatile("madbr %[r1],%[r3],%[r2]"
2001f771bc6fd369bd10ec0962edd85af1b9b9936fflorian                    : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
2101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   printf("madbr  %f * %f + %f  -> %f\n", v2, v3, v1, r1);
2201f771bc6fd369bd10ec0962edd85af1b9b9936fflorian}
2301f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
2401f771bc6fd369bd10ec0962edd85af1b9b9936fflorianvoid msebr(float v1, float v2, float v3)
2501f771bc6fd369bd10ec0962edd85af1b9b9936fflorian{
2601f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   float r1 = v1;
2701f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
2801f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   __asm__ volatile("msebr %[r1],%[r3],%[r2]"
2901f771bc6fd369bd10ec0962edd85af1b9b9936fflorian                    : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
3001f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   printf("msebr  %f * %f - %f  -> %f\n", v2, v3, v1, r1);
3101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian}
3201f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
3301f771bc6fd369bd10ec0962edd85af1b9b9936fflorianvoid msdbr(double v1, double v2, double v3)
3401f771bc6fd369bd10ec0962edd85af1b9b9936fflorian{
3501f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   double r1 = v1;
3601f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
3701f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   __asm__ volatile("msdbr %[r1],%[r3],%[r2]"
3801f771bc6fd369bd10ec0962edd85af1b9b9936fflorian                    : [r1]"+f"(r1) : [r2]"f"(v2), [r3]"f"(v3));
3901f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   printf("msdbr  %f * %f - %f  -> %f\n", v2, v3, v1, r1);
4001f771bc6fd369bd10ec0962edd85af1b9b9936fflorian}
4101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
4201f771bc6fd369bd10ec0962edd85af1b9b9936fflorianint main(void)
4301f771bc6fd369bd10ec0962edd85af1b9b9936fflorian{
4401f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   // multiply and add
4501f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   maebr(10.5f, 20.25, 3.0);  // 4 byte values
4601f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   madbr(-10.5, 42.75, -2.0); // 8 byte values
4701f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
4801f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   // multiply and sub
4901f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   msebr(10.5f, 20.25, 3.0);  // 4 byte values
5001f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   msdbr(-10.5, 42.75, -2.0); // 8 byte values
5101f771bc6fd369bd10ec0962edd85af1b9b9936fflorian
5201f771bc6fd369bd10ec0962edd85af1b9b9936fflorian   return 0;
5301f771bc6fd369bd10ec0962edd85af1b9b9936fflorian}
54