| %default {"is_double":"1","nanval":"1"} |
| %verify "executed" |
| %verify "basic lt, gt, eq" |
| %verify "left arg NaN" |
| %verify "right arg NaN" |
| /* float/double_cmp[gl] vAA, vBB, vCC */ |
| movzbl 3(rPC),%eax # eax<- CC |
| movzbl 2(rPC),%ecx # ecx<- BB |
| .if $is_double |
| fldl (rFP,%eax,4) |
| fldl (rFP,%ecx,4) |
| .else |
| flds (rFP,%eax,4) |
| flds (rFP,%ecx,4) |
| .endif |
| movzbl rINST_HI,rINST_FULL |
| xorl %ecx,%ecx |
| fucompp # z if equal, p set if NaN, c set if st0 < st1 |
| fnstsw %ax |
| sahf |
| movl rINST_FULL,%eax |
| FETCH_INST_WORD(2) |
| jp .L${opcode}_isNaN |
| je .L${opcode}_finish |
| sbbl %ecx,%ecx |
| jb .L${opcode}_finish |
| incl %ecx |
| .L${opcode}_finish: |
| SET_VREG(%ecx,%eax) |
| ADVANCE_PC(2) |
| GOTO_NEXT |
| %break |
| |
| .L${opcode}_isNaN: |
| movl $$$nanval,%ecx |
| jmp .L${opcode}_finish |