встроенный asm скомпилирован в XCode для симулятора, но не скомпилирован для устройства - PullRequest
0 голосов
/ 10 декабря 2010

Я довольно долго гуглял, но до сих пор не нашел решения.Я надеюсь, что кто-то может помочь мне в этом.

У меня есть три встроенные функции asm, как показано ниже:

static __inline__ int Bsf(uint32_t Operand) {
  int eax;
  asm __volatile__ (
    "bsfl %0, %0" "\n\t"
    : "=a" (eax)
    : "0" (Operand)
  );
  return eax;
}

static __inline__ int Bsr(uint32_t Operand) {
  int eax;
  asm __volatile__ (
    "bsrl %0, %0" "\n\t"
    : "=a" (eax)
    : "0" (Operand)
  );
  return eax;
}

static __inline__ uint64_t TimeStampCounter(void) {
  uint32_t eax, edx;
  asm __volatile__ (
    "rdtsc" "\n\t"
    : "=a" (eax), "=d" (edx)
    :
  );
  return MAKE_LONG_LONG(eax, edx);
}

Все они успешно скомпилированы в XCode для Simulator, но не удалось, когда я переключился на сборкуУстройство - 4.1 (для iPhone).Сообщение, которое я получил, является "невозможным ограничением в asm".Я считаю, что проблема в том, что приведенный выше ассемблерный код не работает для процессора на базе ARM.Может ли кто-нибудь пролить свет на то, как переписать код, чтобы он компилировался для процессора iPhone?Это может быть либо ассемблер, либо чистый C-код.Заранее спасибо!

Лев

1 Ответ

0 голосов
/ 10 декабря 2010

Вы можете попробовать инструкцию ARM clz, чтобы заменить bsr.Я не знаю хороших замен для двух других.

Редактировать: OP прояснил некоторый контекст.

Вам необходимо получить Intel® 64 и IA-32 Architectures Software Developer.Руководства .Они содержат полный набор инструкций, который поможет вам.Даже псевдокод для инструкций bsf / bsr находится там и может быть легко переведен в их эквиваленты C:

int Bsf(uint32_t n) {
{
    int m;

    for (m = 0; m < 32; m++)
    {
        if (n & (1 << m))
            return m;
    }

    return 32;
}

int Bsr(uint32_t n) {
{
    int m;

    for (m = 31; m >= 0; m--)
    {
        if (n & (1 << m))
            return m;
    }

    return 32;
}

Инструкция rdtsc читает счетчик меток времени процессора, который64-битное значение увеличивается с каждым тактом:

Процессор монотонно увеличивает счетчик меток времени MSR каждый такт и сбрасывает его в 0 при каждом сбросе процессора.

Вам необходимо выяснить, зачем вашей программе нужна эта информация, и как лучше всего перевести ее на ваш случай ARM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...