такой тупой код Код (Text): for i:=1 to 100000 do asm adss xmm0 ,xmm1 ...24 raza... end; На амд выполняется в 3раза быстрее чем на интеле п4. ВОПРОС: почему? и если это не оптимизированно для П4 то как это оптимизировать?
locki Для этого существуют таблицы латентностей (таймингов) как у Intel, так и AMD. И вроде как латентности addss у них одинаковые (AMD и P4 Northwood 4 тика, P4 Prescott 5 тиков). Поэтому если у тебя идет повтор addss с одним и тем же регистром xmm0, то вроде как большой разницы быть не должно. А собака может быть зарыта совсем в другом месте. Например, не забыл ли ты инициализировать используемые xmm регистры, ведь ты работаешь не с целыми числами, а с вещественными, и начальные значения в регистрах могут быть ивалидными или могут возникать переполнения (для single max 10^38 это не так уж много , а значит замаскированные эксепшены и большиие потери времени
Инициализировать не забыл. 32 битными значениями целыми числами. ИЗ-за целых чисел? Может проблемма в декодере P4?
Смотря как загружал, если через movd, то да Команды, заканчивающиеся на ss\ps работают с вещественными 32-бит числами (single precision). У целых и вещественных чисел только значение 0 одинаковое - нули во всех битах, а битовые представления других чисел совершенно другие. Поэтому у тебя скорее всего вылетает исключение denormal operand (если целое число - положительное меньше 23 бит) или вообще NaN ("не число", например целое = -1). По правильному целое число из 32-битного регистра нужно загружать в xmm как вещественное single с помощью команды преобразования формата cvtsi2ss И декодер тут ес-но ни причем - ты же не хочешь прослыть плохим танцором, которому декодеры мешают ))