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