mirror of
git://repo.or.cz/tinycc.git
synced 2026-06-17 15:44:18 +08:00
sext.w: addiw rd, rs, 0 (sign-extend 32-bit word) fmv.s/fmv.d: fsgnj.s/d rd, rs, rs (float register move) fneg.s/fneg.d: fsgnjn.s/d rd, rs, rs (float register negate) These were defined in riscv64-tok.h but had no handler code. CSR pseudo-instructions (csrr, csrw, csrci, csrsi, csrwi) skipped for now — they require CSR operand parsing in binary mode.
101 lines
1.7 KiB
C
101 lines
1.7 KiB
C
#include <stdio.h>
|
|
|
|
/* P0.4 + P1.4: riscv64 asm pseudo-instructions test.
|
|
Exercises neg/negw, sext.w, fmv.s/d, fneg.s/d. */
|
|
|
|
#ifdef __riscv
|
|
|
|
int test_neg(int x)
|
|
{
|
|
int r;
|
|
asm("neg %0, %1" : "=r"(r) : "r"(x));
|
|
return r;
|
|
}
|
|
|
|
long long test_negw(long long x)
|
|
{
|
|
int r;
|
|
asm("negw %0, %1" : "=r"(r) : "r"((int)x));
|
|
return (long long)r;
|
|
}
|
|
|
|
long long test_sextw(int x)
|
|
{
|
|
long long r;
|
|
asm("sext.w %0, %1" : "=r"(r) : "r"(x));
|
|
return r;
|
|
}
|
|
|
|
float test_fmv_s(float a)
|
|
{
|
|
float r;
|
|
asm("fmv.s %0, %1" : "=f"(r) : "f"(a));
|
|
return r;
|
|
}
|
|
|
|
float test_fneg_s(float a)
|
|
{
|
|
float r;
|
|
asm("fneg.s %0, %1" : "=f"(r) : "f"(a));
|
|
return r;
|
|
}
|
|
|
|
double test_fmv_d(double a)
|
|
{
|
|
double r;
|
|
asm("fmv.d %0, %1" : "=f"(r) : "f"(a));
|
|
return r;
|
|
}
|
|
|
|
double test_fneg_d(double a)
|
|
{
|
|
double r;
|
|
asm("fneg.d %0, %1" : "=f"(r) : "f"(a));
|
|
return r;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
int ok = 1;
|
|
|
|
if (test_neg(42) != -42) {
|
|
printf("FAIL: neg\n");
|
|
ok = 0;
|
|
}
|
|
if (test_negw(100) != -100) {
|
|
printf("FAIL: negw\n");
|
|
ok = 0;
|
|
}
|
|
if (test_sextw(0x80000000) != 0xffffffff80000000LL) {
|
|
printf("FAIL: sext.w\n");
|
|
ok = 0;
|
|
}
|
|
if (test_fmv_s(3.14f) != 3.14f) {
|
|
printf("FAIL: fmv.s\n");
|
|
ok = 0;
|
|
}
|
|
if (test_fneg_s(3.14f) != -3.14f) {
|
|
printf("FAIL: fneg.s\n");
|
|
ok = 0;
|
|
}
|
|
if (test_fmv_d(2.718281828) != 2.718281828) {
|
|
printf("FAIL: fmv.d\n");
|
|
ok = 0;
|
|
}
|
|
if (test_fneg_d(2.718281828) != -2.718281828) {
|
|
printf("FAIL: fneg.d\n");
|
|
ok = 0;
|
|
}
|
|
|
|
printf("%s\n", ok ? "PASS" : "FAIL");
|
|
return ok ? 0 : 1;
|
|
}
|
|
|
|
#else
|
|
int main(void)
|
|
{
|
|
printf("SKIP\n");
|
|
return 0;
|
|
}
|
|
#endif
|