ARM 칩에 이름에 Javascript가 포함 된 명령어 (FJCVTZS)가있는 이유는 무엇입니까?


148

FJCVTZS 는 "Floating-point Javascript Convert to Signed fixed-point, rounding into zero"입니다. Arm v8.3-A 칩 이상에서 지원됩니다. 이상합니다. JavaScript가 베어 메탈에 너무 가깝다고 기대하지 않기 때문입니다.

명령이 수행하는 작업에 대한 설명은 찾을 수 있지만 왜 존재하는지는 알 수 없습니다. 이 스레드 는 "JS에 정수 유형이 없음을 의미하기 때문에 단일 명령어로 존재합니다. 이는 특정 유스 케이스가 좋은 알고리즘 이유없이이 작업을 외설적으로 자주 필요로하기 때문입니다."라고 말합니다. 그럴듯하지만 더 자세한 이해를 원합니다.


4
인용문 지원 : JavaScript 엔진은 ToInt32비트 연산자를 숫자에 적용 할 때마다 (사양에서 호출 됨)이 작업을 수행해야합니다 ( 엔진이 숫자를 정수로 유지할 수있는 경우가 아니면 최적화하지만 많은 경우에 불가능합니다).
TJ Crowder

1
FCVTZS이 작업에 대해 제공되는 일반적인 명령 과의 중요한 차이점 은 FJCVTZS오버플로에 대해 다른 동작 이 있다는 것 입니다. 즉, 항상 최소 32 비트를 얻지 만 FCVTZS숫자가 맞지 않으면 다른 작업을 수행 하는 것처럼 보입니다. 의 올바른 동작은 FJCVTZS다른 방법으로 구현하기가 약간 까다로운 것 같습니다.
fuz

1
@Tim 저는 TJ에 동의합니다. 회의록은 주제에서 벗어 났지만 (제한되어 있으므로 거의 사용할 수 없다고 가정합니다) ARM 기반 장치에서 JavaScript를 실행하는 것이 중요합니다. JavaScript
Adriano Repetti

@TimSmith 협조 해 주셔서 감사합니다. 이 질문을 다시 열 수 있는지 봅시다.
fuz

답변:


132

JS는 숫자에 배정 밀도를 사용하기 때문이지만 비트로 연산을 수행하려는 경우 작업은 사소하지 않으므로 JS double을 정수로 변환하는 특정 명령을 사용하면 작업이 더 쉬워집니다.

이 ARM 링크는이를 매우 잘 설명합니다. https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

fuz의 의견에 대한 자세한 정보를 추가하기 위해, 차이점 FCVTZSFJCVTZS(둘 다 int와 부동 소수점 심자) 오버 플로우의 경우, 점이다 FJCVTZS값이 대신 넘치는 0x80000000에있을 것입니다. 또한 FJCVTZS변환이 어떻게 이루어 졌는지 (즉, 정확하지 않음) 표시하기 위해 예외를 생성 할 수 있습니다.

FJCVTZS: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801g/hko1477562192868.html

FCVTZS: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802a/FCVTZS_float_int.html


8
기존 FCVTZS지침이 작업에 충분하지 않은 이유를 설명해야합니다 .
fuz

13
충분하지 않습니다. 동일한 작업을 수행하기 위해 10 개의 다른 명령이 필요하기 때문에 훨씬 느립니다 (최소한 2/3 배). 물론 더 큰 알고리즘에 미치는 영향은 그보다 훨씬 낮지 만 더 작은 A53에서 작업 할 때 속도와 메모리 모두 이점을 얻을 수 있습니다. CPU 공간.
Adriano Repetti

이 명령어는 v8과 같은 JS 런타임을 작성할 때만 사용됩니까? 일반적으로 다른 경우에도 유용합니까?
wlnirvana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.