<?php
function hsum($a, $b, $p) {
    $hs = $a ^ $b;
    $hp = $a & $b;
    $p <<= 1;
    return [$hs ^ $p, $hp | ($hs & $p)];
}

function hsum_rec($a, $b, $p) {
    list($s, $newp) = hsum($a, $b, $p);
    if ($newp == $p) {
        return [$s, $newp];
    } else {
        return hsum_rec($a, $b, $newp);
    }
}

function sum2($a, $b) {
    list($s, $p) = hsum_rec($a, $b, 0);
    return $s;
}

for($i = 0; $i < 16; $i++) {
    for($j = 0; $j < 16; $j++) {
        if(sum2($i,$j) != $i + $j) {
            $k = sum2($i,$j);
            echo "Error: $i, $j, $k\n";
        }
    }
}