19768109e5d3c18da127dd70f28454171c1eba7c0florian#include <stdio.h> 29768109e5d3c18da127dd70f28454171c1eba7c0florian 39768109e5d3c18da127dd70f28454171c1eba7c0florian#define branch(mask,_v1,_v2) \ 49768109e5d3c18da127dd70f28454171c1eba7c0florian ({ \ 59768109e5d3c18da127dd70f28454171c1eba7c0florian unsigned char taken; \ 69768109e5d3c18da127dd70f28454171c1eba7c0florian unsigned b1 = _v1, b2 = _v2; \ 79768109e5d3c18da127dd70f28454171c1eba7c0florian asm volatile(" clr %[b1],%[b2]\n\t" \ 89768109e5d3c18da127dd70f28454171c1eba7c0florian " brc " #mask " ,1f\n\t" \ 99768109e5d3c18da127dd70f28454171c1eba7c0florian " mvi %[taken],0\n\t" \ 109768109e5d3c18da127dd70f28454171c1eba7c0florian " j 0f\n\t" \ 119768109e5d3c18da127dd70f28454171c1eba7c0florian "1: mvi %[taken],1\n\t" \ 129768109e5d3c18da127dd70f28454171c1eba7c0florian "0: bcr 0,0 /* nop */\n\t" \ 139768109e5d3c18da127dd70f28454171c1eba7c0florian : [taken] "=Q" (taken) \ 149768109e5d3c18da127dd70f28454171c1eba7c0florian : [b1] "d"(b1), [b2] "d"(b2) \ 159768109e5d3c18da127dd70f28454171c1eba7c0florian : "cc"); \ 169768109e5d3c18da127dd70f28454171c1eba7c0florian taken; \ 179768109e5d3c18da127dd70f28454171c1eba7c0florian }) 189768109e5d3c18da127dd70f28454171c1eba7c0florian 199768109e5d3c18da127dd70f28454171c1eba7c0florianvoid 209768109e5d3c18da127dd70f28454171c1eba7c0florianclr_1(void) 219768109e5d3c18da127dd70f28454171c1eba7c0florian{ 229768109e5d3c18da127dd70f28454171c1eba7c0florian int wrong, ok, v1, v2; 239768109e5d3c18da127dd70f28454171c1eba7c0florian 249768109e5d3c18da127dd70f28454171c1eba7c0florian printf("Test #1 op1 == op2\n"); 259768109e5d3c18da127dd70f28454171c1eba7c0florian 269768109e5d3c18da127dd70f28454171c1eba7c0florian v1 = v2 = 42; 279768109e5d3c18da127dd70f28454171c1eba7c0florian wrong = ok = 0; 289768109e5d3c18da127dd70f28454171c1eba7c0florian 299768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(0, v1, v2)) ++wrong; else ++ok; 309768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(1, v1, v2)) ++wrong; else ++ok; 319768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(2, v1, v2)) ++wrong; else ++ok; 329768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(3, v1, v2)) ++wrong; else ++ok; 339768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(4, v1, v2)) ++wrong; else ++ok; 349768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(5, v1, v2)) ++wrong; else ++ok; 359768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(6, v1, v2)) ++wrong; else ++ok; 369768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(7, v1, v2)) ++wrong; else ++ok; 379768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(8, v1, v2)) ++ok; else ++wrong; 389768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(9, v1, v2)) ++ok; else ++wrong; 399768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(10, v1, v2)) ++ok; else ++wrong; 409768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(11, v1, v2)) ++ok; else ++wrong; 419768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(12, v1, v2)) ++ok; else ++wrong; 429768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(13, v1, v2)) ++ok; else ++wrong; 439768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(14, v1, v2)) ++ok; else ++wrong; 449768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(15, v1, v2)) ++ok; else ++wrong; 459768109e5d3c18da127dd70f28454171c1eba7c0florian 469768109e5d3c18da127dd70f28454171c1eba7c0florian if (wrong != 0 || ok != 16) 479768109e5d3c18da127dd70f28454171c1eba7c0florian printf("FAILED\n"); 489768109e5d3c18da127dd70f28454171c1eba7c0florian else 499768109e5d3c18da127dd70f28454171c1eba7c0florian printf("OK\n"); 509768109e5d3c18da127dd70f28454171c1eba7c0florian} 519768109e5d3c18da127dd70f28454171c1eba7c0florian 529768109e5d3c18da127dd70f28454171c1eba7c0florianvoid 539768109e5d3c18da127dd70f28454171c1eba7c0florianclr_2(void) 549768109e5d3c18da127dd70f28454171c1eba7c0florian{ 559768109e5d3c18da127dd70f28454171c1eba7c0florian int wrong, ok, v1, v2; 569768109e5d3c18da127dd70f28454171c1eba7c0florian 579768109e5d3c18da127dd70f28454171c1eba7c0florian printf("Test #2 op1 > op2\n"); 589768109e5d3c18da127dd70f28454171c1eba7c0florian v1 = 100; 599768109e5d3c18da127dd70f28454171c1eba7c0florian v2 = 99; 609768109e5d3c18da127dd70f28454171c1eba7c0florian wrong = ok = 0; 619768109e5d3c18da127dd70f28454171c1eba7c0florian 629768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(0, v1, v2)) ++wrong; else ++ok; 639768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(1, v1, v2)) ++wrong; else ++ok; 649768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(2, v1, v2)) ++ok; else ++wrong; 659768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(3, v1, v2)) ++ok; else ++wrong; 669768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(4, v1, v2)) ++wrong; else ++ok; 679768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(5, v1, v2)) ++wrong; else ++ok; 689768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(6, v1, v2)) ++ok; else ++wrong; 699768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(7, v1, v2)) ++ok; else ++wrong; 709768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(8, v1, v2)) ++wrong; else ++ok; 719768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(9, v1, v2)) ++wrong; else ++ok; 729768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(10, v1, v2)) ++ok; else ++wrong; 739768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(11, v1, v2)) ++ok; else ++wrong; 749768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(12, v1, v2)) ++wrong; else ++ok; 759768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(13, v1, v2)) ++wrong; else ++ok; 769768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(14, v1, v2)) ++ok; else ++wrong; 779768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(15, v1, v2)) ++ok; else ++wrong; 789768109e5d3c18da127dd70f28454171c1eba7c0florian 799768109e5d3c18da127dd70f28454171c1eba7c0florian if (wrong != 0 || ok != 16) 809768109e5d3c18da127dd70f28454171c1eba7c0florian printf("FAILED\n"); 819768109e5d3c18da127dd70f28454171c1eba7c0florian else 829768109e5d3c18da127dd70f28454171c1eba7c0florian printf("OK\n"); 839768109e5d3c18da127dd70f28454171c1eba7c0florian} 849768109e5d3c18da127dd70f28454171c1eba7c0florian 859768109e5d3c18da127dd70f28454171c1eba7c0florianvoid 869768109e5d3c18da127dd70f28454171c1eba7c0florianclr_3(void) 879768109e5d3c18da127dd70f28454171c1eba7c0florian{ 889768109e5d3c18da127dd70f28454171c1eba7c0florian int wrong, ok, v1, v2; 899768109e5d3c18da127dd70f28454171c1eba7c0florian 909768109e5d3c18da127dd70f28454171c1eba7c0florian printf("Test #3 op1 < op2\n"); 919768109e5d3c18da127dd70f28454171c1eba7c0florian v1 = 7; 929768109e5d3c18da127dd70f28454171c1eba7c0florian v2 = 10; 939768109e5d3c18da127dd70f28454171c1eba7c0florian wrong = ok = 0; 949768109e5d3c18da127dd70f28454171c1eba7c0florian 959768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(0, v1, v2)) ++wrong; else ++ok; 969768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(1, v1, v2)) ++wrong; else ++ok; 979768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(2, v1, v2)) ++wrong; else ++ok; 989768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(3, v1, v2)) ++wrong; else ++ok; 999768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(4, v1, v2)) ++ok; else ++wrong; 1009768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(5, v1, v2)) ++ok; else ++wrong; 1019768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(6, v1, v2)) ++ok; else ++wrong; 1029768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(7, v1, v2)) ++ok; else ++wrong; 1039768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(8, v1, v2)) ++wrong; else ++ok; 1049768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(9, v1, v2)) ++wrong; else ++ok; 1059768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(10, v1, v2)) ++wrong; else ++ok; 1069768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(11, v1, v2)) ++wrong; else ++ok; 1079768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(12, v1, v2)) ++ok; else ++wrong; 1089768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(13, v1, v2)) ++ok; else ++wrong; 1099768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(14, v1, v2)) ++ok; else ++wrong; 1109768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(15, v1, v2)) ++ok; else ++wrong; 1119768109e5d3c18da127dd70f28454171c1eba7c0florian 1129768109e5d3c18da127dd70f28454171c1eba7c0florian if (wrong != 0 || ok != 16) 1139768109e5d3c18da127dd70f28454171c1eba7c0florian printf("FAILED\n"); 1149768109e5d3c18da127dd70f28454171c1eba7c0florian else 1159768109e5d3c18da127dd70f28454171c1eba7c0florian printf("OK\n"); 1169768109e5d3c18da127dd70f28454171c1eba7c0florian} 1179768109e5d3c18da127dd70f28454171c1eba7c0florian 1189768109e5d3c18da127dd70f28454171c1eba7c0florianint main() 1199768109e5d3c18da127dd70f28454171c1eba7c0florian{ 1209768109e5d3c18da127dd70f28454171c1eba7c0florian clr_1(); 1219768109e5d3c18da127dd70f28454171c1eba7c0florian clr_2(); 1229768109e5d3c18da127dd70f28454171c1eba7c0florian clr_3(); 1239768109e5d3c18da127dd70f28454171c1eba7c0florian return 0; 1249768109e5d3c18da127dd70f28454171c1eba7c0florian} 125