%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