Переполнение перемещения при выполнении побитового И (сборка SPARC)?

Я пытаюсь выполнить побитовое И для регистра в качестве битовой маски, чтобы удалить самый значащий бит (который оказывается 16-м битом при подсчете от 0). Однако, когда я пытаюсь скомпилировать свой код с помощью gcc, он выдает следующие сообщения об ошибках:

Сообщения ассемблера: 19: Ошибка: переполнение релокации

Я предполагаю, что это как-то связано с размером битовой маски, которую я применяю, потому что, когда я выполняю И с двумя регистрами, содержащими маленькие числа, я не сталкиваюсь с той же ошибкой. Сам код выглядит так

.global main
main:
save    %sp, -96, %sp

clr %l1
clr     %l2
set 0xffff, %l0
set 0xaaaa8c01, %l4
set 0xff001234, %l5
set 0x13579bdf, %l6
set 0xc8b4ae32, %l7
srl %l4, 31, %l1    
srl %l0, 15, %l2
xor %l1, %l2, %l1
and %l1, 0x1, %l1
sll %l0, 1, %l0
add %l0, %l1, %l0
and %l0, 0xffff, %l0


mov 1, %g1
ta  0

Если бы кто-нибудь мог предложить некоторое представление о том, как решить эту проблему, это было бы очень признательно.

Спасибо,

плохая панда


person badpanda    schedule 15.10.2010    source источник


Ответы (1)


Старшим битом является бит 15 (в 16-битном целом, когда биты отсчитываются от нуля).

person Michael Goldshteyn    schedule 15.10.2010
comment
Это для 32-битного целого числа. Я имел в виду, что биты с 17 и далее содержат нули (и всегда должны содержать нули) в этой конкретной задаче. Возможно, MSB не был правильной терминологией? - person badpanda; 15.10.2010
comment
Вы имеете в виду, что 16-31 содержат нули? Какие 16 бит являются наиболее значащими в 32-битном целом числе. Мне интересно, если вы просто испытываете переполнение регистра из-за одной из этих инструкций srl/sll. - person Michael Goldshteyn; 15.10.2010
comment
Да, это я и имел в виду. Извините за путаницу (я только учусь). Все инструкции srl/sll компилируются и работают должным образом, когда я их запускаю, но последняя строка (добавить %l0, 0xffff, %l0) не будет. - person badpanda; 15.10.2010
comment
@badpanda, насколько я помню, коды операций SPARC поддерживают непосредственные значения до 10 или 12 бит. Если вам нужно больше, используйте инструкцию load high (не могу вспомнить точную мнемонику). - person ruslik; 16.10.2010
comment
Спасибо Руслик, это оказалось проблемой. - person badpanda; 18.10.2010