ASCII2Int - вариант от Edmond/HI-TECH

Тема в разделе "WASM.A&O", создана пользователем AssemblerIA64, 9 июн 2008.

  1. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Имеется функция преобразования ASCII ==> Int (под IA-64):
    Код (Text):
    1. atoi:
    2.        
    3.         xor      ret0  = ret0, ret0
    4.         movl     r20 = 0x1999999999999999
    5.         cmp.eq   p10, p0 = r0, r0
    6.         cmp.eq   p11, p0 = r0, r0;;
    7.  
    8. .align 32
    9.  
    10. atoi_loop:
    11.  
    12.   {.mmi
    13.   (p10) ld8      r30 = [in0], 8
    14.         shladd   ret1 = ret0, 2, ret0
    15.         nop.i    0
    16.         ;;
    17.   }
    18.  
    19.   {.mii
    20.         nop.m    0
    21.         extr.u   r16 = r30, 0, 8
    22.         shr.u    r30 = r30, 8
    23.         ;;
    24.   }
    25.  
    26.   {.mii
    27.         add      r17 = -0x30, r16
    28.         add      r18 = -0x39, r16
    29.         ;;
    30.         cmp.le.and  p11, p0 = r0, r17
    31.   }
    32.  
    33.   {.mmi
    34.         cmp.ge.and  p11, p0 = r0, r18
    35.         ;;
    36.         cmp.eq   p10, p0 = r30, r0
    37.   (p11) shladd   ret0 = ret1, 1, r17
    38.         ;;
    39.   }
    40.  
    41.   {.mib
    42.   (p11) cmp.geu.unc  p12, p0 = r20, ret0
    43.         nop.i    0
    44.   (p12) br.cond.dptk.few atoi_loop
    45.         ;;
    46.   }
    47.  
    48.         br.ret.sptk.few  b0;;
    Автор функции - Edmond/HI-TECH, а под IA-64 её портировал Valery.
    Хотелось бы взглянуть на оригинал.
    Спасибо за помощь!
     
  2. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    И даже сам Edmond не знает?!
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    AssemblerIA64
    Я тоже не смог отыскать оригинальную функцию, видимо она была потерянна при замене форума. Но в приведённом коде я ничего интересного не обнаружил, обычное умножение на 10, с добавлением новых цифр. Вообще на форуме где-то был даже MMX вариант преобразования строки в число, но боюсь что искать его тоже бесполезно. Я тебе предлагаю написать точные условия, как передаётся строка, где должен быть результат, и можно будет опять пооптимизировать эту функцию по скорости или размеру :)
     
  4. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
     
  5. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    (вызван из бездны голосом Shoo)
    AssemblerIA64
    Где-то оно конечно сохранилось... Ну сами понимаете.
    Сейчас это искать далеко.

    Но если поможет - могу напомнить в чём была суть.

    Вместо того, чтобы делить на 10, мы используем умножение на число ((2^A-1)/10)

    При таком умножении в старшей половине результата хранится ответ от деления.

    Пример: 1 E240 (123456 в DEC) * 1999 9999 = 3039 9998 7840

    где ответ - это 3039 (12345)
     
  6. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Сорри, но здесь умножение 10:
    Код (Text):
    1.     shladd   ret1 = ret0, 2, ret0
    2.     ...
    3. (p11)   shladd   ret0 = ret1, 1, r17
    А это сравнение
    Код (Text):
    1. (p11)   cmp.geu.unc  p12, p0 = r20, ret0
    для того, чтобы в ret0 не было переполнения?
     
  7. Valery

    Valery New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2003
    Сообщения:
    75
    Адрес:
    Russia
    Типа тоже из бездны :)

    AssemblerIA64

    Я помню тот топик на старом ВАСМе, это был январь 2004 г. Но хоть убей - не могу припомнить чтобы я включил вариант Эдмонда в окончательную версию "демо", которую я вам выслал вместе с разными недоделками и черновиками. Значит, вообще не факт что код который вы написали работает, и даже не факт что это код Эдмонда - а мож я не осилил его вариант а сдуру сослался :) Могу только подтвердить что в окончательном "демо" весь код работал и на симуляторе и на настоящей машине.

    Короче ничерта не помню. Давно это было, и редко с тех пор я пишу на асме. Знаете, плюсы они мощнее: парочка ifdef - и один и тот же код на ура идет и на linux ia64 и на win32 :) Еще слава богу что здесь на васме у народа широкие взгляды - а то я знаю вполне приличных молодых людей, уже и не подростков, которые заплюют вас услыхав слово "итаниум" :) Вот недавно консультировался в одном месте по поводу упавшей jvm, так народ заподозрил что-то неладное и попросил показать dmesg.. еле ноги унес :)