blob: 5f9eef9d097c641cbcb6dc33344f712e2bc05bf1 [file] [log] [blame]
%default {"suff":"d","nanval":"pos"}
/*
* Compare two floating-point values. Puts 0, 1, or -1 into the
* destination register based on the results of the comparison.
*
* int compare(x, y) {
* if (x == y) {
* return 0;
* } else if (x < y) {
* return -1;
* } else if (x > y) {
* return 1;
* } else {
* return nanval ? 1 : -1;
* }
* }
*/
/* op vAA, vBB, vCC */
movzbl 3(rPC), %ecx # ecx<- CC
movzbl 2(rPC), %eax # eax<- BB
movs${suff} VREG_ADDRESS(%eax), %xmm0
xor %eax, %eax
ucomis${suff} VREG_ADDRESS(%ecx), %xmm0
jp .L${opcode}_nan_is_${nanval}
je .L${opcode}_finish
jb .L${opcode}_less
.L${opcode}_nan_is_pos:
incl %eax
jmp .L${opcode}_finish
.L${opcode}_nan_is_neg:
.L${opcode}_less:
decl %eax
.L${opcode}_finish:
SET_VREG %eax, rINST
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2