1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h> 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h> 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "opcodes.h" 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BRASLCLOBBER "0","1","2","3","4","5","14", \ 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "f0","f1","f2","f3","f4","f5","f6","f7" 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_eq(void) { printf("equal\n"); } 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_ne(void) { printf("not equal\n"); } 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_gt(void) { printf("greater than\n"); } 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_le(void) { printf("less or equal\n"); } 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_lt(void) { printf("less than\n"); } 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_ge(void) { printf("greater or equal\n"); } 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_taken(void) { printf("taken\n"); } 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_not_taken(void) { printf("not taken\n"); } 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef LT 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define NEVER 0 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GT 2 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LT 4 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define NE 6 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define EQ 8 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LE C 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GE A 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALWAYS E 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_never(int32_t value1, int32_t value2) 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,NEVER) "\n\t" 36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_not_taken\n\t" 37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_taken\n\t" 39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_always(int32_t value1, int32_t value2) 45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,ALWAYS) "\n\t" 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_not_taken\n\t" 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_taken\n\t" 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_le(int32_t value1, int32_t value2) 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,LE) "\n\t" 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_gt\n\t" 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_le\n\t" 71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ge(int32_t value1, int32_t value2) 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,GE) "\n\t" 84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_lt\n\t" 85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_ge\n\t" 87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_gt(int32_t value1, int32_t value2) 93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,GT) "\n\t" 100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_le\n\t" 101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_gt\n\t" 103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_lt(int32_t value1, int32_t value2) 109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,LT) "\n\t" 116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_ge\n\t" 117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_lt\n\t" 119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_eq(int32_t value1, int32_t value2) 125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,EQ) "\n\t" 132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_ne\n\t" 133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_eq\n\t" 135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ne(int32_t value1, int32_t value2) 141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val1 asm("r7") = value1; 143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register int32_t val2 asm("r8") = value2; 144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng asm volatile( 146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "aghi 15,-160\n\t" 147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CRJ(7,8,8,NE) "\n\t" 148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_eq\n\t" 149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "j 0f\n\t" 150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "brasl 14,if_ne\n\t" 151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "0: aghi 15,160\n\t" 152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main() 157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_eq(-12, 42); 159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_eq(42, 42); 160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_eq(100, 42); 161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ne(-12, 42); 163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ne(42, 42); 164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ne(100, 42); 165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_gt(-12, 42); 167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_gt(42, 42); 168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_gt(100, 42); 169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_lt(-12, 42); 171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_lt(42, 42); 172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_lt(100, 42); 173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_le(-12, 42); 175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_le(42, 42); 176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_le(100, 42); 177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ge(-12, 42); 179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ge(42, 42); 180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_ge(100, 42); 181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_never(-12, 42); 183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_never(42, 42); 184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_never(100, 42); 185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_always(-12, 42); 187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_always(42, 42); 188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng compare_always(100, 42); 189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 192