Tôi đang viết trình biên dịch và tôi phải xuất mã cho các điều kiện phân nhánh trên các giá trị float. Ví dụ: để biên dịch loại mã này:Cách tốt nhất để thực hiện phân nhánh bằng cách sử dụng Intel SSE là gì?
if(a <= b){
//1. DO something
} else {
//2. Do something else
}
Khi a và b là biến nổi. Tôi chỉ cần nhảy tới 2 nếu điều kiện không đúng, khác rơi xuống 1. Tôi đang xem xét tối ưu hóa ở mức trình biên dịch xem xét những gì trong 1 và 2.
Tôi cần một cái gì đó phù hợp với tất cả các toán tử so sánh >,> =, <, < =, == và! =
Cách tôi tìm thấy để so sánh là sử dụng CMPLTSD (và các hướng dẫn tương đương khác cho các toán tử quan hệ khác). Nhưng với điều đó, tôi phải sử dụng thanh ghi SSE đặc biệt cho kết quả và sau đó tôi phải di chuyển giá trị của nó trên thanh ghi đa năng (ví dụ: eax) và cuối cùng so sánh giá trị với 0.
Tôi cũng thấy rằng Hướng dẫn UCOMISD nên đặt cờ chính xác, nhưng dường như nó không hoạt động theo cách tôi nghĩ.
Vì vậy, cách tốt nhất để xử lý mã như thế là gì? Có hướng dẫn nào tốt hơn giải pháp đầu tiên tôi có không?
Tốt nhất, ý tôi là, giải pháp chung cho vấn đề này. Nếu có thể, tôi muốn có mã hoạt động giống như khi so sánh các số nguyên (cmp a, b; jge label). Tất nhiên, tôi thích hướng dẫn nhanh nhất để đạt được điều đó.
Cách tốt nhất để làm điều đó * phụ thuộc vào những gì bạn đang làm *. Như trong, cái gì nằm trong khối '// DO something'? "Cách tốt nhất" thường phụ thuộc vào việc xem toàn bộ hình ảnh, không cố gắng dịch dòng mã của bạn theo dòng. – jalf
Tôi đã thêm chi tiết vào bài đăng để trả lời hai câu hỏi của bạn. –
Nếu bạn thực sự muốn chi nhánh, UCOMISD (thực sự là SSE2) có vẻ là câu trả lời, có vấn đề gì với nó? Kết quả không theo thứ tự? – harold