#include <stdint.h> | |
#include <unistd.h> | |
int main(void) | |
{ | |
char op1[] = {0, 1, 2, 3}; | |
char op2[256]; | |
register uint64_t r1 asm("r1") = 0xffffffffffffffffull; | |
register uint64_t r2 asm("r2") = 0xffffffffffffffffull; | |
uint64_t cc; | |
int i; | |
for (i = 0; i < 256; i++) { | |
if (i == 1) { | |
op2[i] = 0xbb; | |
} else { | |
op2[i] = 0; | |
} | |
} | |
asm volatile( | |
" j 2f\n" | |
"1: trtr 3(1,%[op1]),%[op2]\n" | |
"2: exrl %[op1_len],1b\n" | |
" ipm %[cc]\n" | |
: [r1] "+r" (r1), | |
[r2] "+r" (r2), | |
[cc] "=r" (cc) | |
: [op1] "a" (&op1), | |
[op1_len] "a" (3), | |
[op2] "Q" (op2) | |
: "cc"); | |
cc = (cc >> 28) & 3; | |
if (cc != 1) { | |
write(1, "bad cc\n", 7); | |
return 1; | |
} | |
if ((char *)r1 != &op1[1]) { | |
write(1, "bad r1\n", 7); | |
return 1; | |
} | |
if (r2 != 0xffffffffffffffbbull) { | |
write(1, "bad r2\n", 7); | |
return 1; | |
} | |
return 0; | |
} |