Execution domain for VEXTRACTF128/VINSERTF128


I noticed, that execution domain is set to SSEPackedSingle for these instructions.
Looks like a bug.

let neverHasSideEffects = 1, ExeDomain = SSEPackedSingle in {
def VEXTRACTF128rr : AVXAIi8<0x19, MRMDestReg, (outs VR128:$dst),

- Elena

What domain do you think they should have? They are floating point, but not technically double or single. The domain fix pass will treat them as either anyway as I’ve put them in the table for both single and double.

From X86InstrInfo.cpp

  { X86::VEXTRACTF128mr, X86::VEXTRACTF128mr, X86::VEXTRACTI128mr },
  { X86::VEXTRACTF128rr, X86::VEXTRACTF128rr, X86::VEXTRACTI128rr },
  { X86::VINSERTF128rm,  X86::VINSERTF128rm,  X86::VINSERTI128rm },
  { X86::VINSERTF128rr,  X86::VINSERTF128rr,  X86::VINSERTI128rr },
  { X86::VPERM2F128rm,   X86::VPERM2F128rm,   X86::VPERM2I128rm },
  { X86::VPERM2F128rr,   X86::VPERM2F128rr,   X86::VPERM2I128rr }

I think that it should not belong to any domain.

And I see a problem with this table. If you run in AVX mode and call lookup with VEXTRACTF128rr you fail with assertion.

- Elena

At least in AVX2 mode we should prefer VEXTRACTI128 for integer and VEXTRACTF128 for fp. So I think should have a domain.

Do you have a testcase for the assertion?