code: def test_targets_multi(self):
      self.expect_targets(
          """
              /*@targets
                  (avx512_clx avx512_cnl) (asimdhp asimddp)
              */
              """,
          x86=r"\(avx512_clx avx512_cnl\)",
          armhf=r"\(asimdhp asimddp\)",
      )
      # test skipping implied features and auto-sort
      self.expect_targets(
          """
              /*@targets
                  f16c (sse41 avx sse42) (sse3 avx2 avx512f)
                  vsx2 (vsx vsx3 vsx2)
                  (neon neon_vfpv4 asimd asimdhp asimddp)
              */
              """,
          x86="avx512f f16c avx",
          ppc64="vsx3 vsx2",
          ppc64le="vsx3",  # vsx2 part of baseline
          armhf=r"\(asimdhp asimddp\)",
      )
      # test skipping implied features and keep sort
      self.expect_targets(
          """
              /*@targets $keep_sort
                  (sse41 avx sse42) (sse3 avx2 avx512f)
                  (vsx vsx3 vsx2)
                  (asimddp neon neon_vfpv4 asimd asimdhp)
                  (vx vxe vxe2)
              */
              """,
          x86="avx avx512f",
          ppc64="vsx3",
          armhf=r"\(asimdhp asimddp\)",
          s390x="vxe2",
      )
      # test compiler variety and avoiding duplicating
      self.expect_targets(
          """
              /*@targets $keep_sort
                  fma3 avx2 (fma3 avx2) (avx2 fma3) avx2 fma3
              */
              """,
          x86_gcc=r"fma3 avx2 \(fma3 avx2\)",
          x86_icc="avx2",
          x86_iccw="avx2",
          x86_msvc="avx2",
      )
  
imports: import re, textwrap, os
  from os import sys, path
  from distutils.errors import DistutilsError
label_desc: Use image node_id 25 for calling the _Test_CCompilerOpt obj's underlying member method code with example usage: obj.test_targets_multi() without return types