#include <stdint.h> | |
#include <unistd.h> | |
int main(void) | |
{ | |
uint64_t parmlist[] __attribute__((aligned(16))) = { | |
0xfedcba9876543210ull, | |
0, | |
0x7777777777777777ull, | |
0, | |
}; | |
uint64_t op1 = 0x0123456789abcdefull; | |
uint64_t op2 = 0; | |
uint64_t op3 = op1; | |
uint64_t cc; | |
asm volatile( | |
" lghi %%r0,%[flags]\n" | |
" la %%r1,%[parmlist]\n" | |
" csst %[op1],%[op2],%[op3]\n" | |
" ipm %[cc]\n" | |
: [op1] "+m" (op1), | |
[op2] "+m" (op2), | |
[op3] "+r" (op3), | |
[cc] "=r" (cc) | |
: [flags] "K" (0x0301), | |
[parmlist] "m" (parmlist) | |
: "r0", "r1", "cc", "memory"); | |
cc = (cc >> 28) & 3; | |
if (cc) { | |
write(1, "bad cc\n", 7); | |
return 1; | |
} | |
if (op1 != parmlist[0]) { | |
write(1, "bad op1\n", 8); | |
return 1; | |
} | |
if (op2 != parmlist[2]) { | |
write(1, "bad op2\n", 8); | |
return 1; | |
} | |
return 0; | |
} |