У меня есть массив целых чисел в диапазоне [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)
Спасибо - К сожалению, нон-деление занимает 24 цикла, так что это полностью отразило бы производительность :(Вот почему я пытаюсь найти маску –
@Mr_and_Mrs_D - Интересно. Так что для моего понимания - 24 цикла хуже, чем «5 ветвей со всеми виды неизбежных ларьков "? –
yes :) Я нахожусь в 1700 году с моей текущей реализацией - это бы взорвало ее до 2500 - чтобы быть справедливым, я попробую и вычислить ее и вернусь к вам как можно скорее. –