|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86emul: relax asm() constraints
On 15/02/16 12:06, Jan Beulich wrote:
> Let's give the compiler as much liberty in picking instruction operands
> as possible. Also drop unnecessary size modifiers when the correct size
> can already be derived from the asm() operands. Finally also drop an
> "unsigned" from idiv_dbl()'s second parameter, allowing a cast to be
> eliminated.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -611,7 +611,7 @@ do {
> */
> static bool_t even_parity(uint8_t v)
> {
> - asm ( "test %b0,%b0; setp %b0" : "=a" (v) : "0" (v) );
> + asm ( "test %1,%1; setp %0" : "=qm" (v) : "q" (v) );
> return v;
> }
>
> @@ -813,9 +813,9 @@ static int read_ulong(
> */
> static bool_t mul_dbl(unsigned long m[2])
> {
> - bool_t rc = 0;
> - asm ( "mul %1; seto %b2"
> - : "+a" (m[0]), "+d" (m[1]), "+q" (rc) );
> + bool_t rc;
> + asm ( "mul %1; seto %2"
> + : "+a" (m[0]), "+d" (m[1]), "=q" (rc) );
> return rc;
> }
>
> @@ -826,9 +826,9 @@ static bool_t mul_dbl(unsigned long m[2]
> */
> static bool_t imul_dbl(unsigned long m[2])
> {
> - bool_t rc = 0;
> + bool_t rc;
> asm ( "imul %1; seto %b2"
> - : "+a" (m[0]), "+d" (m[1]), "+q" (rc) );
> + : "+a" (m[0]), "+d" (m[1]), "=q" (rc) );
> return rc;
> }
>
> @@ -854,9 +854,9 @@ static bool_t div_dbl(unsigned long u[2]
> * NB. We don't use idiv directly as it's moderately hard to work out
> * ahead of time whether it will #DE, which we cannot allow to happen.
> */
> -static bool_t idiv_dbl(unsigned long u[2], unsigned long v)
> +static bool_t idiv_dbl(unsigned long u[2], long v)
> {
> - bool_t negu = (long)u[1] < 0, negv = (long)v < 0;
> + bool_t negu = (long)u[1] < 0, negv = v < 0;
>
> /* u = abs(u) */
> if ( negu )
> @@ -4542,9 +4542,10 @@ x86_emulate(
>
> case 0xbc: /* bsf or tzcnt */ {
> bool_t zf;
> - asm ( "bsf %2,%0; setz %b1"
> +
> + asm ( "bsf %2,%0; setz %1"
> : "=r" (dst.val), "=q" (zf)
This =q could become =qm, like the even_parity() change.
> - : "r" (src.val) );
> + : "rm" (src.val) );
> _regs.eflags &= ~EFLG_ZF;
> if ( (vex.pfx == vex_f3) && vcpu_has_bmi1() )
> {
> @@ -4567,9 +4568,10 @@ x86_emulate(
>
> case 0xbd: /* bsr or lzcnt */ {
> bool_t zf;
> - asm ( "bsr %2,%0; setz %b1"
> +
> + asm ( "bsr %2,%0; setz %1"
> : "=r" (dst.val), "=q" (zf)
> - : "r" (src.val) );
> + : "rm" (src.val) );
> _regs.eflags &= ~EFLG_ZF;
> if ( (vex.pfx == vex_f3) && vcpu_has_lzcnt() )
> {
> @@ -4698,7 +4700,7 @@ x86_emulate(
> break;
> case 4:
> #ifdef __x86_64__
> - asm ( "bswap %k0" : "=r" (dst.val) : "0" (*dst.reg) );
> + asm ( "bswap %k0" : "=r" (dst.val) : "0" (*(uint32_t *)dst.reg)
> );
What is the purpose of both the explicit cast and k constraint?
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |