2013-05-12 8 views
1

У меня есть массив целых чисел в диапазоне [0,5000), и я хочу разбить их на 5 интервалов ([0,1000), [1000,2000],. .., [4000,5000)) в сборке. Я использовал подход, который, хотя правильный, имеет место для улучшения:Сборка - битовая маска для неэнергии двух интервалов

sltiu $t2, $t0, 1000 ; array element in $t0, compare to 1000 
;... 
bne $t2, $zero, condition ; if $t0 was in the interval done 

Идя таким образом для отдыха. В результате, в худшем случае, 5 ветвей со всеми видами неизбежных киосков. Я хотел бы пойти на такой подход, когда я применил бы маску к элементу массива, что приведет к другому шаблону бита в зависимости от того, принадлежит ли значение интересующим интервалам. Тогда я хотел бы использовать значение бит для перехода в позицию массива (зарезервированной с .space), где я поставил +1 за соответствующий интервал (псевдокод):

daddi $v0, $zero, array_of_interval_hits 
; loop 
xor $t3, $t0, mask ; $t0 contains the array element 
lwu $t4, array_of_interval_hits($t3) 
daddi $t4, $t4, 1 
sw $t4, array_of_interval_hits($t3) 

Есть ли такая маска?

PS: если число> = 5000 или номер < 0 Я должен (напечатать сообщение и) выход - использование неподписанных арифметику я забочусь только для случая числа> = 5000 (отрицательные числа большие позитивы в дополнение до 2)

ответ

0

Ну, я не думаю, что такая маска существует - если кто-то приходит с решением, пожалуйста, должность и принять, но закрытие этого сейчас (для моего решения моей проблемы программирования см моего комментария: Assembly - bit mask for non power of two intervals)

0

Я не знаком с сборкой mips, поэтому я не буду разбираться в конкретных машинных инструкциях. Моя мысль заключалась в том, чтобы не использовать маску, а просто делить (целое число делиться не на деление с плавающей запятой) на ваш номер на 1000. Вы можете использовать результат 0, 1, 2, ..., чтобы определить, куда прыгать.

Так, например, цифры в массиве от 0 до 999 дадут результат 0; номера массивов 1000 - 1999 дадут результат 1; и т. д.

Чтобы иметь дело с вашим PS - любой отрицательный результат (при условии, что операция подписания деления), и вы можете перейти к соответствующему обработчику. То же самое с результатом 5 или более.

+0

Спасибо - К сожалению, нон-деление занимает 24 цикла, так что это полностью отразило бы производительность :(Вот почему я пытаюсь найти маску –

+0

@Mr_and_Mrs_D - Интересно. Так что для моего понимания - 24 цикла хуже, чем «5 ветвей со всеми виды неизбежных ларьков "? –

+0

yes :) Я нахожусь в 1700 году с моей текущей реализацией - это бы взорвало ее до 2500 - чтобы быть справедливым, я попробую и вычислить ее и вернусь к вам как можно скорее. –