| %verify "endianess" |
| /* |
| * Compare two 64-bit values |
| * x = y return 0 |
| * x < y return -1 |
| * x > y return 1 |
| * |
| * I think I can improve on the ARM code by the following observation |
| * slt t0, x.hi, y.hi; # (x.hi < y.hi) ? 1:0 |
| * sgt t1, x.hi, y.hi; # (y.hi > x.hi) ? 1:0 |
| * subu v0, t0, t1 # v0= -1:1:0 for [ < > = ] |
| * |
| * This code assumes the register pair ordering will depend on endianess (a1:a0 or a0:a1). |
| * a1:a0 => vBB |
| * a3:a2 => vCC |
| */ |
| /* cmp-long vAA, vBB, vCC */ |
| slt t0, rARG1, rARG3 # compare hi |
| sgt t1, rARG1, rARG3 |
| subu v0, t1, t0 # v0<- (-1,1,0) |
| bnez v0, .L${opcode}_finish |
| # at this point x.hi==y.hi |
| sltu t0, rARG0, rARG2 # compare lo |
| sgtu t1, rARG0, rARG2 |
| subu v0, t1, t0 # v0<- (-1,1,0) for [< > =] |
| .L${opcode}_finish: |
| RETURN |