Имеется функция преобразования ASCII ==> Int (под IA-64): Код (Text): atoi: xor ret0 = ret0, ret0 movl r20 = 0x1999999999999999 cmp.eq p10, p0 = r0, r0 cmp.eq p11, p0 = r0, r0;; .align 32 atoi_loop: {.mmi (p10) ld8 r30 = [in0], 8 shladd ret1 = ret0, 2, ret0 nop.i 0 ;; } {.mii nop.m 0 extr.u r16 = r30, 0, 8 shr.u r30 = r30, 8 ;; } {.mii add r17 = -0x30, r16 add r18 = -0x39, r16 ;; cmp.le.and p11, p0 = r0, r17 } {.mmi cmp.ge.and p11, p0 = r0, r18 ;; cmp.eq p10, p0 = r30, r0 (p11) shladd ret0 = ret1, 1, r17 ;; } {.mib (p11) cmp.geu.unc p12, p0 = r20, ret0 nop.i 0 (p12) br.cond.dptk.few atoi_loop ;; } br.ret.sptk.few b0;; Автор функции - Edmond/HI-TECH, а под IA-64 её портировал Valery. Хотелось бы взглянуть на оригинал. Спасибо за помощь!
AssemblerIA64 Я тоже не смог отыскать оригинальную функцию, видимо она была потерянна при замене форума. Но в приведённом коде я ничего интересного не обнаружил, обычное умножение на 10, с добавлением новых цифр. Вообще на форуме где-то был даже MMX вариант преобразования строки в число, но боюсь что искать его тоже бесполезно. Я тебе предлагаю написать точные условия, как передаётся строка, где должен быть результат, и можно будет опять пооптимизировать эту функцию по скорости или размеру
(вызван из бездны голосом Shoo) AssemblerIA64 Где-то оно конечно сохранилось... Ну сами понимаете. Сейчас это искать далеко. Но если поможет - могу напомнить в чём была суть. Вместо того, чтобы делить на 10, мы используем умножение на число ((2^A-1)/10) При таком умножении в старшей половине результата хранится ответ от деления. Пример: 1 E240 (123456 в DEC) * 1999 9999 = 3039 9998 7840 где ответ - это 3039 (12345)
Сорри, но здесь умножение 10: Код (Text): shladd ret1 = ret0, 2, ret0 ... (p11) shladd ret0 = ret1, 1, r17 А это сравнение Код (Text): (p11) cmp.geu.unc p12, p0 = r20, ret0 для того, чтобы в ret0 не было переполнения?
Типа тоже из бездны AssemblerIA64 Я помню тот топик на старом ВАСМе, это был январь 2004 г. Но хоть убей - не могу припомнить чтобы я включил вариант Эдмонда в окончательную версию "демо", которую я вам выслал вместе с разными недоделками и черновиками. Значит, вообще не факт что код который вы написали работает, и даже не факт что это код Эдмонда - а мож я не осилил его вариант а сдуру сослался Могу только подтвердить что в окончательном "демо" весь код работал и на симуляторе и на настоящей машине. Короче ничерта не помню. Давно это было, и редко с тех пор я пишу на асме. Знаете, плюсы они мощнее: парочка ifdef - и один и тот же код на ура идет и на linux ia64 и на win32 Еще слава богу что здесь на васме у народа широкие взгляды - а то я знаю вполне приличных молодых людей, уже и не подростков, которые заплюют вас услыхав слово "итаниум" Вот недавно консультировался в одном месте по поводу упавшей jvm, так народ заподозрил что-то неладное и попросил показать dmesg.. еле ноги унес