| #include <stdio.h> |
| |
| /* Simple test to see that basic operators are mapped |
| correctly. Uses default rounding mode. */ |
| |
| volatile double d1, d2; |
| volatile float f1, f2; |
| |
| void fadd8(void) |
| { |
| printf("%f + %f = %f\n", d1, d2, d1 + d2); |
| } |
| |
| void fsub8(void) |
| { |
| printf("%f - %f = %f\n", d1, d2, d1 - d2); |
| } |
| |
| void fmul8(void) |
| { |
| printf("%f * %f = %f\n", d1, d2, d1 * d2); |
| } |
| |
| void fdiv8(void) |
| { |
| printf("%f / %f = %f\n", d1, d2, d1 / d2); |
| } |
| |
| void fadd4(void) |
| { |
| register float r1 asm("f1") = f1; |
| register float r2 asm("f2") = f2; |
| |
| __asm__ volatile ("aebr %[r1],%[r2]\n\t" |
| : [r1] "+f"(r1) |
| : [r2] "f"(r2) : "cc"); |
| printf("%f + %f = %f\n", f1, f2, r1); |
| } |
| |
| void fsub4(void) |
| { |
| register float r1 asm("f1") = f1; |
| register float r2 asm("f2") = f2; |
| |
| __asm__ volatile ("sebr %[r1],%[r2]\n\t" |
| : [r1] "+f"(r1) |
| : [r2] "f"(r2) : "cc"); |
| printf("%f - %f = %f\n", f1, f2, r1); |
| } |
| |
| void fmul4(void) |
| { |
| register float r1 asm("f1") = f1; |
| register float r2 asm("f2") = f2; |
| |
| __asm__ volatile ("meebr %[r1],%[r2]\n\t" |
| : [r1] "+f"(r1) |
| : [r2] "f"(r2) : "cc"); |
| printf("%f * %f = %f\n", f1, f2, r1); |
| } |
| |
| void fdiv4(void) |
| { |
| register float r1 asm("f1") = f1; |
| register float r2 asm("f2") = f2; |
| |
| __asm__ volatile ("debr %[r1],%[r2]\n\t" |
| : [r1] "+f"(r1) |
| : [r2] "f"(r2) : "cc"); |
| printf("%f / %f = %f\n", f1, f2, r1); |
| } |
| |
| |
| int main() |
| { |
| printf("double arithmetic\n"); |
| d1 = 10.5; |
| d2 = 1.25; |
| fadd8(); |
| fsub8(); |
| fmul8(); |
| fdiv8(); |
| |
| printf("float arithmetic\n"); |
| f1 = 10.5f; |
| f2 = 1.25f; |
| fadd4(); |
| fsub4(); |
| fmul4(); |
| fdiv4(); |
| |
| return 0; |
| } |