File: IntWidth.pm6

package info (click to toggle)
moarvm 2020.12%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 18,652 kB
  • sloc: ansic: 268,178; perl: 8,186; python: 1,316; makefile: 768; sh: 287
file content (39 lines) | stat: -rw-r--r-- 1,077 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sub int-bitwidth (Int:D $int) is export {
    my $sign = $int < 0 ?? -1 !! 1;
    my $abs = abs($int);
    ($abs-1).base(2).chars + 1;
}
sub uint-bitwidth (Int:D $int) is export {
    die "Can't determine the bitwidth of negative integer: '$int'" if $int < 0;
    $int.base(2).chars;
}
multi sub getType (Int:D :$max, Int:D :$min) {
    die if $min.defined && $max < $min;
    my Bool $has-neg = $max < 0;
    $has-neg ||= $min < 0;
    my $bw1;
    if ($has-neg) {
        $bw1 = int-bitwidth($max);
        $bw1 = min($bw1, int-bitwidth($min)) if defined $min;
    }
    else {
        $bw1 = uint-bitwidth($max);
        $bw1 = min($bw1, uint-bitwidth($min)) if defined $min;
    }
    return getType($bw1, :isSigned($has-neg));
}
multi sub getType (UInt:D $bitwidth, Bool:D :$isSigned = True) {
    if ($bitwidth <= 8) {
        return "MVMint8";
    }
    elsif ($bitwidth <= 16) {
        return "MVMint16";
    }
    elsif ($bitwidth <= 32) {
        return "MVMint32";
    }
    elsif ($bitwidth <= 64) {
        return "MVMint64";
    }
}
getType(:min(-10), :max(0));