• naur
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    13 days ago

    Rozkaz callq to zwykłe wywołanie funkcji. W GNUjowej składni asemblera sufiks ‘q’ oznacza 64-bitowy argument.

    Odnośnie czekania na dane z pamięci - taki był w sumie mój cel. Chciałem sprawdzić, czy osiągnę tą instrukcją teoretyczną przepustowość kontrolera pamięci. Nie udało się.

    • サぺルOPM
      link
      fedilink
      Polski
      arrow-up
      1
      ·
      12 days ago

      Wiem, tylko myślałem, że podmieniają adres funkcji w zależności od obsługiwanych instrukcji. Skoro to znika po wymuszeniu obsługi tych instrukcji.

      • naur
        link
        fedilink
        arrow-up
        1
        ·
        12 days ago

        W tym przypadku podmiana dzieje się podczas kompilacji. Po przekazaniu flagi do kompilatora rozkaz SSE jest inline’owany w miejscu wywołania i call znika całkowicie.

        Nawiasem mówiąc, istnieje taka sztuczka optymalizacyjna do podmiany w runtime funkcji na wersję specjalizowaną pod konkretny procesor.
        Wywołania funkcji są robione poprzez wskaźnik, który początkowo wskazuje na kawałek kodu który wykrywa procesor i patchuje ten wskaźnik (żeby kolejne wywołania były szybsze).
        Tak samo działa też lazy binding funkcji importowanych z ELFowych bibliotek dynamicznych.

        • サぺルOPM
          link
          fedilink
          Polski
          arrow-up
          1
          ·
          12 days ago

          Tylko automatyczne generowanie takich fragmentów jak widać się nie sprawdza. Lepsze wydaje się oznaczanie jaki fragment algorytmu wygenerować w różnych wersjach.