5.17.4. VFP 지시어 및 벡터 표시

이 단원에서는 armasm에 대해서만 설명합니다. 이러한 지시어 또는 벡터 표시는 C 및 C++ 컴파일러의 인라인 어셈블러에서 사용할 수 없습니다.

VFP 벡터 모드는 향후 사용할 수 없으며 벡터 표시는 UAL에서 지원되지 않습니다. 벡터 표시를 사용하려면 UAL 이전의 VFP 니모닉을 사용해야 합니다. 자세한 내용은 UAL 이전의 VFP 니모닉을 참조하십시오. UAL 이전의 VFP 니모닉과 UAL VFP 니모닉을 함께 사용할 수 있습니다.

코드에서 VFP 벡터 길이 및 스트라이드에 대한 어설션을 만들고 어셈블러를 통해 확인할 수 있습니다. 다음을 참조하십시오.

VFPASSERT 지시어를 사용할 경우 UAL 이전 니모닉으로 작성된 모든 VFP 데이터 처리 명령어에서 벡터 정보를 지정해야 합니다. 벡터 표시는 벡터 표시에서 설명합니다. VFPASSERT 지시어를 사용하지 않을 경우 이 표시를 사용하면 안 됩니다.

UAL 이전의 VFP 니모닉

UAL 니모닉에서 .F32를 사용하여 단정밀도 데이터를 지정하는 경우 UAL 이전 니모닉에서는 명령어 니모닉에 추가된 S를 사용합니다. 예를 들어 VABS.32FABSS였습니다.

UAL 니모닉에서 .F64를 사용하여 배정밀도 데이터를 지정하는 경우 UAL 이전 니모닉에서는 명령어 니모닉에 추가된 D를 사용합니다. 예를 들어 VCMPE.64FCMPED였습니다.

Table 5.15에서는 VFP 벡터 모드의 영향을 받은 이러한 명령어의 UAL 이전 니모닉을 보여 줍니다. 다른 모든 VFP 명령어는LENSTRIDE의 설정에 관계없이 항상 스칼라입니다.

Table 5.15. UAL 이전의 VFP 니모닉

UAL 니모닉이에 해당하는 UAL 이전 니모닉
VABSFABS
VADDFADD
VDIVFDIV
VMLAFMAC
VMLSFNMAC
VMOV (즉치값) FCONST [1]
VMOV (레지스터) FCPY
VMULFMUL
VNEGFNEG
VNMLAFNMSC
VNMLSFMSC
VNMULFNMUL
VSQRTFSQRT
VSUBFSUB

[1] VMOV (즉치값) 의 즉치값은 로드할 부동 소수점 숫자이고, FCONST의 즉치값은 로드할 부동 소수점 숫자를 생성하는 명령어에 인코딩된 숫자입니다. 자세한 내용은 FCONST의 즉치값을 참조하십시오.


FCONST의 즉치값

Table 5.16에서는 FCONST를 사용하여 로드할 수 있는 부동 소수점 상수를 보여 줍니다. 뒤에 오는 0은 명확성을 위해 생략되었습니다. FCONST 명령어에 입력해야 하는 즉치값은 이진수 abcdefgh를 십진수로 표현한 것입니다. 다음은 이러한 이진수에 대한 설명입니다.

a

양수일 경우는 0이고 음수일 경우는 1입니다.

bcd

열 제목에 표시됩니다.

efgh

행 제목에 표시됩니다.

또는 앞에 0x가 오는 16진수 표현을 사용할 수도 있습니다.

Table 5.16. 부동 소수점 상수 값

 bcd000001010011100101110111
efgh         
0000 2.04.08.016.00.1250.250.51.0
0001 2.1254.258.517.00.13281250.2656250.531251.0625
0010 2.254.59.018.00.1406250.281250.56251.125
0011 2.3754.759.519.00.14843750.2968750.593751.1875
0100 2.55.010.020.00.156250.31250.6251.25
0101 2.6255.2510.521.00.16406250.3281250.656251.3125
0110 2.755.511.022.00.1718750.343750.68751.375
0111 2.8755.7511.523.00.17968750.3593750.718751.4375
1000 3.06.012.024.00.18750.3750.751.5
1001 3.1256.2512.525.00.19531250.3906250.781251.5625
1010 3.256.513.026.00.2031250.406250.81251.625
1011 3.3756.7513.527.00.21093750.4218750.843751.6875
1100 3.57.014.028.00.218750.43750.8751.75
1101 3.6257.2514.529.00.22656250.4531250.906251.8125
1110 3.757.515.030.00.2343750.468750.93751.875
1111 3.8757.7515.531.00.24218750.4843750.968751.9375

벡터 표시

UAL 이전의 VFP 데이터 처리 명령어에서 각괄호를 사용하여 VFP 레지스터의 벡터를 지정합니다.

  • sn은 단정밀도 스칼라 레지스터 n입니다.

  • sn <>은 레지스터 n에서 시작하며 현재 벡터 길이와 스트라이드를 기준으로 길이와 스트라이드가 지정된 단정밀도 벡터입니다.

  • sn <L>은 레지스터 n에서 시작하며 길이와 스트라이드가 각각 L과 1인 단정밀도 벡터입니다.

  • sn <L:S>은 레지스터 n에서 시작하며 길이와 스트라이드가 각각 LS인 단정밀도 벡터입니다.

  • dn은 배정밀도 스칼라 레지스터 n입니다.

  • dn <>은 레지스터n에서 시작하며 현재 벡터 길이와 스트라이드를 기준으로 길이와 스트라이드가 지정된 배정밀도 벡터입니다.

  • dn <L>은 레지스터 n에서 시작하며 길이와 스트라이드가 각각 L과 1인인 배정밀도 벡터입니다.

  • dn <L:S>는 레지스터 n에서 시작하며 길이와 스트라이드가 각각 LS인 배정밀도 벡터입니다.

DNSN 지시어를 사용하여 정의한 이름에 이 벡터 표시를 사용할 수 있습니다 (QN, DN 및 SN 참조).

DNSN 지시어 자체에 이 벡터 표시를 사용하면 안 됩니다.

VFPASSERT SCALAR

VFPASSERT SCALAR 지시어는 어셈블러에 다음 VFP 명령어가 스칼라 모드에 있음을 알립니다.

구문
VFPASSERT SCALAR
사용법

VFPASSERT SCALAR 지시어를 사용하여 VFP 모드가 VECTOR인 코드 블록의 끝을 표시할 수 있습니다.

VFPASSERT SCALAR 지시어를 변경이 발생한 명령어 바로 뒤에 배치합니다. 일반적으로 FMXR 명령어가 사용되지만 BL 명령어가 사용될 수 있습니다.

함수에서 VFP가 종료 시 벡터 모드에 있도록 요구할 경우 VFPASSERT SCALAR 지시어를 마지막 명령어 바로 뒤에 배치합니다. 이러한 함수는 AAPCS를 준수하지 않습니다. 자세한 내용은 install_directory\Documentation\Specifications\...에 있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을 참조하십시오.

추가 참고:

Note

이 지시어는 코드를 생성하지 않으며 단지 프로그래머에 의한 어설션일 뿐입니다. 어셈블러에서는 이러한 어설션이 서로 일치하지 않거나 VFP 데이터 처리 명령어의 벡터 표시와 일치하지 않을 경우 오류 메시지를 생성합니다.

어셈블러에서는 벡터 길이가 1인 경우에도 VFPASSERT SCALAR 지시어 다음에 나오는 VFP 데이터 처리 명령어의 벡터 표시에 대해 오류를 발생시킵니다.

예제
    VFPASSERT   SCALAR            ; scalar mode
    faddd       d4, d4, d0        ; okay
    fadds       s4<3>, s0, s8<3>  ; ERROR, vector in scalar mode
    fabss       s24<1>, s28<1>    ; ERROR, vector in scalar mode
                                  ; (even though length==1) 

VFPASSERT VECTOR

VFPASSERT VECTOR 지시어는 어셈블러에 다음 VFP 명령어가 벡터 모드에 있음을 알립니다. 또한 벡터의 길이 및 스트라이드를 지정할 수 있습니다.

구문
VFPASSERT VECTOR[<[n[:s]]>]

인수 설명:

n

1 ~ 8의 벡터 길이입니다.

s

1 ~ 2의 벡터 스트라이드입니다.

사용법

VFPASSERT VECTOR 지시어를 사용하여 VFP 모드가 VECTOR인 명령어 블록의 시작을 표시하고 벡터의 길이 또는 스트라이드에 대한 변경 내용을 표시할 수 있습니다.

VFPASSERT VECTOR 지시어를 변경이 발생한 명령어 바로 뒤에 배치합니다. 일반적으로 FMXR 명령어가 사용되지만 BL 명령어가 사용될 수 있습니다.

함수에서 VFP가 시작 시 벡터 모드에 있도록 요구할 경우 VFPASSERT VECTOR 지시어를 마지막 명령어 바로 뒤에 배치합니다. 이러한 함수는 AAPCS를 준수하지 않습니다. 자세한 내용은 install_directory\Documentation\Specifications\...에 있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을 참조하십시오.

참조:

Note

이 지시어는 코드를 생성하지 않으며 단지 프로그래머에 의한 어설션일 뿐입니다. 어셈블러에서는 이러한 어설션이 서로 일치하지 않거나 VFP 데이터 처리 명령어의 벡터 표시와 일치하지 않을 경우 오류 메시지를 생성합니다.

예제
    VMRS    r10,FPSCR          ; UAL mnemonic - could be FMRX instead.
    BIC     r10,r10,#0x00370000
    ORR     r10,r10,#0x00020000    ; set length = 3, stride = 1
    VMSR    FPSCR,r10
    VFPASSERT VECTOR           ; assert vector mode, unspecified length & stride
    faddd  d4, d4, d0          ; ERROR, scalar in vector mode
    fadds  s16<3>, s0, s8<3>   ; okay
    fabss  s24<1>, s28<1>      ; wrong length, but not faulted (unspecified) 
    VMRS    r10,FPSCR
    BIC     r10,r10,#0x00370000
    ORR     r10,r10,#0x00030000    ; set length = 4, stride = 1
    VMSR    FPSCR,r10
    VFPASSERT VECTOR<4>        ; assert vector mode, length 4, stride 1
    fadds  s24<4>, s0, s8<4>   ; okay
    fabss  s24<2>, s24<2>      ; ERROR, wrong length
    VMRS    r10,FPSCR
    BIC     r10,r10,#0x00370000
    ORR     r10,r10,#0x00130000    ; set length = 4, stride = 2
    VMSR    FPSCR,r10
    VFPASSERT VECTOR<4:2>      ; assert vector mode, length 4, stride 2
    fadds  s8<4>, s0, s16<4>   ; ERROR, wrong stride
    fabss  s16<4:2>, s28<4:2>  ; okay
    fadds  s8<>, s2, s16<>     ; okay (s8 and s16 both have
                               ; length 4 and stride 2.
                               ; s2 is scalar.) 
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential