Что эквивалентно коду операции rdtsc для PPC? - PullRequest
7 голосов
/ 04 мая 2011

У меня есть программа сборки, которая имеет следующий код. Этот код прекрасно компилируется для процессора Intel. Но когда я использую PPC (кросс) компилятор, я получаю сообщение об ошибке, что код операции не распознается. Я пытаюсь найти, существует ли эквивалентный код операции для архитектуры PPC.

.file   "assembly.s"
.text
.globl func64
.type   func64,@function
func64:
    rdtsc
    ret

.size   func64,.Lfe1-func64
.globl func
.type   func,@function
func:
    rdtsc
    ret

Ответы [ 4 ]

7 голосов
/ 04 мая 2011

PowerPC включает в себя регистр «временной базы», ​​который регулярно увеличивается (хотя, возможно, не на каждом такте - это зависит от реального оборудования и операционной системы).Регистр TB является 64-битным значением, читаемым как две 32-битные половины с mftb (младшая половина) и mftbu (старшая половина).Четыре наименее значимых бита TB несколько ненадежны (они увеличиваются монотонно, но не обязательно с фиксированной скоростью).

Некоторые из старых процессоров PowerPC не имеют регистра TB (но ОС может эмулировать его,вероятно, с сомнительной точностью);тем не менее, у 603e он уже есть, поэтому можно поспорить, что у большинства, если не у всех систем PowerPC, находящихся в производстве, он есть.Существует также «регистр временной базы данных».

Подробнее см. В спецификации Power ISA, доступной на веб-сайте power.org .На момент написания этого ответа текущая версия была 2.06B, а регистр TB и коды операций были задокументированы на страницах с 703 по 706.

3 голосов
/ 05 июня 2011

Когда вам нужно 64-битное значение в 32-битной архитектуре (вы не знаете, как оно работает в 64-битной среде) и вы читаете регистр TB, вы можете столкнуться с проблемой нижней половины, переходящей от 0xffffffff к 0 -Разумеется, это случается не часто, но вы можете быть уверены, что это произойдет, когда оно нанесет наибольший урон;)

Я рекомендую сначала прочитать верхнюю половину, затем нижнюю и, наконец, верхнюю.Сравните два верха, и если они равны, нет проблем.Если они различаются (первый должен быть на единицу меньше, чем последний), вам нужно взглянуть на нижний, чтобы увидеть, с каким верхним он должен быть связан: если установлен его старший бит, он должен быть в паре с первым, в противном случае с последним.

2 голосов
/ 18 июня 2011

Apple предлагает три версии mach_absolute_time () для различных типов кода:

  • 32-битное
  • 64-битное ядро, 32-битноеприложение
  • 64-битное ядро, 64-битное приложение
0 голосов
/ 29 октября 2018

Вы можете сделать следующее:

вдохновленный комментарием Питера Кордеса и этой разборки clang's __builtin_readcyclecounter:

mfspr 3, 268
blr

Если вы работаете с gcc, используйте следующее:

unsigned long long rdtsc(){
        unsigned long long rval;
        __asm__ __volatile__("mfspr %%r3, 268": "=r" (rval));
        return rval;
}

Для лязга:

unsigned long long readTSC() {
    // _mm_lfence();  // optionally wait for earlier insns to retire before reading the clock
    return __builtin_readcyclecounter();
}
...