Как лучше всего выполнить ветвление с помощью Intel SSE?

Я пишу компилятор, и мне нужно вывести код для условий ветвления для значений с плавающей запятой. Например, для компиляции такого кода:

if(a <= b){
    //1. DO something
} else {
    //2. Do something else
}

Когда a и b являются переменными с плавающей запятой. Мне просто нужно перейти к 2, если условие неверно, иначе упадет до 1. Я рассматриваю здесь оптимизацию на уровне компилятора с учетом того, что находится в 1 и 2.

Мне нужно что-то, что работает со всеми операторами сравнения > , >=, <, <=, == и !=

Я нашел способ сделать сравнение, используя CMPLTSD (и другие эквивалентные инструкции для других реляционных операторов). Но при этом я должен использовать регистр SSE специально для результата, а затем я должен переместить его значение в регистр общего назначения (например, eax) и, наконец, сравнить значение с 0.

Я также видел, что UCOMISD инструкция должна правильно ставить флаги, но, видимо, это не работает так, как я думал.

Итак, как лучше всего обрабатывать такой код? Есть ли лучшие инструкции, чем первое решение, которое у меня есть?

Под лучшим я подразумеваю общее решение этой проблемы. Если возможно, я хотел бы, чтобы код вел себя так же, как при сравнении целых чисел (cmp a, b; метка jge). Конечно, я бы предпочел самые быстрые инструкции для достижения этого.

6
задан Baptiste Wicht 4 March 2012 в 20:13
поделиться