// Test ALU RND RND12 RND20 # mach: bfin #include "test.h" .include "testutils.inc" start R7 = 0; ASTAT = R7; // 7ffffff0 // + 00008000 // -> 7fff0000 R0 = 0xfff0 (Z); R0.H = 0x7fff; R7.L = R0 (RND); R0 = ASTAT; CHECKREG R7, 0x7fff; CHECKREG R0, (_VS|_V|_V_COPY); // 7ffffff0 // + 00008000 // -> 7fff0000 R0.L = 0xfff0; R0.H = 0x7fff; R7.H = R0 (RND); R0 = ASTAT; CHECKREG R7, 0x7fff7fff; CHECKREG R0, (_VS|_V|_V_COPY); // 7ff0fff0 // + 00008000 // -> 7ff10000 R0.L = 0xfff0; R0.H = 0x7ff0; R7.L = R0 (RND); R0 = ASTAT; CHECKREG R7, 0x7fff7ff1 CHECKREG R0, (_VS); // 7ff0fff0 // + 00008000 // -> 7ff10000 // 7ff0fff0 // + 8000 // -> 7ff1 R0.L = 0xfff0; R0.H = 0x7ff0; R7.H = R0 (RND); R0 = ASTAT; CHECKREG R7, 0x7ff17ff1 CHECKREG R0, (_VS); // fffffff0 // + 00008000 // -> 00000000 R0.L = 0xfff0; R0.H = 0xffff; R7.L = R0 (RND); R0 = ASTAT; CHECKREG R7, 0x7ff10000; CHECKREG R0, (_VS|_AZ); // fffffff0 // + 00008000 // -> 00000000 R0.L = 0xfff0; R0.H = 0xffff; R7.H = R0 (RND); R0 = ASTAT; DBGA ( R7.H , 0 ); CHECKREG R0, (_VS|_AZ); // 00fffff0 // + 00008000 // -> 0100 R0.L = 0xfff0; R0.H = 0x00ff; R7.L = R0 (RND); R0 = ASTAT; DBGA ( R7.L , 0x0100 ); CHECKREG R0, (_VS); // RND12 // 07ffe000 // + 00000000 // = 07ffe000 // + 00000800 // -> 7ffe R0.L = 0xe000; R0.H = 0x07ff; R1 = 0x0000 (Z); R1.H = 0x0000; R7.L = R0 + R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x7ffe ); CHECKREG R0, (_VS); // 07ffff00 // + 00000000 // = 07ffff00 // + 00000800 // -> 7fff R0.L = 0xff00; R0.H = 0x07ff; R1.L = 0x0000; R1.H = 0x0000; R7.L = R0 + R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x7fff ); CHECKREG R0, (_VS|_V|_V_COPY); // 07fffc00 // + 00000f00 // = 08000b00 // + 00000800 // -> 7fff R0.L = 0xfc00; R0.H = 0x07ff; R1.L = 0x0f00; R1.H = 0x0000; R7.L = R0 + R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x7fff ); CHECKREG R0, (_VS|_V|_V_COPY); // 07ff c000 // + 0000 1000 // = 07ff d000 // + 0000 0800 // -> 7ff d R0.L = 0xc000; R0.H = 0x07ff; R1.L = 0x1000; R1.H = 0x0000; _DBG ASTAT; R7.L = R0 + R1 (RND12); _DBG ASTAT; R0 = ASTAT; _DBG R0; DBGA ( R7.L , 0x7ffd ); CHECKREG R0, (_VS); // ffff ffea // + 07ff fe00 // = 107ff fdea // + 0000 0800 // -> 7ff f R0.L = 0xffea; R0.H = 0xffff; R1.L = 0xfe00; R1.H = 0x07ff; _DBG ASTAT; R7.L = R0 + R1 (RND12); _DBG ASTAT; R0 = ASTAT; _DBG R0; DBGA ( R7.L , 0x7fff ); CHECKREG R0, (_VS|_V|_V_COPY); // Small negative plus small negative should give zero // ffff ffff // + ffff ffff // + 0000 0800 // -> 000 0 R0.L = 0xffff; R0.H = 0xffff; R1.L = 0xffff; R1.H = 0xffff; _DBG ASTAT; R7.L = R0 + R1 (RND12); R0 = ASTAT; _DBG R0; DBGA ( R7.L , 0x0000 ); CHECKREG R0, (_VS|_AZ); // Small negative minus small positive should give zero // ffff ffff // + 0000 0001 // - 0000 0800 // -> 000 0 R0.L = 0xffff; R0.H = 0xffff; R1.L = 0x0001; R1.H = 0x0000; R7.L = R0 - R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x0000 ); CHECKREG R0, (_VS|_AZ); // Large positive plus large positive should give maxpos // 07ff ffff // + 07ff ffff // + 0000 0800 // -> 7ff f R0.L = 0xffff; R0.H = 0x07ff; R1.L = 0xffff; R1.H = 0x07ff; R7.L = R0 + R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x7fff ); CHECKREG R0, (_VS|_V|_V_COPY); // Large negative plus large negative should give maxneg // 0800 0000 // + 0800 0000 // + 0000 0800 // -> 800 0 R0.L = 0x0000; R0.H = 0x0800; R1.L = 0x0000; R1.H = 0x0800; R7.L = R0 + R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x7fff ); CHECKREG R0, (_VS|_V|_V_COPY); // Large positive minus large negative should give maxpos // 07ff ffff // - 0800 0000 // + 0000 0800 // -> 800 0 R0.L = 0xffff; R0.H = 0x07ff; R1.L = 0x0000; R1.H = 0x0800; R7.L = R0 - R1 (RND12); R0 = ASTAT; _DBG ASTAT; DBGA ( R7.L , 0x0 ); CHECKREG R0, (_VS|_AZ); // Large negative minus large positive should give maxneg // 0800 0000 // - 07ff ffff // + 0000 0800 // -> 800 0 R0.L = 0x0000; R0.H = 0x0800; R1.L = 0xffff; R1.H = 0x07ff; R7.L = R0 - R1 (RND12); R0 = ASTAT; _DBG ASTAT; DBGA ( R7.L , 0x0000 ); CHECKREG R0, (_VS|_AZ); // cef4 3ed6 // - 56f4 417a // + 0000 0800 // -> 800 0 R0.L = 0x3ed6; R0.H = 0xcef4; R1.L = 0x417a; R1.H = 0x56f4; R7.L = R0 - R1 (RND12); R0 = ASTAT; DBGA ( R7.L , 0x8000 ); CHECKREG R0, (_VS|_V|_V_COPY|_AN); // RND20 // 00ff 0000 // + 0000 0000 // + 0008 0000 // ->0010 R0.L = 0x0000; R0.H = 0x00ff; R1.L = 0x0000; R1.H = 0x0000; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0010 ); CHECKREG R0, (_VS); // 00f0 0000 // + 000f 0000 // + 0008 0000 // ->0010 R0.L = 0x0000; R0.H = 0x00f0; R1.L = 0x0000; R1.H = 0x000f; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0010 ); CHECKREG R0, (_VS); // 7ff0 0000 // + 0000 0000 // + 0008 0000 // ->07ff R0.L = 0x0000; R0.H = 0x7ff0; R1.L = 0x0000; R1.H = 0x0000; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x07ff ); CHECKREG R0, (_VS); // 7fff 0000 // + 0000 0000 // + 0008 0000 // ->0800 R0.L = 0x0000; R0.H = 0x7fff; R1.L = 0x0000; R1.H = 0x0000; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0800 ); CHECKREG R0, (_VS); // ffff 0000 // + 0000 0000 // + 0008 0000 // ->0000 R0.L = 0x0000; R0.H = 0xffff; R1.L = 0x0000; R1.H = 0x0000; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0000 ); DBGA ( R0.H , 0x0200 ); DBGA ( R0.L , 0x0001 ); // ff00 0000 // + 0010 0000 // + 0008 0000 // ->fff1 R0.L = 0x0000; R0.H = 0xff00; R1.L = 0x0000; R1.H = 0x0010; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0xfff1 ); CHECKREG R0, (_VS|_AN); // ff00 0000 // + 0018 0000 // + 0008 0000 // ->fff2 R0.L = 0x0000; R0.H = 0xff00; R1.L = 0x0000; R1.H = 0x0018; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0xfff2 ); CHECKREG R0, (_VS|_AN); // Small negative plus small negative should give zero // ffff ffff // + ffff ffff // + 0008 0000 // ->0000 R0.L = 0xffff; R0.H = 0xffff; R1.L = 0xffff; R1.H = 0xffff; R7.L = R0 + R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0000 ); CHECKREG R0, (_VS|_AZ); // Small negative minus small positive should give zero // ffff ffff // + 0000 0010 // + 0008 0000 // ->0000 R0.L = 0xffff; R0.H = 0xffff; R1.L = 0x0010; R1.H = 0x0000; R7.L = R0 - R1 (RND20); R0 = ASTAT; DBGA ( R7.L , 0x0000 ); CHECKREG R0, (_VS|_AZ); pass