Tại sao chip ARM lại có lệnh bằng Javascript trong tên (FJCVTZS)?


138

FJCVTZS là "Chuyển đổi Javascript dấu chấm động thành dấu chấm cố định đã ký, làm tròn về phía 0". Nó được hỗ trợ trong các chip Arm v8.3-A trở lên. Thật kỳ lạ, bởi vì bạn không mong đợi thấy JavaScript gần với kim loại nhất.

Tôi có thể tìm thấy lời giải thích về những gì hướng dẫn làm, nhưng không phải tại sao nó tồn tại. Chủ đề này cho biết "nó tồn tại dưới dạng một lệnh duy nhất là do JS thiếu kiểu số nguyên có nghĩa là các trường hợp sử dụng nhất định cần thao tác này một cách tục tĩu thường xuyên mà không có lý do thuật toán chính xác". Điều đó hợp lý nhưng tôi muốn được hiểu chi tiết hơn.


4
Hỗ trợ trích dẫn đó: Công cụ JavaScript phải thực hiện thao tác này (được gọi ToInt32trong thông số kỹ thuật) khi bạn áp dụng toán tử bitwise cho một số và vào nhiều thời điểm khác (trừ khi công cụ có thể duy trì số dưới dạng số nguyên dưới dạng tối ưu hóa, nhưng trong nhiều trường hợp nó không thể).
TJ Crowder

1
Lưu ý rằng sự khác biệt quan trọng đối với FCVTZShướng dẫn thông thường được cung cấp cho công việc này là FJCVTZScó một hành vi khác khi tràn. Cụ thể, bạn luôn nhận được ít nhất 32 bit trong khi FCVTZSthay vào đó dường như làm điều gì đó khác nếu số đó không phù hợp. Hành vi chính xác của FJCVTZSdường như hơi khó thực hiện theo cách khác.
fuz

1
@Tim Tôi đồng ý với TJ, biên bản cuộc họp không chủ đề (và tôi cho rằng chúng cũng bị hạn chế thì bạn khó có thể có chúng) nhưng để chạy JavaScript trên một thiết bị hỗ trợ ARM là một điều, hãy xem Xây dựng thiết bị IoT với JavaScript
Adriano Repetti

@TimSmith Cảm ơn bạn đã hợp tác. Hãy xem liệu chúng ta có thể mở lại câu hỏi này không.
fuz

Câu trả lời:


125

Đó là bởi vì JS sử dụng độ chính xác kép cho các số, nhưng nếu bạn muốn thực hiện các phép toán với các bit, thì nhiệm vụ này là không cần thiết, vì vậy một hướng dẫn cụ thể để chuyển đổi JS kép thành số nguyên sẽ làm cho mọi thứ dễ dàng hơn.

Liên kết ARM này giải thích rất tốt về nó: https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

Để bổ sung thêm thông tin về nhận xét của fuz, sự khác biệt giữa FCVTZSFJCVTZS(cả hai đều chuyển dấu phẩy động thành int) là trong trường hợp tràn, FJCVTZSgiá trị sẽ là 0x80000000 thay vì tràn. Hơn nữa, FJCVTZScó thể tạo một ngoại lệ để chỉ ra cách chuyển đổi (tức là không chính xác).

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
Bạn nên giải thích lý do tại sao FCVTZShướng dẫn hiện có không đủ cho nhiệm vụ.
fuz

13
Nó không đủ, nó CHẬM nhiều (giả sử ít nhất 2/3 lần) vì nó yêu cầu 10 hướng dẫn khác nhau để thực hiện cùng một tác vụ. Tất nhiên tác động lên một thuật toán lớn hơn sẽ thấp hơn NHIỀU nhưng khi làm việc trên một chiếc A53 nhỏ hơn, cả tốc độ và bộ nhớ sẽ được hưởng lợi từ điều này.) Bây giờ hãy chuyển điều này sang, ví dụ như V8 được biên dịch cho ARM và nó chắc chắn sẽ xứng đáng với một số Không gian CPU.
Adriano Repetti

Có phải lệnh này chỉ được sử dụng khi viết JS runtime như v8 không? Nói chung, nó có ích trong các trường hợp khác không?
wlnirvana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.