2012-01-30 37 views
5

Tôi quan tâm đến việc tìm nhanh nhất (số chu kỳ thấp nhất) so sánh các giá trị được lưu trữ trong thanh ghi NEON (nói Q0 và Q3) trên lõi Cortex-A9 (hướng dẫn VFP).ARM NEON: so sánh các giá trị bit 128

Cho đến nay tôi có như sau:

(1) Sử dụng dấu chấm động so VFP:

vcmp.f64  d0, d6 
vmrs   APSR_nzcv, fpscr 
vcmpeq.f64  d1, d7 
vmrseq   APSR_nzcv, fpscr 

Nếu 64bit "nổi" tương đương với NaN, phiên bản này sẽ không hoạt động.

(2) Sử dụng thu hẹp NEON và so sánh VFP (thời gian này chỉ một lần và trong một cách NaN-safe):

vceq.i32  q15, q0, q3 
vmovn.i32  d31, q15 
vshl.s16  d31, d31, #8 
vcmp.f64  d31, d29 
vmrs   APSR_nzcv, fpscr 

Sổ đăng ký D29 trước đây được cài đặt sẵn với mẫu 16bit đúng:

vmov.i16  d29, #65280  ; 0xff00 

Câu hỏi của tôi là: có tốt hơn điều này không? Tôi đang giám sát một số cách rõ ràng để làm điều đó?

Trả lời

2

Tôi tin rằng bạn có thể giảm bớt bằng một hướng dẫn. Bằng cách sử dụng phím shift trái và chèn (VLSI), bạn có thể kết hợp 4 giá trị 32 bit của Q15 thành 4 giá trị 16 bit trong D31. Sau đó bạn có thể so sánh với 0 và nhận được các cờ dấu chấm động.

vceq.i32 q15, q0, q3 
vlsi.32 d31, d30, #16 
vcmp.f64 d31, #0 
vmrs  APSR_nzcv, fpscr 
+0

Các HƯỚNG DẪN đầu tiên "ghi đè" cả Q15 (ví dụ: D30 và D31), trong khi thứ hai chỉ có D31 như một _destination_, do đó một số thông tin bị mất và việc so sánh sẽ không luôn luôn mang lại kết quả đúng. – Mircea

+0

Khi bạn sử dụng vceq.i32, nó đặt tất cả 1 hoặc tất cả 0 vào mỗi trong số 4 làn đường 32 bit. Lệnh đầu tiên kết hợp các thông tin hữu ích từ D30 và D31 vào D31 (16 bit thấp hơn của tất cả 4 so sánh). Lệnh thứ hai so sánh 64 bit thấp hơn HAS tất cả các thông tin hữu ích. – BitBank

+0

Hướng dẫn đầu tiên (ví dụ: vceq.i32) không "kết hợp" bất kỳ thứ gì. Hơn nữa, thứ hai không sử dụng D31 làm đầu vào ... – Mircea

Các vấn đề liên quan