#include <limits.h>
#include <stdio.h>
int lpr(int org, int *new)
{
int _new, cc;
asm volatile( "lpr %0,%2\n\t"
"ipm %1\n\t"
"srl %1,28\n\t"
: "=d" (_new), "=d" (cc)
: "d" (org)
: "cc");
*new = _new;
return cc;
}
int lpgr(unsigned long org, unsigned long *new)
{
unsigned long _new;
int cc;
asm volatile( "lpgr %0,%2\n\t"
"ipm %1\n\t"
"srl %1,28\n\t"
: "=d" (_new), "=d" (cc)
: "d" (org)
: "cc");
*new = _new;
return cc;
}
int lpgfr(unsigned long org, unsigned long *new)
{
unsigned long _new;
int cc;
asm volatile( "lpgfr %0,%2\n\t"
"ipm %1\n\t"
"srl %1,28\n\t"
: "=d" (_new), "=d" (cc)
: "d" (org)
: "cc");
*new = _new;
return cc;
}
void t32(int value)
{
int n,cc;
cc = lpr(value, &n);
printf("new: %d cc: %d\n", n, cc);
}
void t64(unsigned long value)
{
int cc;
unsigned long n;
cc = lpgr(value, &n);
printf("new: %ld cc: %d\n", n, cc);
}
void t3264(unsigned long value)
{
int cc;
unsigned long n;
cc = lpgfr(value, &n);
printf("new: %ld cc: %d\n", n, cc);
}
int main()
{
printf("lpr\n");
t32(0); t32(1); t32(-1);
t32(INT_MAX); t32(INT_MIN); t32(UINT_MAX);
printf("lpgr\n");
t64(0); t64(1); t64(-1);
t64(INT_MAX); t64(INT_MIN); t64(UINT_MAX);
t64(LONG_MAX); t64(LONG_MIN); t64(ULONG_MAX);
printf("lpgfr\n");
t3264(0); t3264(1); t64(-1);
t3264(INT_MAX); t3264(INT_MIN); t3264(UINT_MAX);
t3264(LONG_MAX); t3264(LONG_MIN); t3264(ULONG_MAX);
return 0;
}