#include <stdio.h> #include "xil_printf.h" #include "xpseudo_asm.h" int main() { float a = 0.0; float b = 0.0; float c = 0.0; u32 fpscr_reg; print("Floating Point exception test\r\n"); print("Invalid Operation \t"); a = 0.0; b = 0.0; c = a / b; asm("VMRS r0, FPSCR"); asm("MOV %0, r0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x01) ? "SUCCESS" : "FAIL"); asm("MOV r0, $0"); asm("VMSR FPSCR, r0"); print("Division by zero \t"); a = 1.0; b = 0.0; c = a / b; asm("VMRS r0, FPSCR"); asm("MOV %0, r0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x02) ? "SUCCESS" : "FAIL"); asm("MOV r0, $0"); asm("VMSR FPSCR, r0"); print("Inexact cumulative\t"); a = 1.0; b = 10; c = a / b; asm("VMRS r0, FPSCR"); asm("MOV %0, r0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x10) ? "SUCCESS" : "FAIL"); return 0; } |
#include <stdio.h> #include "xil_printf.h" #include "xpseudo_asm.h" int main() { double a = 0.0; double b = 0.0; double c = 0.0; u32 fpscr_reg; print("Floating Point exception test\r\n"); print("Invalid Operation \t"); a = 0.0; b = 0.0; c = a / b; asm("MRS x0, FPSR"); asm("MOV %0, x0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x01) ? "SUCCESS" : "FAIL"); asm("MOV x0, #0"); asm("MSR FPSR, x0"); print("Division by zero \t"); a = 1.0; b = 0.0; c = a / b; asm("MRS x0, FPSR"); asm("MOV %0, x0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x02) ? "SUCCESS" : "FAIL"); asm("MOV x0, #0"); asm("MSR FPSR, x0"); print("Inexact cumulative\t"); a = 1.0; b = 10; c = a / b; asm("MRS x0, FPSR"); asm("MOV %0, x0" : "=r"(fpscr_reg)); printf("FPSCR: 0x%08lX, %s\r\n", fpscr_reg, (fpscr_reg == 0x10) ? "SUCCESS" : "FAIL"); asm("MOV x0, #0"); asm("MSR FPSR, x0"); return 0; } |