2010-09-29 20 views
5

Tôi không ở vị trí nào để tạo ra sự khác biệt giữa vld4_f32vld4q_f32 trong hướng dẫn ARM NEON.ARM NEON: Sự khác nhau giữa vld4_f32 và vld4q_f32 là gì?

Sự nhầm lẫn bắt đầu khi tôi tăng cấp độ mã hóa của mình và bắt đầu xem hướng dẫn lắp ráp thay vì bản chất ít thông tin hơn.

Lý do tôi cần phải sử dụng vld4 hướng dẫn biến thể ở đây là bởi vì, tôi muốn chụp float32_t 's từ mọi vị trí thứ 4 của mảng lớn của tôi.

alt text

Các vld4_f32 intrinsics và hướng dẫn lắp ráp tương ứng giống như thế này (From this link)

float32x2x4_t vld4_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0] 

Các vld4q_f32 intrinsics và hướng dẫn lắp ráp tương ứng của nó trông như thế này

float32x4x4_t vld4q_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0] 

Vâng, ở cấp độ nội tại sự khác biệt tôi thấy là kiểu trả về, nhưng nếu tôi nhìn vào hướng dẫn lắp ráp và số lượng thanh ghi, cả hai đều giống nhau. Làm thế nào trình biên dịch hoặc trình biên dịch biết sự khác biệt giữa hai?

ai đó có thể làm rõ hơn về vấn đề này và cũng có thể giải thích làm thế nào tôi có thể đạt được tải 4 float32_t giá trị mà được định vị ở mọi vị trí bộ nhớ 4 thành một đơn đăng ký?

Trả lời

7

Có, tôi đã tìm ra sự khác biệt. Tôi đã sử dụng CodeSourcery để xem nội dung đăng ký thực tế cho tất cả các hướng dẫn tải. Liên kết tôi đã đăng không cung cấp đầy đủ chi tiết về vld4q_f32.

Được rồi, trước hết đến các vld4_f32, đây tải 4 d đăng ký (ví dụ d16-19) mỗi d đăng ký là 64 bit dài, do đó hướng dẫn này sẽ được tải 8 giá trị đầu tiên xen kẽ với một khoảng thời gian 4 như thể hiện trong hình bên dưới. alt text

Trong trường hợp thứ hai vld4q_f32, đây tải 8 d đăng ký (ví dụ d16-23) thay vì bốn. Đối với một độc giả của số này link, không rõ ràng là 8 thanh ghi sẽ được tải. Khi tôi nhìn vào mã dis-lắp ráp cho một vld4qf32, nó đã sử dụng 8 d đăng ký.

Hướng dẫn này thực sự sẽ làm những gì tôi đã hy vọng nó thực hiện tức là để tải 4 float32_t giá trị trong khoảng thời gian 4 như được hiển thị trong hình bên dưới. alt text

+1

Vâng, tải vld4q 4 q đăng ký, như tên của nó ... – jcayzac

1

Tôi đã tháo rời hai intrinsics, có thể nó sẽ giúp ai đó:

// C++ 
uint32x4x4_t r = vld4q_u32((uint32_t *) output); 
// assembly 
VLD4.32   {D16,D18,D20,D22}, [R0]! 
VLD4.32   {D17,D19,D21,D23}, [R0] 

// C++ 
uint32x2x4_t r = vld4_u32((uint32_t *) output); 
// assembly 
VLD4.32   {D20-D23}, [R0]