39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
|
#include <assert.h>
|
||
|
#include <inttypes.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#define TEST_PCADDU(N) \
|
||
|
void test_##N(int a) \
|
||
|
{ \
|
||
|
uint64_t rd1 = 0; \
|
||
|
uint64_t rd2 = 0; \
|
||
|
uint64_t rm, rn; \
|
||
|
\
|
||
|
asm volatile(""#N" %0, 0x104\n\t" \
|
||
|
""#N" %1, 0x12345\n\t" \
|
||
|
: "=r"(rd1), "=r"(rd2) \
|
||
|
: ); \
|
||
|
rm = rd2 - rd1; \
|
||
|
if (!strcmp(#N, "pcalau12i")) { \
|
||
|
rn = ((0x12345UL - 0x104) << a) & ~0xfff; \
|
||
|
} else { \
|
||
|
rn = ((0x12345UL - 0x104) << a) + 4; \
|
||
|
} \
|
||
|
assert(rm == rn); \
|
||
|
}
|
||
|
|
||
|
TEST_PCADDU(pcaddi)
|
||
|
TEST_PCADDU(pcaddu12i)
|
||
|
TEST_PCADDU(pcaddu18i)
|
||
|
TEST_PCADDU(pcalau12i)
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
test_pcaddi(2);
|
||
|
test_pcaddu12i(12);
|
||
|
test_pcaddu18i(18);
|
||
|
test_pcalau12i(12);
|
||
|
|
||
|
return 0;
|
||
|
}
|