ARM yongalarında neden Javascript adında (FJCVTZS) bir talimat var?


137

FJCVTZS , "Kayan noktalı Javascript İmzalı sabit noktaya dönüştürülür, Sıfıra doğru yuvarlanır". Arm v8.3-A yongalarında ve sonrasında desteklenmektedir. Garip, çünkü JavaScript'i çıplak metale bu kadar yakın görmeyi beklemiyorsunuz.

Talimatın ne yaptığına dair açıklamalar bulabilirim ama neden var olduğunu bulamıyorum. Bu iş parçacığı , "tek bir talimat olarak var olduğunu çünkü JS'nin bir tamsayı türünün olmaması, belirli kullanım durumlarının bu işleme müstehcen bir şekilde, iyi bir algoritmik neden olmadan ihtiyaç duyduğu anlamına gelir." Bu mantıklı ama daha detaylı bir anlayış istiyorum.


4
Bu alıntıyı desteklemek: JavaScript motoru, ToInt32bir sayıya bitsel bir operatör uyguladığınızda ve diğer çeşitli zamanlarda (motor, sayıyı bir optimizasyon, ancak çoğu durumda yapamaz).
TJ Crowder

1
FCVTZSBu iş için sağlanan olağan talimattan en önemli farkın FJCVTZS, taşma durumunda farklı bir davranışa sahip olmasıdır. Yani, her zaman en az 32 bit elde edersiniz, oysa FCVTZSsayı uymuyorsa bunun yerine farklı bir şey yaparsınız. Bunun doğru davranışını FJCVTZSbaşka türlü uygulamak biraz zor görünmektedir.
fuz

1
Ben TJ katılıyorum @Tim, toplantının tutanakları konu dışı olan (ve onlar da pek bunları olabilir o zaman kısıtlı ediyorsun herhalde) ama bir ARM enerjili cihazda JavaScript çalıştırmasına bir şey IS, bkz ile Yapı Iot cihazları JavaScript
Adriano Repetti

@TimSmith İşbirliğiniz için teşekkür ederiz. Bakalım bu soruyu yeniden açabilecek miyiz?
fuz

Yanıtlar:


124

Bunun nedeni, JS'nin sayılar için çift kesinlik kullanmasıdır, ancak bitlerle işlem yapmak istiyorsanız, görev önemsizdir, bu nedenle JS'yi tam sayıya dönüştürmek için belirli bir talimat, işi kolaylaştırır.

Bu ARM bağlantısı bunu çok iyi açıklıyor: https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

Fuz en yorumu ile ilgili daha fazla bilgi eklemek için, arasındaki farklar FCVTZSve FJCVTZS(her ikisi de int kayan nokta dönüştürmek) taşması durumunda, o vardır FJCVTZSdeğeri yerine taşan 0x80000000 olacaktır. Ayrıca, FJCVTZSdönüşümün nasıl olduğunu (yani tam olmadığını) belirtmek için bir istisna oluşturabilir.

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
FCVTZSGörev için mevcut talimatın neden yetersiz olduğunu açıklamalısınız .
fuz

13
Yetersiz değil, çok YAVAŞ (en az 2/3 kez diyelim) çünkü aynı görevi gerçekleştirmek için 10 farklı komut gerekiyor. Elbette daha büyük bir algoritma üzerindeki etki bundan ÇOK daha düşüktür, ancak daha küçük bir A53 üzerinde çalışırken hem hız hem de bellek bundan faydalanacaktır.) Şimdi bunu, örneğin, ARM için derlenmiş V8'e taşıyalım ve kesinlikle bazılarına layık olacaktır. CPU alanı.
Adriano Repetti

Bu talimat yalnızca v8 gibi JS çalışma zamanı yazarken mi kullanılır? Genel olarak, diğer durumlarda yararlı mı?
wlnirvana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.