1 %default {"suff":"d","nanval":"pos"} 2 /* 3 * Compare two floating-point values. Puts 0, 1, or -1 into the 4 * destination register based on the results of the comparison. 5 * 6 * int compare(x, y) { 7 * if (x == y) { 8 * return 0; 9 * } else if (x < y) { 10 * return -1; 11 * } else if (x > y) { 12 * return 1; 13 * } else { 14 * return nanval ? 1 : -1; 15 * } 16 * } 17 */ 18 /* op vAA, vBB, vCC */ 19 movzbl 3(rPC), %ecx # ecx<- CC 20 movzbl 2(rPC), %eax # eax<- BB 21 movs${suff} VREG_ADDRESS(%eax), %xmm0 22 xor %eax, %eax 23 ucomis${suff} VREG_ADDRESS(%ecx), %xmm0 24 jp .L${opcode}_nan_is_${nanval} 25 je .L${opcode}_finish 26 jb .L${opcode}_less 27 .L${opcode}_nan_is_pos: 28 incl %eax 29 jmp .L${opcode}_finish 30 .L${opcode}_nan_is_neg: 31 .L${opcode}_less: 32 decl %eax 33 .L${opcode}_finish: 34 SET_VREG %eax, rINST 35 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 36