강좌 & 팁
글 수 2,412
2011.10.10 02:12:33 (*.138.143.120)
42418
커널 컴파일시 발생하는 rdhi, rdlo and rm must all be different 메세지에 대한 해석
rdhi, rdlo and rm must all be different 메세지는 아래의 명령에서의 해석에서의 경고 메세지이다.
ARM Assembler 설명서에서는 아래의 명령을 아래와 같이 해석한다.
UMULL, UMLAL, SMULL 및 SMLAL
선택적 누산, 32비트 피연산자, 64비트 결과 및 누산기 포함 부호 있는 및 부호 없는 long 곱하기.
구문
Op{S}{cond} RdLo, RdHi, Rn, Rm
인수 설명:
Op UMULL, UMLAL, SMULL 또는 SMLAL 중 하나입니다.
S ARM 상태에서만 사용할 수 있는 선택적 접미사입니다.
S를 지정하면 연산 결과의 조건 코드 플래그가 업데이트됩니다 (2-20페이지의조건부 실행 참조).
cond 선택적 조건 코드입니다 (2-20페이지의 조건부 실행 참조).
RdLo, RdHi 대상 레지스터입니다. UMLAL 및 SMLAL에는 누산 값도 들어 있습니다.
RdLo와 RdHi는 서로 다른 레지스터여야 합니다.
Rn, Rm 피연산자가 들어 있는 ARM 레지스터입니다.
RdHi, RdLo, Rn 또는 Rm에 r15를 사용하면 안 됩니다.
사용법
UMULL 명령어는 Rn 및 Rm의 값을 부호 없는 정수로 해석하며,
이러한 정수를 곱하고 결과의 최하위 32비트를 RdLo에 배치하고 결과의 최상위 32비트를 RdHi에 배치합니다.
UMLAL 명령어는 Rn 및 Rm의 값을 부호 없는 정수로 해석하며, 이러한 정수를 곱하고
64비트 결과를 RdHi 및 RdLo에 들어 있는 64비트 부호 없는 정수에 더합니다.
SMULL 명령어는 Rn 및 Rm의 값을 2의 보수 부호 있는 정수로 해석하며, 이러한 정수를 곱하고
결과의 최하위 32비트를 RdLo에 배치하고 결과의 최상위 32비트를 RdHi에 배치합니다.
SMLAL 명령어는 Rn 및 Rm의 값을 2의 보수 부호 있는 정수로 해석하며, 이러한 정수를 곱하고
64비트 결과를 RdHi 및 RdLo에 들어 있는 64비트 부호 있는 정수에 더합니다.
조건 플래그
S를 지정하면 이러한 명령어는 다음을 수행합니다.
• 결과에 따라 N 및 Z 플래그를 업데이트합니다.
• C 또는 V 플래그에 영향을 주지 않습니다.
아키텍처
이러한 ARM 명령어는 모든 버전의 ARM 아키텍처에서 사용할 수 있습니다.
이러한 32비트 Thumb 명령어는 ARMv6T2 이상에서 사용할 수 있습니다.
이러한 명령어의 16비트 Thumb 버전은 없습니다.
예제
UMULL r0, r4, r5, r6
UMLALS r4, r5, r3, r8
64 비트의 연산시에 컴파일러에서 어셈블러로 해석된 명령에서 r15 를 사용하면 안된다라고 되어 있다.
하지만 실제 이 에러를 내는 라인에서 어셈블러 코드를 보면 아래와 같다.
850: e0c10390 smull r0, r1, r0, r3
86c: e0c10390 smull r0, r1, r0, r3
r15 는 쓰이지 않았고 단지 r0 가 두번쓰였을때 뿐이다.
RdLo, RdHi 는 서로 다른 레지스터이어야 한다고 되어 있고 해석된 코드는 레지스터 이다.
또 에러 메세지는 RdLo, RdHi, Rm 이 서로 달라야 한다고 이야기 하고 있다.
하지만 역시 이 경우에도 RdLo, 와 Rn 이 중복될 뿐이다.
이것은 ARMV6 에서의 잘못된 경고 메세지로서 무시해도 관계가 없다.
단지 r0 가 두번나오는 것에 대한 경고를 표시하는 것이지만 금지하고 있는 내용도 아니며
동작에도 아무런 이상이 없다.
이 에러메세지는 버그로 알려져 있다.
현재 발생하는 툴체인은 gnueabi-4.3.2 에서 발생한다.
이후의 툴체인 어느 버전에서 적용이 되었는지는 확인하지는 못했다.