1 typedef __UINT8_TYPE__
uint8_t;
2 typedef __UINT16_TYPE__
uint16_t;
3 typedef __UINT32_TYPE__
uint32_t;
4 typedef __UINT64_TYPE__
uint64_t;
5 typedef __INT8_TYPE__
int8_t;
6 typedef __INT16_TYPE__
int16_t;
7 typedef __INT32_TYPE__
int32_t;
8 typedef __INT64_TYPE__
int64_t;
10 /// returns `v + inc` by jitting an addi instruction and executing it
11 /// requires .wtext section to be writable
12 extern "C" uint64_t jit_test(uint64_t v
, int16_t inc
) __attribute__((noinline
, section(".wtext")));
13 extern "C" uint64_t jit_test(uint64_t v
, int16_t inc
) {
14 register uint64_t r3
asm("r3");
16 uint32_t instr
= 0x38630000 | (uint16_t)inc
; // addi 3, 3, inc
20 "addi 4, 4, 1f - 0b\n\t"
26 "1: addi 3, 3, 0x1234\n\t"
28 : "+b"(r3
) : "b"(instr
) : "r4", "r5");
32 extern "C" uint64_t parse_hex(const char *s
) __attribute__((noinline
));
33 extern "C" uint64_t parse_hex(const char *s
) {
35 bool negate
= *s
== '-';
36 if(*s
== '-' || *s
== '+')
38 if(*s
== '0' && (s
[1] == 'x' || s
[1] == 'X'))
44 if(*s
>= '0' && *s
<= '9')
46 else if(*s
>= 'a' && *s
<= 'f')
47 digit
= *s
- 'a' + 0xA;
48 else if(*s
>= 'A' && *s
<= 'F')
49 digit
= *s
- 'A' + 0xA;
52 if(retval
>= 1ULL << 60)
60 extern "C" int main(int argc
, char **argv
) {
61 uint64_t a
= 1, b
= 2;
63 a
= parse_hex(argv
[1]);
65 b
= parse_hex(argv
[2]);
66 register long r3
asm("r3") = jit_test(a
, b
);
67 register long r0
asm("r0") = 1; // exit
68 asm volatile("sc" : : "r"(r0
), "b"(r3
));