1abbc9afe94e1712fadb403d3f426fbd69744b658florian#include <stdio.h> 2abbc9afe94e1712fadb403d3f426fbd69744b658florian#include <stdint.h> 3abbc9afe94e1712fadb403d3f426fbd69744b658florian#include "opcodes.h" 4abbc9afe94e1712fadb403d3f426fbd69744b658florian 5abbc9afe94e1712fadb403d3f426fbd69744b658florian#define BRASLCLOBBER "0","1","2","3","4","5","14", \ 6abbc9afe94e1712fadb403d3f426fbd69744b658florian "f0","f1","f2","f3","f4","f5","f6","f7" 7abbc9afe94e1712fadb403d3f426fbd69744b658florian 8abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_eq(void) { printf("equal\n"); } 9abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_ne(void) { printf("not equal\n"); } 10abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_gt(void) { printf("greater than\n"); } 11abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_le(void) { printf("less or equal\n"); } 12abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_lt(void) { printf("less than\n"); } 13abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_ge(void) { printf("greater or equal\n"); } 14abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_taken(void) { printf("taken\n"); } 15abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_not_taken(void) { printf("not taken\n"); } 16abbc9afe94e1712fadb403d3f426fbd69744b658florian 17abbc9afe94e1712fadb403d3f426fbd69744b658florian#undef LT 18abbc9afe94e1712fadb403d3f426fbd69744b658florian#define NEVER 0 19abbc9afe94e1712fadb403d3f426fbd69744b658florian#define GT 2 20abbc9afe94e1712fadb403d3f426fbd69744b658florian#define LT 4 21abbc9afe94e1712fadb403d3f426fbd69744b658florian#define NE 6 22abbc9afe94e1712fadb403d3f426fbd69744b658florian#define EQ 8 23abbc9afe94e1712fadb403d3f426fbd69744b658florian#define LE C 24abbc9afe94e1712fadb403d3f426fbd69744b658florian#define GE A 25abbc9afe94e1712fadb403d3f426fbd69744b658florian#define ALWAYS E 26abbc9afe94e1712fadb403d3f426fbd69744b658florian 27abbc9afe94e1712fadb403d3f426fbd69744b658florian 28abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_never(int32_t value1, int32_t value2) 29abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 30abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 31abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 32abbc9afe94e1712fadb403d3f426fbd69744b658florian 33abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 34ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 35abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,NEVER) "\n\t" 36abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_not_taken\n\t" 37abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 38abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_taken\n\t" 39ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 40ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 41abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 42abbc9afe94e1712fadb403d3f426fbd69744b658florian} 43abbc9afe94e1712fadb403d3f426fbd69744b658florian 44abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_always(int32_t value1, int32_t value2) 45abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 46abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 47abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 48abbc9afe94e1712fadb403d3f426fbd69744b658florian 49abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 50ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 51abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,ALWAYS) "\n\t" 52abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_not_taken\n\t" 53abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 54abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_taken\n\t" 55ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 56ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 57abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 58abbc9afe94e1712fadb403d3f426fbd69744b658florian} 59abbc9afe94e1712fadb403d3f426fbd69744b658florian 60abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_le(int32_t value1, int32_t value2) 61abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 62abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 63abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 64abbc9afe94e1712fadb403d3f426fbd69744b658florian 65abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 66ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 67abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,LE) "\n\t" 68abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_gt\n\t" 69abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 70abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_le\n\t" 71ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 72ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 73abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 74abbc9afe94e1712fadb403d3f426fbd69744b658florian} 75abbc9afe94e1712fadb403d3f426fbd69744b658florian 76abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ge(int32_t value1, int32_t value2) 77abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 78abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 79abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 80abbc9afe94e1712fadb403d3f426fbd69744b658florian 81abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 82ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 83abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,GE) "\n\t" 84abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_lt\n\t" 85abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 86abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ge\n\t" 87ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 88ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 89abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 90abbc9afe94e1712fadb403d3f426fbd69744b658florian} 91abbc9afe94e1712fadb403d3f426fbd69744b658florian 92abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_gt(int32_t value1, int32_t value2) 93abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 94abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 95abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 96abbc9afe94e1712fadb403d3f426fbd69744b658florian 97abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 98ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 99abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,GT) "\n\t" 100abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_le\n\t" 101abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 102abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_gt\n\t" 103ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 104ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 105abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 106abbc9afe94e1712fadb403d3f426fbd69744b658florian} 107abbc9afe94e1712fadb403d3f426fbd69744b658florian 108abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_lt(int32_t value1, int32_t value2) 109abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 110abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 111abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 112abbc9afe94e1712fadb403d3f426fbd69744b658florian 113abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 114ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 115abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,LT) "\n\t" 116abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ge\n\t" 117abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 118abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_lt\n\t" 119ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 120ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 121abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 122abbc9afe94e1712fadb403d3f426fbd69744b658florian} 123abbc9afe94e1712fadb403d3f426fbd69744b658florian 124abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_eq(int32_t value1, int32_t value2) 125abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 126abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 127abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 128abbc9afe94e1712fadb403d3f426fbd69744b658florian 129abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 130ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 131abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,EQ) "\n\t" 132abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ne\n\t" 133abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 134abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_eq\n\t" 135ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 136ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 137abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 138abbc9afe94e1712fadb403d3f426fbd69744b658florian} 139abbc9afe94e1712fadb403d3f426fbd69744b658florian 140abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ne(int32_t value1, int32_t value2) 141abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 142abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val1 asm("r7") = value1; 143abbc9afe94e1712fadb403d3f426fbd69744b658florian register int32_t val2 asm("r8") = value2; 144abbc9afe94e1712fadb403d3f426fbd69744b658florian 145abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 146ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 147abbc9afe94e1712fadb403d3f426fbd69744b658florian CRJ(7,8,8,NE) "\n\t" 148abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_eq\n\t" 149abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 150abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ne\n\t" 151ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" 152ce004ebec861b6a0154e20aa928ce6c5cada4628florian : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER); 153abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 154abbc9afe94e1712fadb403d3f426fbd69744b658florian} 155abbc9afe94e1712fadb403d3f426fbd69744b658florian 156abbc9afe94e1712fadb403d3f426fbd69744b658florianint main() 157abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 158abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq(-12, 42); 159abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq(42, 42); 160abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq(100, 42); 161abbc9afe94e1712fadb403d3f426fbd69744b658florian 162abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne(-12, 42); 163abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne(42, 42); 164abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne(100, 42); 165abbc9afe94e1712fadb403d3f426fbd69744b658florian 166abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt(-12, 42); 167abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt(42, 42); 168abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt(100, 42); 169abbc9afe94e1712fadb403d3f426fbd69744b658florian 170abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt(-12, 42); 171abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt(42, 42); 172abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt(100, 42); 173abbc9afe94e1712fadb403d3f426fbd69744b658florian 174abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le(-12, 42); 175abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le(42, 42); 176abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le(100, 42); 177abbc9afe94e1712fadb403d3f426fbd69744b658florian 178abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge(-12, 42); 179abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge(42, 42); 180abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge(100, 42); 181abbc9afe94e1712fadb403d3f426fbd69744b658florian 182abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(-12, 42); 183abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(42, 42); 184abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(100, 42); 185abbc9afe94e1712fadb403d3f426fbd69744b658florian 186abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(-12, 42); 187abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(42, 42); 188abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(100, 42); 189abbc9afe94e1712fadb403d3f426fbd69744b658florian 190abbc9afe94e1712fadb403d3f426fbd69744b658florian return 0; 191abbc9afe94e1712fadb403d3f426fbd69744b658florian} 192