| #include <stdio.h> |
| #include <stdint.h> |
| #include "opcodes.h" |
| |
| #define BRASLCLOBBER "0","1","2","3","4","5","14", \ |
| "f0","f1","f2","f3","f4","f5","f6","f7" |
| |
| void if_eq(void) { printf("equal\n"); } |
| void if_ne(void) { printf("not equal\n"); } |
| void if_gt(void) { printf("greater than\n"); } |
| void if_le(void) { printf("less or equal\n"); } |
| void if_lt(void) { printf("less than\n"); } |
| void if_ge(void) { printf("greater or equal\n"); } |
| void if_taken(void) { printf("taken\n"); } |
| void if_not_taken(void) { printf("not taken\n"); } |
| |
| #undef LT |
| #define NEVER 0 |
| #define GT 2 |
| #define LT 4 |
| #define NE 6 |
| #define EQ 8 |
| #define LE C |
| #define GE A |
| #define ALWAYS E |
| |
| |
| void compare_never(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,NEVER,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_not_taken\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_taken\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_always(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,ALWAYS,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_not_taken\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_taken\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_le42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,LE,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_gt\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_le\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_ge42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,GE,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_lt\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_ge\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_gt42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,GT,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_le\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_gt\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_lt42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,LT,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_ge\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_lt\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_eq42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,EQ,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_ne\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_eq\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| void compare_ne42(uint32_t value) |
| { |
| register uint32_t val asm("r7") = value; |
| |
| asm volatile( |
| "aghi 15,-160\n\t" |
| CLIJ(7,NE,8,2a) "\n\t" /* 0x2a == 42 */ |
| "brasl 14,if_eq\n\t" |
| "j 0f\n\t" |
| "brasl 14,if_ne\n\t" |
| "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER); |
| return; |
| } |
| |
| int main() |
| { |
| compare_eq42(12); |
| compare_eq42(42); |
| compare_eq42(100); |
| |
| compare_ne42(12); |
| compare_ne42(42); |
| compare_ne42(100); |
| |
| compare_gt42(12); |
| compare_gt42(42); |
| compare_gt42(100); |
| |
| compare_lt42(12); |
| compare_lt42(42); |
| compare_lt42(100); |
| |
| compare_le42(12); |
| compare_le42(42); |
| compare_le42(100); |
| |
| compare_ge42(12); |
| compare_ge42(42); |
| compare_ge42(100); |
| |
| compare_never(12); |
| compare_never(42); |
| compare_never(100); |
| |
| compare_always(12); |
| compare_always(42); |
| compare_always(100); |
| |
| return 0; |
| } |