On 15/06/2022 11:31, Jan Beulich wrote:
> Signed-off-by: Jan Beulich <[email protected]>
>
> --- a/xen/arch/x86/x86_emulate/decode.c
> +++ b/xen/arch/x86/x86_emulate/decode.c
> @@ -1489,12 +1489,25 @@ int x86emul_decode(struct x86_emulate_st
>                      s->simd_size = simd_scalar_vexw;
>                  break;
>  
> +            case 0x2a: /* vcvtsi2sh */
> +                break;
> +
> +            case 0x2c: case 0x2d: /* vcvt{,t}sh2si */
> +                if ( s->evex.pfx == vex_f3 )
> +                    s->fp16 = true;
> +                break;
> +
>              case 0x2e: case 0x2f: /* v{,u}comish */
>                  if ( !s->evex.pfx )
>                      s->fp16 = true;
>                  s->simd_size = simd_none;
>                  break;
>  
> +            case 0x5b: /* vcvt{d,q}q2ph, vcvt{,t}ph2dq */
> +                if ( s->evex.pfx && s->evex.pfx != vex_f2 )
> +                    s->fp16 = true;
> +                break;
> +
>              case 0x6e: /* vmovw r/m16, xmm */
>                  d = (d & ~SrcMask) | SrcMem16;
>                  /* fall through */
> @@ -1504,6 +1517,17 @@ int x86emul_decode(struct x86_emulate_st
>                  s->simd_size = simd_none;
>                  break;
>  
> +            case 0x78: case 0x79: /* vcvt{,t}ph2u{d,q}q, vcvt{,t}sh2usi */
> +                if ( s->evex.pfx != vex_f2 )
> +                    s->fp16 = true;
> +                break;
> +
> +            case 0x7a: /* vcvttph2qq, vcvtu{d,q}q2ph */
> +            case 0x7b: /* vcvtph2qq, vcvtusi2sh */
> +                if ( s->evex.pfx == vex_66 )
> +                    s->fp16 = true;
> +                break;
> +
>              case 0x7c: /* vcvttph2{,u}w */
>              case 0x7d: /* vcvtph2{,u}w / vcvt{,u}w2ph */
>                  d = DstReg | SrcMem | TwoOp;
> @@ -1515,10 +1539,34 @@ int x86emul_decode(struct x86_emulate_st
>  
>              switch ( b )
>              {
> +            case 0x78:
> +            case 0x79:
> +                /* vcvt{,t}ph2u{d,q}q need special casing */
> +                if ( s->evex.pfx <= vex_66 )
> +                {
> +                    if ( !s->evex.brs )
> +                        disp8scale -= 1 + (s->evex.pfx == vex_66);
> +                    break;
> +                }
> +                /* vcvt{,t}sh2usi needs special casing: fall through */
> +            case 0x2c: case 0x2d: /* vcvt{,t}sh2si need special casing */
> +                disp8scale = 1;
> +                break;
> +
>              case 0x5a: /* vcvtph2pd needs special casing */
>                  if ( !s->evex.pfx && !s->evex.brs )
>                      disp8scale -= 2;
>                  break;
> +
> +            case 0x5b: /* vcvt{,t}ph2dq need special casing */
> +                if ( s->evex.pfx && !s->evex.brs )
> +                    --disp8scale;
> +                break;
> +
> +            case 0x7a: case 0x7b: /* vcvt{,t}ph2qq need special casing */
> +                if ( s->evex.pfx == vex_66 && !s->evex.brs )
> +                    disp8scale = s->evex.brs ? 1 : 2 + s->evex.lr;
> +                break;
>              }
>  
>              break;

Perhaps here, in terms of overriding...

~Andrew


Reply via email to