Last active
March 26, 2022 04:22
-
-
Save runer112/0956ea93d0a690fc67626353600cbf3f to your computer and use it in GitHub Desktop.
EZ80 implementation of roundf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
assume adl=1 | |
section .text | |
public _roundf | |
_roundf: | |
; exponent_biased >= 0 && exponent_biased < 256 | |
; && exponent_biased = exponent + 127 | |
; = exponent + 127 >= 0 && exponent + 127 < 256 | |
; = exponent >= -127 && exponent < 129 | |
ld hl, 6 | |
add hl, sp ; uhl = (char*)&arg + 3 | |
ld e, (hl) | |
dec hl | |
ld d, (hl) ; d = exponent + 127 << 7 | fraction >> 16 | |
dec hl | |
dec hl | |
ld hl, (hl) ; euhl = arg | |
ld a, e ; a = sign << 7 | exponent + 127 >> 1 | |
inc a ; a = (sign << 7 | exponent + 127 >> 1) + 1 | |
; = (sign << 7) + (exponent + 127 >> 1) + 1 | |
; = (sign << 7) + (exponent + 129 >> 1) | |
add a, a ; a = (sign << 7) + (exponent + 129 >> 1) << 1 | |
; = (sign << 8) + (exponent + 129 & ~1) | |
; = exponent + 129 & ~1 | |
; sf = (exponent + 129 & ~1 & 0x80) != 0 | |
; = (exponent + 129 & 0x80) != 0 | |
; = (exponent + 1 + 0x80 & 0x80) != 0 | |
; = (exponent + 1 & 0x80 ^ 0x80) != 0 | |
; = (exponent + 1 & 0x80) != 0x80 | |
; = (exponent + 1 & 0x80) == 0 | |
; && exponent >= -127 && exponent < 129 | |
; = exponent >= -1 && exponent < 127 | |
; zf = (exponent + 129 & ~1) == 0 | |
; && exponent >= -127 && exponent < 129 | |
; = exponent == 127 || exponent = 128 | |
; cf = ((sign << 7) + (exponent + 129 >> 1) & 0xFF) << 1 >> 8 != 0 | |
; = ((sign << 7) + (exponent + 129 >> 1) & 0xFF) >> 7 != 0 | |
; = ((sign << 7) + (exponent + 129 >> 1) >> 7 & 1) != 0 | |
; = (sign + (exponent + 129 >> 8) & 1) != 0 | |
; = (sign & 1) != 0 ^ (exponent + 129 >> 8 & 1) != 0 | |
; && (sign == 0 || sign == 1) | |
; && exponent >= -127 && exponent < 129 | |
; = sign != 0 ^ (exponent == 127 || exponent == 128) | |
jp p, .special | |
; exponent >= -1 && exponent < 127 | |
sub a, 129 + 23 ; a = (exponent + 129 & ~1) - 129 - 23 | |
; = exponent - 23 & ~1 | |
; cf = (exponent - 23 & ~1 & 0x100) != 0 | |
; = (exponent - 23 & 0x100) != 0 | |
; && exponent >= -1 && exponent < 127 | |
; = exponent < 23 | |
ret nc | |
; exponent >= 1 && exponent < 23 | |
rrca ; a = (exponent - 23 & ~1) << 7 | (exponent - 23 & ~1) >> 1 | |
; = (exponent - 23 & ~1) << 7 | exponent - 23 >> 1 | |
rrca ; a = (exponent - 23 & ~1) << 6 | exponent - 23 >> 2 | |
; cf = ((exponent - 23 & ~1) << 7 | exponent - 23 >> 1) & 1 != 0 | |
; = ((exponent - 23 & ~1) << 7 & 1 | exponent - 23 >> 1 & 1) != 0 | |
; = (exponent - 23 >> 1 & 1) != 0 | |
; = (exponent - 23 & 1 << 1) != 0 | |
jr nc, .shift_bit_1_unset | |
rrca ; a = (exponent - 23 & ~1) << 5 | exponent - 23 >> 3 | |
; cf = ((exponent - 23 & ~1) << 6 | exponent - 23 >> 2) & 1 != 0 | |
; = ((exponent - 23 & ~1) << 6 & 1 | exponent - 23 >> 2 & 1) != 0 | |
; = (exponent - 23 >> 2 & 1) != 0 | |
; = (exponent - 23 & 1 << 2) != 0 | |
ld bc, 1 shl (8 + 8 - 1 - 2) | |
jr nc, .shift_bits_2_1_done | |
ld b, 1 shl (8 - 1 - 2 - 4) | |
jr .shift_bits_2_1_done | |
.shift_bit_1_unset: | |
rrca ; a = (exponent - 23 & ~1) << 5 | exponent - 23 >> 3 | |
; cf = ((exponent - 23 & ~1) << 6 | exponent - 23 >> 2) & 1 != 0 | |
; = ((exponent - 23 & ~1) << 6 & 1 | exponent - 23 >> 2 & 1) != 0 | |
; = (exponent - 23 >> 2 & 1) != 0 | |
; = (exponent - 23 & 1 << 2) != 0 | |
ld bc, 1 shl (8 + 8 - 1) | |
jr nc, .shift_bits_2_1_done | |
ld b, 1 shl (8 - 1 - 4) | |
.shift_bits_2_1_done: ; ubc = 1 << 8 + 8 - 1 - 2 * ((exponent - 23 & 1 << 1) != 0) - 4 * ((exponent - 23 & 1 << 2) != 0) | |
; = 1 << 15 - (exponent - 23 & 1 << 1) - (exponent - 23 & 1 << 2) | |
; = 1 << 15 - (exponent - 23 & (1 << 2 | 1 << 1)) | |
bit 7, d ; zf = (exponent + 127 & 1) == 0 | |
; = (exponent - 23 & 1) == 0 | |
jr z, .shift_done | |
rrc b | |
.shift_done: ; ubc = 1 << 15 - (exponent - 23 & (1 << 2 | 1 << 1)) >> !((exponent - 23 & 1) == 0) | |
; = 1 << 15 - (exponent - 23 & (1 << 2 | 1 << 1)) >> (exponent - 23 & 1) | |
; = 1 << 15 - (exponent - 23 & (1 << 2 | 1 << 1)) - (exponent - 23 & 1) | |
; = 1 << 15 - (exponent - 23 & (1 << 2 | 1 << 1 | 1)) | |
; = 1 << 15 - (exponent - 23 & 7) | |
rrca ; a = (exponent - 23 & ~1) << 4 | exponent - 23 >> 4 | |
; cf = ((exponent - 23 & ~1) << 5 | exponent - 23 >> 3) & 1 != 0 | |
; = ((exponent - 23 & ~1) << 5 & 1 | exponent - 23 >> 3 & 1) != 0 | |
; = (exponent - 23 >> 3 & 1) != 0 | |
; = (exponent - 23 & 1 << 3) != 0 | |
; && exponent >= 1 && exponent < 23 | |
; = (exponent >= -1 && exponent < 7) || (exponent >= 15 && exponent < 23) | |
jr nc, .round_2_bytes | |
; (exponent >= -1 && exponent < 7) || (exponent >= 15 && exponent < 23) | |
rrca ; a = (exponent - 23 & ~1) << 3 | exponent - 23 >> 5 | |
; cf = ((exponent - 23 & ~1) << 4 | exponent - 23 >> 4) & 1 != 0 | |
; = ((exponent - 23 & ~1) << 4 & 1 | exponent - 23 >> 4 & 1) != 0 | |
; = (exponent - 23 >> 4 & 1) != 0 | |
; = (exponent - 23 & 1 << 4) != 0 | |
; && (exponent >= -1 && exponent < 7) || (exponent >= 15 && exponent < 23) | |
; = exponent >= 15 && exponent < 23 | |
jr c, .round_1_byte | |
.round_3_bytes: | |
; exponent >= -1 && exponent < 7 | |
; b = 1 << 7 - (exponent - 23 & 7) | |
; && exponent >= -1 && exponent < 7 | |
; = 1 << 7 - (exponent + 1) | |
; = 1 << 6 - exponent | |
ld a, d ; ea = arg >> 16 | |
add a, b | |
jr nc, .round_3_bytes_add_done | |
inc e | |
.round_3_bytes_add_done: | |
ld h, a ; eh = (arg >> 16) + (1 << 6 - exponent) | |
xor a, a | |
sub a, b ; a = -(1 << 6 - exponent) | |
; = -1 << 6 - exponent | |
add a, a ; a = -1 << 6 - exponent << 1 | |
; = -1 << 7 - exponent | |
or a, 1 shl 7 ; a = -1 << 7 - exponent | 1 << 7 | |
; && exponent >= -1 && exponent < 7 | |
; = exponent == -1 ? -1 << 8 | 1 << 7 : -1 << 7 - exponent | 1 << 7 | |
; = exponent == -1 ? -1 << 7 : -1 << 7 - exponent | |
; = -1 << 7 - (exponent == -1) - exponent | |
and a, h ; a = (arg >> 16) + (1 << 6 - exponent) & -1 << 7 - (exponent == -1) - exponent | |
push af | |
dec sp | |
pop hl ; e[hlu] = (arg >> 16) + (1 << 6 - exponent) & -1 << 7 - (exponent == -1) - exponent | |
inc sp | |
ld h, c | |
ld l, c ; euhl = arg + (1 << 22 - exponent) & -1 << 23 - (exponent == -1) - exponent | |
ret | |
.round_2_bytes: | |
; exponent >= 7 && exponent < 15 | |
; b = 1 << 7 - (exponent - 23 & 7) | |
; && exponent >= 7 && exponent < 15 | |
; = 1 << 7 - (exponent - 7) | |
; = 1 << 14 - exponent | |
; ubc = 1 << 22 - exponent | |
xor a, a | |
add hl, bc | |
adc a, e | |
ld e, a ; euhl = arg + (1 << 22 - exponent) | |
xor a, a | |
sub a, b ; a = -(1 << 14 - exponent) | |
; = -1 << 14 - exponent | |
add a, a ; a = -1 << 14 - exponent << 1 | |
; = -1 << 15 - exponent | |
and a, h ; a = arg >> 8 & -1 << 15 - exponent | |
ld h, a | |
ld l, c ; euhl = arg + (1 << 22 - exponent) & -1 << 23 - exponent | |
ret | |
.round_1_byte: | |
; exponent >= 15 && exponent < 23 | |
; b = 1 << 7 - (exponent - 23 & 7) | |
; && exponent >= 15 && exponent < 23 | |
; = 1 << 7 - (exponent - 15) | |
; = 1 << 22 - exponent | |
xor a, a | |
ld c, b | |
ld b, a ; ubc = 1 << 22 - exponent | |
add hl, bc | |
adc a, e | |
ld e, a ; euhl = arg + (1 << 22 - exponent) | |
xor a, a | |
sub a, c ; a = -(1 << 22 - exponent) | |
; = -1 << 22 - exponent | |
add a, a ; a = -1 << 22 - exponent << 1 | |
; = -1 << 23 - exponent | |
and a, l ; a = arg & -1 << 23 - exponent | |
ld l, a ; euhl = arg + (1 << 22 - exponent) & -1 << 23 - exponent | |
ret | |
.special: | |
; (exponent >= -127 && exponent < -1) || exponent == 127 || exponent = 128 | |
; zf = exponent == 127 || exponent = 128 | |
ret z | |
; exponent >= -127 && exponent < -1 | |
; cf = sign | |
ld e, 0 | |
rr e | |
sbc hl, hl ; euhl = sign << 31 | |
ret |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment