mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
192 lines
4.9 KiB
C
192 lines
4.9 KiB
C
#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 value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,NEVER) "\n\t"
|
|
"brasl 14,if_not_taken\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_taken\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_always(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,ALWAYS) "\n\t"
|
|
"brasl 14,if_not_taken\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_taken\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_le(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,LE) "\n\t"
|
|
"brasl 14,if_gt\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_le\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_ge(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,GE) "\n\t"
|
|
"brasl 14,if_lt\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_ge\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_gt(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,GT) "\n\t"
|
|
"brasl 14,if_le\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_gt\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_lt(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,LT) "\n\t"
|
|
"brasl 14,if_ge\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_lt\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_eq(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,EQ) "\n\t"
|
|
"brasl 14,if_ne\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_eq\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
void compare_ne(uint32_t value1, uint32_t value2)
|
|
{
|
|
register uint32_t val1 asm("r7") = value1;
|
|
register uint32_t val2 asm("r8") = value2;
|
|
|
|
asm volatile(
|
|
"aghi 15,-160\n\t"
|
|
CLRJ(7,8,8,NE) "\n\t"
|
|
"brasl 14,if_eq\n\t"
|
|
"j 0f\n\t"
|
|
"brasl 14,if_ne\n\t"
|
|
"0: aghi 15,160\n\t"
|
|
: : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
|
|
return;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
compare_eq(12, 42);
|
|
compare_eq(42, 42);
|
|
compare_eq(100, 42);
|
|
|
|
compare_ne(12, 42);
|
|
compare_ne(42, 42);
|
|
compare_ne(100, 42);
|
|
|
|
compare_gt(12, 42);
|
|
compare_gt(42, 42);
|
|
compare_gt(100, 42);
|
|
|
|
compare_lt(12, 42);
|
|
compare_lt(42, 42);
|
|
compare_lt(100, 42);
|
|
|
|
compare_le(12, 42);
|
|
compare_le(42, 42);
|
|
compare_le(100, 42);
|
|
|
|
compare_ge(12, 42);
|
|
compare_ge(42, 42);
|
|
compare_ge(100, 42);
|
|
|
|
compare_never(12, 42);
|
|
compare_never(42, 42);
|
|
compare_never(100, 42);
|
|
|
|
compare_always(12, 42);
|
|
compare_always(42, 42);
|
|
compare_always(100, 42);
|
|
|
|
return 0;
|
|
}
|