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(int64_t value) 29abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 30abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 31abbc9afe94e1712fadb403d3f426fbd69744b658florian 32abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 33ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 34abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,NEVER,8,2a) "\n\t" /* 0x2a == 42 */ 35abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_not_taken\n\t" 36abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 37abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_taken\n\t" 38ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 39abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 40abbc9afe94e1712fadb403d3f426fbd69744b658florian} 41abbc9afe94e1712fadb403d3f426fbd69744b658florian 42abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_always(int64_t value) 43abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 44abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 45abbc9afe94e1712fadb403d3f426fbd69744b658florian 46abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 47ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 48abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,ALWAYS,8,2a) "\n\t" /* 0x2a == 42 */ 49abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_not_taken\n\t" 50abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 51abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_taken\n\t" 52ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 53abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 54abbc9afe94e1712fadb403d3f426fbd69744b658florian} 55abbc9afe94e1712fadb403d3f426fbd69744b658florian 56abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_le42(int64_t value) 57abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 58abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 59abbc9afe94e1712fadb403d3f426fbd69744b658florian 60abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 61ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 62abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,LE,8,2a) "\n\t" /* 0x2a == 42 */ 63abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_gt\n\t" 64abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 65abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_le\n\t" 66ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 67abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 68abbc9afe94e1712fadb403d3f426fbd69744b658florian} 69abbc9afe94e1712fadb403d3f426fbd69744b658florian 70abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ge42(int64_t value) 71abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 72abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 73abbc9afe94e1712fadb403d3f426fbd69744b658florian 74abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 75ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 76abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,GE,8,2a) "\n\t" /* 0x2a == 42 */ 77abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_lt\n\t" 78abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 79abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ge\n\t" 80ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 81abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 82abbc9afe94e1712fadb403d3f426fbd69744b658florian} 83abbc9afe94e1712fadb403d3f426fbd69744b658florian 84abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_gt42(int64_t value) 85abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 86abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 87abbc9afe94e1712fadb403d3f426fbd69744b658florian 88abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 89ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 90abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,GT,8,2a) "\n\t" /* 0x2a == 42 */ 91abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_le\n\t" 92abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 93abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_gt\n\t" 94ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 95abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 96abbc9afe94e1712fadb403d3f426fbd69744b658florian} 97abbc9afe94e1712fadb403d3f426fbd69744b658florian 98abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_lt42(int64_t value) 99abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 100abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 101abbc9afe94e1712fadb403d3f426fbd69744b658florian 102abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 103ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 104abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,LT,8,2a) "\n\t" /* 0x2a == 42 */ 105abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ge\n\t" 106abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 107abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_lt\n\t" 108ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 109abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 110abbc9afe94e1712fadb403d3f426fbd69744b658florian} 111abbc9afe94e1712fadb403d3f426fbd69744b658florian 112abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_eq42(int64_t value) 113abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 114abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 115abbc9afe94e1712fadb403d3f426fbd69744b658florian 116abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 117ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 118abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,EQ,8,2a) "\n\t" /* 0x2a == 42 */ 119abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ne\n\t" 120abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 121abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_eq\n\t" 122ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 123abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 124abbc9afe94e1712fadb403d3f426fbd69744b658florian} 125abbc9afe94e1712fadb403d3f426fbd69744b658florian 126abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ne42(int64_t value) 127abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 128abbc9afe94e1712fadb403d3f426fbd69744b658florian register int64_t val asm("r7") = value; 129abbc9afe94e1712fadb403d3f426fbd69744b658florian 130abbc9afe94e1712fadb403d3f426fbd69744b658florian asm volatile( 131ce004ebec861b6a0154e20aa928ce6c5cada4628florian "aghi 15,-160\n\t" 132abbc9afe94e1712fadb403d3f426fbd69744b658florian CGIJ(7,NE,8,2a) "\n\t" /* 0x2a == 42 */ 133abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_eq\n\t" 134abbc9afe94e1712fadb403d3f426fbd69744b658florian "j 0f\n\t" 135abbc9afe94e1712fadb403d3f426fbd69744b658florian "brasl 14,if_ne\n\t" 136ce004ebec861b6a0154e20aa928ce6c5cada4628florian "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); 137abbc9afe94e1712fadb403d3f426fbd69744b658florian return; 138abbc9afe94e1712fadb403d3f426fbd69744b658florian} 139abbc9afe94e1712fadb403d3f426fbd69744b658florian 140abbc9afe94e1712fadb403d3f426fbd69744b658florianint main() 141abbc9afe94e1712fadb403d3f426fbd69744b658florian{ 142abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq42(-12); 143abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq42(42); 144abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_eq42(100); 145abbc9afe94e1712fadb403d3f426fbd69744b658florian 146abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne42(-12); 147abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne42(42); 148abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ne42(100); 149abbc9afe94e1712fadb403d3f426fbd69744b658florian 150abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt42(-12); 151abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt42(42); 152abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_gt42(100); 153abbc9afe94e1712fadb403d3f426fbd69744b658florian 154abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt42(-12); 155abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt42(42); 156abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_lt42(100); 157abbc9afe94e1712fadb403d3f426fbd69744b658florian 158abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le42(-12); 159abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le42(42); 160abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_le42(100); 161abbc9afe94e1712fadb403d3f426fbd69744b658florian 162abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge42(-12); 163abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge42(42); 164abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_ge42(100); 165abbc9afe94e1712fadb403d3f426fbd69744b658florian 166abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(-12); 167abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(42); 168abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_never(100); 169abbc9afe94e1712fadb403d3f426fbd69744b658florian 170abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(-12); 171abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(42); 172abbc9afe94e1712fadb403d3f426fbd69744b658florian compare_always(100); 173abbc9afe94e1712fadb403d3f426fbd69744b658florian 174abbc9afe94e1712fadb403d3f426fbd69744b658florian return 0; 175abbc9afe94e1712fadb403d3f426fbd69744b658florian} 176