ntdll/tests: Support testing float registers in the arm64 virtual unwind test.

Only testing d0-d15, not d16-d31, for keeping the test references
a bit smaller.

Signed-off-by: Martin Storsjo <martin@martin.st>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Martin Storsjo 2020-08-25 12:26:27 +03:00 committed by Alexandre Julliard
parent 8c0c70dd0f
commit 41d1fd3229
1 changed files with 34 additions and 10 deletions

View File

@ -4265,7 +4265,7 @@ struct results
ULONG_PTR pc; /* expected final pc value */
int frame; /* expected frame return value */
int frame_offset; /* whether the frame return value is an offset or an absolute value */
int regs[32][2]; /* expected values for registers */
int regs[48][2]; /* expected values for registers */
};
struct unwind_test
@ -4283,15 +4283,19 @@ enum regs
x0, x1, x2, x3, x4, x5, x6, x7,
x8, x9, x10, x11, x12, x13, x14, x15,
x16, x17, x18, x19, x20, x21, x22, x23,
x24, x25, x26, x27, x28, x29, lr, sp
x24, x25, x26, x27, x28, x29, lr, sp,
d0, d1, d2, d3, d4, d5, d6, d7,
d8, d9, d10, d11, d12, d13, d14, d15
};
static const char * const reg_names[32] =
static const char * const reg_names[48] =
{
"x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
"x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
"x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
"x24", "x25", "x26", "x27", "x28", "x29", "lr", "sp"
"x24", "x25", "x26", "x27", "x28", "x29", "lr", "sp",
"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
};
#define ORIG_LR 0xCCCCCCCC
@ -4376,10 +4380,12 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
}
}
ok( frame - sp_offset == context.Sp, "%u/%u: wrong sp %p/%p\n",
testnum, i, (void *)frame - sp_offset, (void *)context.Sp);
testnum, i, (void *)(frame - sp_offset), (void *)context.Sp);
for (j = 0; j < 31; j++) /* Not including sp here */
for (j = 0; j < 48; j++)
{
if (j == sp) continue; /* Handling sp separately above */
for (k = 0; k < nb_regs; k++)
{
if (test->results[i].regs[k][0] == -1)
@ -4399,11 +4405,25 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
"%u/%u: register %s wrong %p/%x\n",
testnum, i, reg_names[j], (void *)context.X[j], test->results[i].regs[k][1] );
}
else if (j >= d8 && j <= d15 && (&ctx_ptr.D8)[j - d8])
{
ok( k < nb_regs, "%u/%u: register %s should not be set to %llx\n",
testnum, i, reg_names[j], context.V[j - d0].Low );
if (k < nb_regs)
ok( context.V[j - d0].Low == test->results[i].regs[k][1],
"%u/%u: register %s wrong %p/%x\n",
testnum, i, reg_names[j], (void *)context.V[j - d0].Low, test->results[i].regs[k][1] );
}
else if (k < nb_regs)
{
ok( context.X[j] == test->results[i].regs[k][1],
"%u/%u: register %s wrong %p/%x\n",
testnum, i, reg_names[j], (void *)context.X[j], test->results[i].regs[k][1] );
if (j < d0)
ok( context.X[j] == test->results[i].regs[k][1],
"%u/%u: register %s wrong %p/%x\n",
testnum, i, reg_names[j], (void *)context.X[j], test->results[i].regs[k][1] );
else
ok( context.V[j - d0].Low == test->results[i].regs[k][1],
"%u/%u: register %s wrong %p/%x\n",
testnum, i, reg_names[j], (void *)context.V[j - d0].Low, test->results[i].regs[k][1] );
}
else
{
@ -4414,10 +4434,14 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
else if (j == x29)
ok( context.Fp == orig_fp, "%u/%u: register fp wrong %p/unset\n",
testnum, i, (void *)context.Fp );
else
else if (j < d0)
ok( context.X[j] == unset_reg,
"%u/%u: register %s wrong %p/unset\n",
testnum, i, reg_names[j], (void *)context.X[j]);
else
ok( context.V[j - d0].Low == unset_reg,
"%u/%u: register %s wrong %p/unset\n",
testnum, i, reg_names[j], (void *)context.V[j - d0].Low);
}
}
}