Nasm-X86 v20211013 Perl 5 v5.30.2 i686-linux-thread-multi-ld
- Status
- Pass
- From
- Chris Williams (BINGOS)
- Dist
-
Nasm-X86 v20211013
- Platform
- Perl 5 v5.30.2 i686-linux-thread-multi-ld
- Date
- 2021-10-17 00:30:17
- ID
- 67690c7a-2ee1-11ec-bc66-57723b537541
This distribution has been tested as part of the CPAN Testers
project, supporting the Perl programming language. See
http://wiki.cpantesters.org/ for more information or email
questions to cpan-testers-discuss@perl.org
--
Dear PRBRENAN,
This is a computer-generated error report created automatically by
CPANPLUS, version 0.9912. Testers personal comments may appear
at the end of this report.
Thank you for uploading your work to CPAN. Congratulations!
All tests were successful.
TEST RESULTS:
Below is the error stack from stage 'make test':
Unable to confirm presence of command: nasm
at /home/cpan/pit/jail/dd_QL6cCln/lib/perl5/Data/Table/Text.pm line 4787, <DATA> line 4628.
Data::Table::Text::confirmHasCommandLineCommand("nasm") called at (eval 485) line 11
eval 'use Time::HiRes qw(time);
use Test::Most;
bail_on_fail;
my $localTest = ((caller(1))[0]//\'Nasm::X86\') eq "Nasm::X86"; # Local testing mode
Test::More->builder->output("/dev/null") if $localTest; # Reduce number of confirmation messages during testing
if ($^O =~ m(bsd|linux|cygwin)i) # Supported systems
{if (confirmHasCommandLineCommand(q(nasm)) and LocateIntelEmulator) # Network assembler and Intel Software Development emulator
{plan tests => 157;
}
else
{plan skip_all => qq(Nasm or Intel 64 emulator not available);
}
}
else
{plan skip_all => qq(Not supported on: $^O);
}
my $start = time; # Tests
eval {goto latest} if !caller(0) and -e "/home/phil"; # Go to latest test if specified
if (1) { #TPrintOutStringNL #TPrintErrStringNL #TAssemble
PrintOutStringNL "Hello World";
PrintOutStringNL "Hello\\nWorld";
PrintErrStringNL "Hello World";
ok Assemble(debug => 0, eq => <<END);
Hello World
Hello
World
END
}
if (1) { #TMov #TComment #TRs #TPrintOutMemory #TExit
Comment "Print a string from memory";
my $s = "Hello World";
Mov rax, Rs($s);
Mov rdi, length $s;
PrintOutMemory;
Exit(0);
ok Assemble =~ m(Hello World);
}
if (1) { #TPrintOutMemoryNL #TCstrlen
my $s = Rs("Hello World\\n\\nHello Skye");
Mov rax, $s;
Cstrlen;
Mov rdi, r15;
PrintOutMemoryNL;
ok Assemble(debug => 0, eq => <<END);
Hello World
Hello Skye
END
}
if (1) { #TPrintOutRaxInHex #TPrintOutNL #TPrintOutString
my $q = Rs(\'abababab\');
Mov(rax, "[$q]");
PrintOutString "rax: ";
PrintOutRaxInHex;
PrintOutNL;
Xor rax, rax;
PrintOutString "rax: ";
PrintOutRaxInHex;
PrintOutNL;
ok Assemble =~ m(rax: 6261 6261 6261 6261.*rax: 0000 0000 0000 0000)s;
}
if (1) { #TPrintOutRegistersInHex #TRs
my $q = Rs(\'abababab\');
Mov(rax, 1);
Mov(rbx, 2);
Mov(rcx, 3);
Mov(rdx, 4);
Mov(r8, 5);
Lea r9, "[rax+rbx]";
PrintOutRegistersInHex;
my $r = Assemble;
ok $r =~ m( r8: 0000 0000 0000 0005.* r9: 0000 0000 0000 0003.*rax: 0000 0000 0000 0001)s;
ok $r =~ m(rbx: 0000 0000 0000 0002.*rcx: 0000 0000 0000 0003.*rdx: 0000 0000 0000 0004)s;
}
if (1) { #TDs TRs
my $q = Rs(\'a\'..\'z\');
Mov rax, Ds(\'0\'x64); # Output area
Vmovdqu32(xmm0, "[$q]"); # Load
Vprolq (xmm0, xmm0, 32); # Rotate double words in quad words
Vmovdqu32("[rax]", xmm0); # Save
Mov rdi, 16;
PrintOutMemory;
ok Assemble =~ m(efghabcdmnopijkl)s;
}
if (1) {
my $q = Rs((\'a\'..\'p\')x2);
Mov rax, Ds(\'0\'x64);
Vmovdqu32(ymm0, "[$q]");
Vprolq (ymm0, ymm0, 32);
Vmovdqu32("[rax]", ymm0);
Mov rdi, 32;
PrintOutMemory;
ok Assemble =~ m(efghabcdmnopijklefghabcdmnopijkl)s;
}
if (1) {
my $q = Rs my $s = join \'\', (\'a\'..\'p\')x4; # Sample string
Mov rax, Ds(\'0\'x128);
Vmovdqu64 zmm0, "[$q]"; # Load zmm0 with sample string
Vprolq zmm1, zmm0, 32; # Rotate left 32 bits in lanes
Vmovdqu64 "[rax]", zmm1; # Save results
Mov rdi, length $s; # Print results
PrintOutMemoryNL;
is_deeply "$s\\n", <<END; # Initial string
abcdefghijklmnopabcdefghijklmnopabcdefghijklmnopabcdefghijklmnop
END
ok Assemble(debug => 0, eq => <<END); # Assemble and run
efghabcdmnopijklefghabcdmnopijklefghabcdmnopijklefghabcdmnopijkl
END
}
if (1) { #TPrintOutRegisterInHex
my $q = Rs((\'a\'..\'p\')x4);
Mov r8,"[$q]";
PrintOutRegisterInHex r8;
ok Assemble(debug => 0, eq => <<END);
r8: 6867 6665 6463 6261
END
}
if (1) {
my $q = Rs(\'a\'..\'p\');
Vmovdqu8 xmm0, "[$q]";
PrintOutRegisterInHex xmm0;
ok Assemble =~ m(xmm0: 706F 6E6D 6C6B 6A69 6867 6665 6463 6261)s;
}
if (1) {
my $q = Rs(\'a\'..\'p\', \'A\'..\'P\', );
Vmovdqu8 ymm0, "[$q]";
PrintOutRegisterInHex ymm0;
ok Assemble =~ m(ymm0: 504F 4E4D 4C4B 4A49 4847 4645 4443 4241 706F 6E6D 6C6B 6A69 6867 6665 6463 6261)s;
}
if (1) {
my $q = Rs((\'a\'..\'p\', \'A\'..\'P\') x 2);
Vmovdqu8 zmm0, "[$q]";
PrintOutRegisterInHex zmm0;
ok Assemble =~ m(zmm0: 504F 4E4D 4C4B 4A49 4847 4645 4443 4241 706F 6E6D 6C6B 6A69 6867 6665 6463 6261 504F 4E4D 4C4B 4A49 4847 4645 4443 4241 706F 6E6D 6C6B 6A69 6867 6665 6463 6261)s;
}
if (1) { #TNasm::X86::Variable::copyZF #TNasm::X86::Variable::copyZFInverted
Mov r15, 1;
my $z = V(zf);
Cmp r15, 1; $z->copyZF; $z->outNL;
Cmp r15, 2; $z->copyZF; $z->outNL;
Cmp r15, 1; $z->copyZFInverted; $z->outNL;
Cmp r15, 2; $z->copyZFInverted; $z->outNL;
ok Assemble(debug => 0, eq => <<END);
zf: 0000 0000 0000 0001
zf: 0000 0000 0000 0000
zf: 0000 0000 0000 0000
zf: 0000 0000 0000 0001
END
}
if (1) { #TAllocateMemory #TNasm::X86::Variable::freeMemory
my $N = V(size, 2048);
my $q = Rs(\'a\'..\'p\');
AllocateMemory($N, my $address = V(address));
Vmovdqu8 xmm0, "[$q]";
$address->setReg(rax);
Vmovdqu8 "[rax]", xmm0;
Mov rdi, 16;
PrintOutMemory;
PrintOutNL;
FreeMemory(address => $address, size=> $N);
ok Assemble(debug => 0, eq => <<END);
abcdefghijklmnop
END
}
if (1) { #TReadTimeStampCounter
for(1..10)
{ReadTimeStampCounter;
PrintOutRegisterInHex rax;
}
my @s = split /\\n/, Assemble;
my @S = sort @s;
is_deeply \\@s, \\@S;
}
#latest:
if (1) { #TIf
my $c = K(one,1);
If ($c == 0,
Then
{PrintOutStringNL "1 == 0";
},
Else
{PrintOutStringNL "1 != 0";
});
ok Assemble(debug => 0, eq => <<END);
1 != 0
END
}
if (1) { #TIfNz
Mov rax, 0;
Test rax,rax;
IfNz
Then
{PrintOutRegisterInHex rax;
},
Else
{PrintOutRegisterInHex rbx;
};
Mov rax, 1;
Test rax,rax;
IfNz
Then
{PrintOutRegisterInHex rcx;
},
Else
{PrintOutRegisterInHex rdx;
};
ok Assemble =~ m(rbx.*rcx)s;
}
if (1) { #TFork #TGetPid #TGetPPid #TWaitPid
Fork; # Fork
Test rax,rax;
IfNz # Parent
Then
{Mov rbx, rax;
WaitPid;
GetPid; # Pid of parent as seen in parent
Mov rcx,rax;
PrintOutRegisterInHex rax, rbx, rcx;
},
Else # Child
{Mov r8,rax;
GetPid; # Child pid as seen in child
Mov r9,rax;
GetPPid; # Parent pid as seen in child
Mov r10,rax;
PrintOutRegisterInHex r8, r9, r10;
};
my $r = Assemble;
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
if ($r =~ m(r8:( 0000){4}.*r9:(.*)\\s{5,}r10:(.*)\\s{5,}rax:(.*)\\s{5,}rbx:(.*)\\s{5,}rcx:(.*)\\s{2,})s)
{ok $2 eq $4;
ok $2 eq $5;
ok $3 eq $6;
ok $2 gt $6;
}
}
if (1) { #TGetUid
GetUid; # Userid
PrintOutRegisterInHex rax;
my $r = Assemble;
ok $r =~ m(rax:( 0000){3});
}
if (1) { #TStatSize
Mov rax, Rs($0); # File to stat
StatSize; # Stat the file
PrintOutRegisterInHex rax;
my $r = Assemble =~ s( ) ()gsr;
if ($r =~ m(rax:([0-9a-f]{16}))is) # Compare file size obtained with that from fileSize()
{is_deeply $1, sprintf("%016X", fileSize($0));
}
}
if (1) { #TOpenRead #TCloseFile #TOpenWrite
Mov rax, Rs($0); # File to read
OpenRead; # Open file
PrintOutRegisterInHex rax;
CloseFile; # Close file
PrintOutRegisterInHex rax;
Mov rax, Rs(my $f = "zzzTemporaryFile.txt"); # File to write
OpenWrite; # Open file
CloseFile; # Close file
ok Assemble(debug => 0, eq => <<END);
rax: 0000 0000 0000 0003
rax: 0000 0000 0000 0000
END
ok -e $f; # Created file
unlink $f;
}
if (1) { #TFor
For
{my ($start, $end, $next) = @_;
Cmp rax, 3;
Jge $end;
PrintOutRegisterInHex rax;
} rax, 16, 1;
ok Assemble(debug => 0, eq => <<END);
rax: 0000 0000 0000 0000
rax: 0000 0000 0000 0001
rax: 0000 0000 0000 0002
END
}
if (1) { #TAndBlock #TFail
Mov rax, 1; Mov rdx, 2;
AndBlock
{my ($fail, $end, $start) = @_;
Cmp rax, 1;
Jne $fail;
Cmp rdx, 2;
Jne $fail;
PrintOutStringNL "Pass";
}
Fail
{my ($end, $fail, $start) = @_;
PrintOutStringNL "Fail";
};
ok Assemble(debug => 0, eq => <<END);
Pass
END
}
if (1) { #TOrBlock #TPass
Mov rax, 1;
OrBlock
{my ($pass, $end, $start) = @_;
Cmp rax, 1;
Je $pass;
Cmp rax, 2;
Je $pass;
PrintOutStringNL "Fail";
}
Pass
{my ($end, $pass, $start) = @_;
PrintOutStringNL "Pass";
};
ok Assemble(debug => 0, eq => <<END);
Pass
END
}
if (1) { #TPrintOutRaxInReverseInHex #TPrintOutMemoryInHex
Mov rax, 0x07654321;
Shl rax, 32;
Or rax, 0x07654321;
PushR rax;
PrintOutRaxInHex;
PrintOutNL;
PrintOutRaxInReverseInHex;
PrintOutNL;
Mov rax, rsp;
Mov rdi, 8;
PrintOutMemoryInHex;
PrintOutNL;
PopR rax;
Mov rax, 4096;
PushR rax;
Mov rax, rsp;
Mov rdi, 8;
PrintOutMemoryInHex;
PrintOutNL;
PopR rax;
ok Assemble(debug => 0, eq => <<END);
0765 4321 0765 4321
2143 6507 2143 6507
2143 6507 2143 6507
0010 0000 0000 0000
END
}
if (1) { #TPushR #TPopR
Mov rax, 0x11111111;
Mov rbx, 0x22222222;
PushR my @save = (rax, rbx);
Mov rax, 0x33333333;
PopR;
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
ok Assemble(debug => 0, eq => <<END);
rax: 0000 0000 1111 1111
rbx: 0000 0000 2222 2222
END
}
#latest:;
if (1) { #TClearMemory
K(loop, 8+1)->for(sub
{my ($index, $start, $next, $end) = @_;
$index->setReg(r15);
Push r15;
});
Mov rax, rsp;
Mov rdi, 8*9;
PrintOutMemoryInHexNL;
ClearMemory(K(size, 8*9), V(address, rax));
PrintOutMemoryInHexNL;
ok Assemble(debug => 0, eq => <<END);
0800 0000 0000 00000700 0000 0000 00000600 0000 0000 00000500 0000 0000 00000400 0000 0000 00000300 0000 0000 00000200 0000 0000 00000100 0000 0000 00000000 0000 0000 0000
0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
#latest:;
if (1) { #TAllocateMemory #TFreeMemory #TClearMemory
my $N = V(size, 4096); # Size of the initial allocation which should be one or more pages
AllocateMemory($N, my $A = V(address));
ClearMemory($N, $A);
$A->setReg(rax);
Mov rdi, 128;
PrintOutMemoryInHexNL;
FreeMemory($N, $A);
ok Assemble(debug => 1, eq => <<END);
0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
if (1) { #TCall #TS
Mov rax, 0x44332211;
PrintOutRegisterInHex rax;
my $s = Macro
{PrintOutRegisterInHex rax;
Inc rax;
PrintOutRegisterInHex rax;
};
Call $s;
PrintOutRegisterInHex rax;
my $r = Assemble;
ok $r =~ m(0000 0000 4433 2211.*2211.*2212.*0000 0000 4433 2212)s;
}
#latest:;
if (1) { #TReadFile #TPrintMemory
my $file = G(file, Rs($0));
my $size = G(size);
my $address = G(address);
ReadFile $file, $size, $address; # Read file
$address->setReg(rax); # Address of file in memory
$size ->setReg(rdi); # Length of file in memory
PrintOutMemory; # Print contents of memory to stdout
my $r = Assemble; # Assemble and execute
ok stringMd5Sum($r) eq fileMd5Sum($0); # Output contains this file
}
#latest:;
if (1) { #TCreateArena #TArena::clear #TArena::out #TArena::copy #TArena::nl
my $a = CreateArena;
$a->q(\'aa\');
$a->out;
PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
aa
END
}
if (1) { #TCreateArena #TArena::clear #TArena::out #TArena::copy #TArena::nl
my $a = CreateArena;
my $b = CreateArena;
$a->q(\'aa\');
$b->q(\'bb\');
$a->out;
PrintOutNL;
$b->out;
PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
aa
bb
END
}
if (1) { #TCreateArena #TArena::clear #TArena::out #TArena::copy #TArena::nl
my $a = CreateArena;
my $b = CreateArena;
$a->q(\'aa\');
$a->q(\'AA\');
$a->out;
PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
aaAA
END
}
if (1) { #TCreateArena #TArena::clear #TArena::out #TArena::copy #TArena::nl
my $a = CreateArena;
my $b = CreateArena;
$a->q(\'aa\');
$b->q(\'bb\');
$a->q(\'AA\');
$b->q(\'BB\');
$a->q(\'aa\');
$b->q(\'bb\');
$a->out;
$b->out;
PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
aaAAaabbBBbb
END
}
if (1) { #TCreateArena #TArena::length #TArena::clear #TArena::out #TArena::copy #TArena::nl
my $a = CreateArena;
$a->q(\'ab\');
my $b = CreateArena;
$b->append($a);
$b->append($a);
$a->append($b);
$b->append($a);
$a->append($b);
$b->append($a);
$b->append($a);
$b->append($a);
$b->append($a);
$a->out; PrintOutNL; # Print arena
$b->out; PrintOutNL; # Print arena
my $sa = $a->length; $sa->outNL;
my $sb = $b->length; $sb->outNL;
$a->clear;
my $sA = $a->length; $sA->outNL;
my $sB = $b->length; $sB->outNL;
ok Assemble(debug => 0, eq => <<END);
abababababababab
ababababababababababababababababababababababababababababababababababababab
size: 0000 0000 0000 0010
size: 0000 0000 0000 004A
size: 0000 0000 0000 0000
size: 0000 0000 0000 004A
END
}
if (1) { #TReorderSyscallRegisters #TUnReorderSyscallRegisters
Mov rax, 1; Mov rdi, 2; Mov rsi, 3; Mov rdx, 4;
Mov r8, 8; Mov r9, 9; Mov r10, 10; Mov r11, 11;
ReorderSyscallRegisters r8,r9; # Reorder the registers for syscall
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rdi;
UnReorderSyscallRegisters r8,r9; # Unreorder the registers to recover their original values
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rdi;
ok Assemble =~ m(rax:.*08.*rdi:.*9.*rax:.*1.*rdi:.*2.*)s;
}
if (1) { # Mask register instructions #TClearRegisters
Mov rax,1;
Kmovq k0, rax;
Kaddb k0, k0, k0;
Kaddb k0, k0, k0;
Kaddb k0, k0, k0;
Kmovq rax, k0;
PushR k0;
ClearRegisters k0;
Kmovq k1, k0;
PopR k0;
PrintOutRegisterInHex k0;
PrintOutRegisterInHex k1;
ok Assemble =~ m(k0: 0000 0000 0000 0008.*k1: 0000 0000 0000 0000)s;
}
if (1) { # Count leading zeros
Mov rax, 8; # Append a constant to the arena
Lzcnt rax, rax; # New line
PrintOutRegisterInHex rax;
Mov rax, 8; # Append a constant to the arena
Tzcnt rax, rax; # New line
PrintOutRegisterInHex rax;
ok Assemble =~ m(rax: 0000 0000 0000 003C.*rax: 0000 0000 0000 0003)s;
}
if (1) { #TArena::nl
my $s = CreateArena;
$s->q("A");
$s->nl;
$s->q("B");
$s->out;
PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
A
B
END
}
#latest:;
if (1) { # Print this file #TArena::read #TArena::z #TArena::q
my $s = CreateArena; # Create a string
$s->read(K(file, Rs($0)));
$s->out;
my $r = Assemble(emulator => 0);
is_deeply stringMd5Sum($r), fileMd5Sum($0); # Output contains this file
}
if (1) { # Print rdi in hex into an arena #TGetPidInHex
GetPidInHex;
PrintOutRegisterInHex rax;
ok Assemble =~ m(rax: 00);
}
if (1) { # Execute the content of an arena #TexecuteFileViaBash #TArena::write #TArena::out #TunlinkFile #TArena::ql
my $s = CreateArena; # Create a string
$s->ql(<<END); # Write code to execute
#!/usr/bin/bash
whoami
ls -la
pwd
END
$s->write (my $f = V(\'file\', Rs("zzz.sh"))); # Write code to a file
executeFileViaBash($f); # Execute the file
unlinkFile ($f); # Delete the file
my $u = qx(whoami); chomp($u);
ok Assemble(emulator => 0) =~ m($u); # The Intel Software Development Emulator is way too slow on these operations.
}
if (1) { # Make an arena readonly
my $s = CreateArena; # Create an arena
$s->q("Hello"); # Write code to arena
$s->makeReadOnly; # Make arena read only
$s->q(" World"); # Try to write to arena
ok Assemble(debug=>2) =~ m(SDE ERROR: DEREFERENCING BAD MEMORY POINTER.*mov byte ptr .rax.rdx.1., r8b);
}
if (1) { # Make a read only arena writable #TArena::makeReadOnly #TArena::makeWriteable
my $s = CreateArena; # Create an arena
$s->q("Hello"); # Write data to arena
$s->makeReadOnly; # Make arena read only - tested above
$s->makeWriteable; # Make arena writable again
$s->q(" World"); # Try to write to arena
$s->out;
ok Assemble =~ m(Hello World);
}
#latest:;
if (1) { # Allocate some space in arena #TArena::allocate
my $s = CreateArena; # Create an arena
my $o1 = $s->allocate(V(size, 0x20)); # Allocate space wanted
my $o2 = $s->allocate(V(size, 0x30));
my $o3 = $s->allocate(V(size, 0x10));
$o1->outNL;
$o2->outNL;
$o3->outNL;
ok Assemble(debug => 0, eq => <<END);
offset: 0000 0000 0000 0018
offset: 0000 0000 0000 0038
offset: 0000 0000 0000 0068
END
}
#latest:;
if (1) { #TNasm::X86::Arena::checkYggdrasilCreated #TNasm::X86::Arena::establishYggdrasil #TNasm::X86::Arena::firstFreeBlock #TNasm::X86::Arena::setFirstFreeBlock
my $A = CreateArena;
my $t = $A->checkYggdrasilCreated;
$t->found->outNL;
my $y = $A->establishYggdrasil;
my $T = $A->checkYggdrasilCreated;
$T->found->outNL;
my $f = $A->firstFreeBlock; $f->outNL;
$A->setFirstFreeBlock(V(\'first\', 0xcc));
my $F = $A->firstFreeBlock; $F->outNL;
ok Assemble(debug => 0, eq => <<END);
found: 0000 0000 0000 0000
found: 0000 0000 0000 0001
free: 0000 0000 0000 0000
free: 0000 0000 0000 00CC
END
}
# It is one of the happiest characteristics of this glorious country that official utterances are invariably regarded as unanswerable
#latest:;
if (1) { #TPrintOutZF #TSetZF #TClearZF #TIfC #TIfNc #TIfZ #IfNz
SetZF;
PrintOutZF;
ClearZF;
PrintOutZF;
SetZF;
PrintOutZF;
SetZF;
PrintOutZF;
ClearZF;
PrintOutZF;
SetZF;
IfZ Then {PrintOutStringNL "Zero"}, Else {PrintOutStringNL "NOT zero"};
ClearZF;
IfNz Then {PrintOutStringNL "NOT zero"}, Else {PrintOutStringNL "Zero"};
Mov r15, 5;
Shr r15, 1; IfC Then {PrintOutStringNL "Carry"} , Else {PrintOutStringNL "NO carry"};
Shr r15, 1; IfC Then {PrintOutStringNL "Carry"} , Else {PrintOutStringNL "NO carry"};
Shr r15, 1; IfNc Then {PrintOutStringNL "NO carry"}, Else {PrintOutStringNL "Carry"};
Shr r15, 1; IfNc Then {PrintOutStringNL "NO carry"}, Else {PrintOutStringNL "Carry"};
ok Assemble(debug => 0, eq => <<END);
ZF=1
ZF=0
ZF=1
ZF=1
ZF=0
Zero
NOT zero
Carry
NO carry
Carry
NO carry
END
}
if (1) { #TSetLabel #TRegisterSize #TSaveFirstFour #TSaveFirstSeven #TRestoreFirstFour #TRestoreFirstSeven #TRestoreFirstFourExceptRax #TRestoreFirstSevenExceptRax #TRestoreFirstFourExceptRaxAndRdi #TRestoreFirstSevenExceptRaxAndRdi #TReverseBytesInRax
Mov rax, 1;
Mov rdi, 1;
SaveFirstFour;
Mov rax, 2;
Mov rdi, 2;
SaveFirstSeven;
Mov rax, 3;
Mov rdi, 4;
PrintOutRegisterInHex rax, rdi;
RestoreFirstSeven;
PrintOutRegisterInHex rax, rdi;
RestoreFirstFour;
PrintOutRegisterInHex rax, rdi;
SaveFirstFour;
Mov rax, 2;
Mov rdi, 2;
SaveFirstSeven;
Mov rax, 3;
Mov rdi, 4;
PrintOutRegisterInHex rax, rdi;
RestoreFirstSevenExceptRax;
PrintOutRegisterInHex rax, rdi;
RestoreFirstFourExceptRax;
PrintOutRegisterInHex rax, rdi;
SaveFirstFour;
Mov rax, 2;
Mov rdi, 2;
SaveFirstSeven;
Mov rax, 3;
Mov rdi, 4;
PrintOutRegisterInHex rax, rdi;
RestoreFirstSevenExceptRaxAndRdi;
PrintOutRegisterInHex rax, rdi;
RestoreFirstFourExceptRaxAndRdi;
PrintOutRegisterInHex rax, rdi;
Bswap rax;
PrintOutRegisterInHex rax;
my $l = Label;
Jmp $l;
SetLabel $l;
ok Assemble(debug => 0, eq => <<END);
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0004
rax: 0000 0000 0000 0002
rdi: 0000 0000 0000 0002
rax: 0000 0000 0000 0001
rdi: 0000 0000 0000 0001
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0004
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0002
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0001
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0004
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0004
rax: 0000 0000 0000 0003
rdi: 0000 0000 0000 0004
rax: 0300 0000 0000 0000
END
ok 8 == RegisterSize rax;
}
if (1) { #TRb #TRd #TRq #TRw #TDb #TDd #TDq #TDw #TCopyMemory
my $s = Rb 0; Rb 1; Rw 2; Rd 3; Rq 4;
my $t = Db 0; Db 1; Dw 2; Dd 3; Dq 4;
Vmovdqu8 xmm0, "[$s]";
Vmovdqu8 xmm1, "[$t]";
PrintOutRegisterInHex xmm0;
PrintOutRegisterInHex xmm1;
Sub rsp, 16;
Mov rax, rsp; # Copy memory, the target is addressed by rax, the length is in rdi, the source is addressed by rsi
Mov rdi, 16;
Mov rsi, $s;
CopyMemory(V(source, rsi), V(target, rax), V(size, rdi));
PrintOutMemoryInHex;
my $r = Assemble;
ok $r =~ m(xmm0: 0000 0000 0000 0004 0000 0003 0002 0100);
ok $r =~ m(xmm1: 0000 0000 0000 0004 0000 0003 0002 0100);
ok $r =~ m(0001 0200 0300 00000400 0000 0000 0000);
}
#latest:
if (1) {
my $a = V(a,1);
my $b = V(b,2);
my $c = $a + $b;
Mov r15, 22;
$a->getReg(r15);
$b->copy($a);
$b = $b + 1;
$b->setReg(r14);
$a->outNL;
$b->outNL;
$c->outNL;
PrintOutRegisterInHex r14, r15;
ok Assemble(debug => 0, eq => <<END);
a: 0000 0000 0000 0016
(b add 1): 0000 0000 0000 0017
(a add b): 0000 0000 0000 0003
r14: 0000 0000 0000 0017
r15: 0000 0000 0000 0016
END
}
#latest:
if (1) { #TV #TK #TG #TNasm::X86::Variable::copy
my $s = Subroutine
{my ($p) = @_;
$$p{v}->copy($$p{v} + $$p{k} + $$p{g} + 1);
} [qw(v k g)], name => \'add\';
my $v = V(v, 1);
my $k = K(k, 2);
my $g = G(g, 3);
$s->call($v, $k, $g);
$v->outNL;
ok Assemble(debug => 0, eq => <<END);
v: 0000 0000 0000 0007
END
}
#latest:
if (1) { #TV #TK #TG #TNasm::X86::Variable::copy
my $g = G g, 0;
my $s = Subroutine
{my ($p) = @_;
$$p{g}->copy(K value, 1);
} [qw(g)], name => \'ref2\';
my $t = Subroutine
{my ($p) = @_;
$s->call($$p{g});
} [qw(g)], name => \'ref\';
$t->call($g);
$g->outNL;
ok Assemble(debug => 0, eq => <<END);
g: 0000 0000 0000 0001
END
}
#latest:
if (1) { #TSubroutine
my $g = G g, 3;
my $s = Subroutine
{my ($p, $s) = @_;
$g->copy($g - 1);
$g->outNL;
If ($g > 0,
Then
{$s->call;
});
} [], name => \'ref\';
$s->call;
ok Assemble(debug => 0, eq => <<END);
g: 0000 0000 0000 0002
g: 0000 0000 0000 0001
g: 0000 0000 0000 0000
END
}
if (1) { #TPrintOutTraceBack
my $d = V depth, 3; # Create a variable on the stack
my $s = Subroutine
{my ($p, $s) = @_; # Parameters, subroutine descriptor
PrintOutTraceBack;
my $d = $$p{depth}->copy($$p{depth} - 1); # Modify the variable referenced by the parameter
If ($d > 0,
Then
{$s->call($d); # Recurse
});
PrintOutTraceBack;
} [qw(depth)], name => \'ref\';
$s->call($d); # Call the subroutine
ok Assemble(debug => 0, eq => <<END);
Subroutine trace back, depth: 0000 0000 0000 0001
0000 0000 0000 0003 ref
Subroutine trace back, depth: 0000 0000 0000 0002
0000 0000 0000 0002 ref
0000 0000 0000 0002 ref
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0001 ref
0000 0000 0000 0001 ref
0000 0000 0000 0001 ref
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0000 ref
0000 0000 0000 0000 ref
0000 0000 0000 0000 ref
Subroutine trace back, depth: 0000 0000 0000 0002
0000 0000 0000 0000 ref
0000 0000 0000 0000 ref
Subroutine trace back, depth: 0000 0000 0000 0001
0000 0000 0000 0000 ref
END
}
#latest:
if (1) { #TSubroutine
my $g = G g, 2;
my $u = Subroutine
{my ($p, $s) = @_;
PrintOutTraceBack;
$$p{g}->copy(K gg, 1);
PrintOutTraceBack;
} [qw(g)], name => \'uuuu\';
my $t = Subroutine
{my ($p, $s) = @_;
$u->call($$p{g});
} [qw(g)], name => \'tttt\';
my $s = Subroutine
{my ($p, $s) = @_;
$t->call($$p{g});
} [qw(g)], name => \'ssss\';
$g->outNL;
$s->call($g);
$g->outNL;
ok Assemble(debug => 0, eq => <<END);
g: 0000 0000 0000 0002
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0002 uuuu
0000 0000 0000 0002 tttt
0000 0000 0000 0002 ssss
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0001 uuuu
0000 0000 0000 0001 tttt
0000 0000 0000 0001 ssss
g: 0000 0000 0000 0001
END
}
#latest:
if (1) { #TSubroutine
my $r = G r, 2;
my $u = Subroutine
{my ($p, $s) = @_;
PrintOutTraceBack;
$$p{u}->copy(K gg, 1);
PrintOutTraceBack;
} [qw(u)], name => \'uuuu\';
my $t = Subroutine
{my ($p, $s) = @_;
$u->call(u => $$p{t});
} [qw(t)], name => \'tttt\';
my $s = Subroutine
{my ($p, $s) = @_;
$t->call(t => $$p{s});
} [qw(s)], name => \'ssss\';
$r->outNL;
$s->call(s=>$r);
$r->outNL;
ok Assemble(debug => 0, eq => <<END);
r: 0000 0000 0000 0002
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0002 uuuu
0000 0000 0000 0002 tttt
0000 0000 0000 0002 ssss
Subroutine trace back, depth: 0000 0000 0000 0003
0000 0000 0000 0001 uuuu
0000 0000 0000 0001 tttt
0000 0000 0000 0001 ssss
r: 0000 0000 0000 0001
END
}
#latest:;
if (1) { #TAllocateMemory #TPrintOutMemoryInHexNL #TCopyMemory
my $N = 256;
my $s = Rb 0..$N-1;
AllocateMemory(K(size, $N), my $a = V(address));
CopyMemory(V(source, $s), V(size, $N), target => $a);
AllocateMemory(K(size, $N), my $b = V(address));
CopyMemory(source => $a, target => $b, K(size, $N));
$b->setReg(rax);
Mov rdi, $N;
PrintOutMemoryInHexNL;
ok Assemble(debug=>0, eq => <<END);
0001 0203 0405 06070809 0A0B 0C0D 0E0F1011 1213 1415 16171819 1A1B 1C1D 1E1F2021 2223 2425 26272829 2A2B 2C2D 2E2F3031 3233 3435 36373839 3A3B 3C3D 3E3F4041 4243 4445 46474849 4A4B 4C4D 4E4F5051 5253 5455 56575859 5A5B 5C5D 5E5F6061 6263 6465 66676869 6A6B 6C6D 6E6F7071 7273 7475 76777879 7A7B 7C7D 7E7F8081 8283 8485 86878889 8A8B 8C8D 8E8F9091 9293 9495 96979899 9A9B 9C9D 9E9FA0A1 A2A3 A4A5 A6A7A8A9 AAAB ACAD AEAFB0B1 B2B3 B4B5 B6B7B8B9 BABB BCBD BEBFC0C1 C2C3 C4C5 C6C7C8C9 CACB CCCD CECFD0D1 D2D3 D4D5 D6D7D8D9 DADB DCDD DEDFE0E1 E2E3 E4E5 E6E7E8E9 EAEB ECED EEEFF0F1 F2F3 F4F5 F6F7F8F9 FAFB FCFD FEFF
END
}
if (1) { # Variable length shift
Mov rax, -1;
Mov cl, 30;
Shl rax, cl;
Kmovq k0, rax;
PrintOutRegisterInHex k0;
ok Assemble =~ m(k0: FFFF FFFF C000 0000)s;
}
if (1) { # Expand
ClearRegisters rax;
Bts rax, 14;
Not rax;
PrintOutRegisterInHex rax;
Kmovq k1, rax;
PrintOutRegisterInHex k1;
Mov rax, 1;
Vpbroadcastb zmm0, rax;
PrintOutRegisterInHex zmm0;
Vpexpandd "zmm1{k1}", zmm0;
PrintOutRegisterInHex zmm1;
ok Assemble(debug => 0, eq => <<END);
rax: FFFF FFFF FFFF BFFF
k1: FFFF FFFF FFFF BFFF
zmm0: 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101
zmm1: 0101 0101 0000 0000 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101
END
}
#latest:;
if (1) {
my $P = "2F"; # Value to test for
my $l = Rb 0; Rb $_ for 1..RegisterSize zmm0; # The numbers 0..63
Vmovdqu8 zmm0, "[$l]"; # Load data to test
PrintOutRegisterInHex zmm0;
Mov rax, "0x$P"; # Broadcast the value to be tested
Vpbroadcastb zmm1, rax;
PrintOutRegisterInHex zmm1;
for my $c(0..7) # Each possible test
{my $m = "k$c";
Vpcmpub $m, zmm1, zmm0, $c;
PrintOutRegisterInHex $m;
}
Kmovq rax, k0; # Count the number of trailing zeros in k0
Tzcnt rax, rax;
PrintOutRegisterInHex rax;
is_deeply [split //, Assemble], [split //, <<END]; # Assemble and test
zmm0: 3F3E 3D3C 3B3A 3938 3736 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100
zmm1: 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F 2F2F
k0: 0000 8000 0000 0000
k1: FFFF 0000 0000 0000
k2: FFFF 8000 0000 0000
k3: 0000 0000 0000 0000
k4: FFFF 7FFF FFFF FFFF
k5: 0000 FFFF FFFF FFFF
k6: 0000 7FFF FFFF FFFF
k7: FFFF FFFF FFFF FFFF
rax: 0000 0000 0000 00$P
END
# 0 eq 1 lt 2 le 4 ne 5 ge 6 gt comparisons
}
#latest:;
if (1) {
my $P = "2F"; # Value to test for
my $l = Rb 0; Rb $_ for 1..RegisterSize zmm0; # The numbers 0..63
Vmovdqu8 zmm0, "[$l]"; # Load data to test
Mov rax, "0x$P"; # Broadcast the value to be tested
Vpbroadcastb zmm1, rax;
for my $c(0..7) # Each possible test
{my $m = "k$c";
Vpcmpub $m, zmm1, zmm0, $c;
}
Kmovq rax, k0; # Count the number of trailing zeros in k0
Tzcnt rax, rax;
is_deeply [split //, Assemble], [split //, <<END]; # Assemble and test
END
}
if (1) { #TStringLength
StringLength(V(string, Rs("abcd")))->outNL;
Assemble(debug => 0, eq => <<END);
size: 0000 0000 0000 0004
END
}
if (1) { # Hash a string #THash
Mov rax, "[rbp+24]";
Cstrlen; # Length of string to hash
Mov rdi, r15;
Hash(); # Hash string
PrintOutRegisterInHex r15;
my $e = Assemble keep=>\'hash\'; # Assemble to the specified file name
ok qx($e "") =~ m(r15: 0000 3F80 0000 3F80); # Test well known hashes
ok qx($e "a") =~ m(r15: 0000 3F80 C000 45B2);
if (0) # Hash various strings
{my %r; my %f; my $count = 0;
my $N = RegisterSize zmm0;
if (1) # Fixed blocks
{for my $l(qw(a ab abc abcd), \'a a\', \'a a\')
{for my $i(1..$N)
{my $t = $l x $i;
last if $N < length $t;
my $s = substr($t.(\' \' x $N), 0, $N);
next if $f{$s}++;
my $r = qx($e "$s");
say STDERR "$count $r";
if ($r =~ m(^.*r15:\\s*(.*)$)m)
{push $r{$1}->@*, $s;
++$count;
}
}
}
}
if (1) # Variable blocks
{for my $l(qw(a ab abc abcd), \'\', \'a a\', \'a a\')
{for my $i(1..$N)
{my $t = $l x $i;
next if $f{$t}++;
my $r = qx($e "$t");
say STDERR "$count $r";
if ($r =~ m(^.*r15:\\s*(.*)$)m)
{push $r{$1}->@*, $t;
++$count;
}
}
}
}
for my $r(keys %r)
{delete $r{$r} if $r{$r}->@* < 2;
}
say STDERR dump(\\%r);
say STDERR "Keys hashed: ", $count;
confess "Duplicates : ", scalar keys(%r);
}
}
if (1) { #TIfEq #TIfNe #TIfLe #TIfLt #TIfGe #TIfGt
my $cmp = sub
{my ($a, $b) = @_;
for my $op(qw(eq ne lt le gt ge))
{Mov rax, $a;
Cmp rax, $b;
my $Op = ucfirst $op;
eval qq(If$Op Then {PrintOutStringNL("$a $op $b")}, Else {PrintOutStringNL("$a NOT $op $b")});
$@ and confess $@;
}
};
&$cmp(1,1);
&$cmp(1,2);
&$cmp(3,2);
Assemble(debug => 0, eq => <<END);
1 eq 1
1 NOT ne 1
1 NOT lt 1
1 le 1
1 NOT gt 1
1 ge 1
1 NOT eq 2
1 ne 2
1 lt 2
1 le 2
1 NOT gt 2
1 NOT ge 2
3 NOT eq 2
3 ne 2
3 NOT lt 2
3 NOT le 2
3 gt 2
3 ge 2
END
}
if (1) { #TSetMaskRegister
Mov rax, 8;
Mov rsi, -1;
Inc rsi; SetMaskRegister(k0, rax, rsi); PrintOutRegisterInHex k0;
Inc rsi; SetMaskRegister(k1, rax, rsi); PrintOutRegisterInHex k1;
Inc rsi; SetMaskRegister(k2, rax, rsi); PrintOutRegisterInHex k2;
Inc rsi; SetMaskRegister(k3, rax, rsi); PrintOutRegisterInHex k3;
Inc rsi; SetMaskRegister(k4, rax, rsi); PrintOutRegisterInHex k4;
Inc rsi; SetMaskRegister(k5, rax, rsi); PrintOutRegisterInHex k5;
Inc rsi; SetMaskRegister(k6, rax, rsi); PrintOutRegisterInHex k6;
Inc rsi; SetMaskRegister(k7, rax, rsi); PrintOutRegisterInHex k7;
ok Assemble(debug => 0, eq => <<END);
k0: 0000 0000 0000 0000
k1: 0000 0000 0000 0100
k2: 0000 0000 0000 0300
k3: 0000 0000 0000 0700
k4: 0000 0000 0000 0F00
k5: 0000 0000 0000 1F00
k6: 0000 0000 0000 3F00
k7: 0000 0000 0000 7F00
END
}
#latest:;
if (1) { #TNasm::X86::Variable::dump #TNasm::X86::Variable::print #TThen #TElse #TV #TK
my $a = V(a, 3); $a->outNL;
my $b = K(b, 2); $b->outNL;
my $c = $a + $b; $c->outNL;
my $d = $c - $a; $d->outNL;
my $g = $a * $b; $g->outNL;
my $h = $g / $b; $h->outNL;
my $i = $a % $b; $i->outNL;
If ($a == 3,
Then
{PrintOutStringNL "a == 3"
},
Else
{PrintOutStringNL "a != 3"
});
++$a; $a->outNL;
--$a; $a->outNL;
ok Assemble(debug => 0, eq => <<END);
a: 0000 0000 0000 0003
b: 0000 0000 0000 0002
(a add b): 0000 0000 0000 0005
((a add b) sub a): 0000 0000 0000 0002
(a times b): 0000 0000 0000 0006
((a times b) / b): 0000 0000 0000 0003
(a % b): 0000 0000 0000 0001
a == 3
a: 0000 0000 0000 0004
a: 0000 0000 0000 0003
END
}
#latest:;
if (1) { #TNasm::X86::Variable::for
V(limit,10)->for(sub
{my ($i, $start, $next, $end) = @_;
$i->outNL;
});
ok Assemble(debug => 0, eq => <<END);
index: 0000 0000 0000 0000
index: 0000 0000 0000 0001
index: 0000 0000 0000 0002
index: 0000 0000 0000 0003
index: 0000 0000 0000 0004
index: 0000 0000 0000 0005
index: 0000 0000 0000 0006
index: 0000 0000 0000 0007
index: 0000 0000 0000 0008
index: 0000 0000 0000 0009
END
}
#latest:;
if (1) { #TNasm::X86::Variable::min #TNasm::X86::Variable::max
my $a = V("a", 1);
my $b = V("b", 2);
my $c = $a->min($b);
my $d = $a->max($b);
$a->outNL;
$b->outNL;
$c->outNL;
$d->outNL;
ok Assemble(debug => 0, eq => <<END);
a: 0000 0000 0000 0001
b: 0000 0000 0000 0002
min: 0000 0000 0000 0001
max: 0000 0000 0000 0002
END
}
if (1) { #TNasm::X86::Variable::setMask
my $start = V("Start", 7);
my $length = V("Length", 3);
$start->setMask($length, k7);
PrintOutRegisterInHex k7;
ok Assemble(debug => 0, eq => <<END);
k7: 0000 0000 0000 0380
END
}
if (1) { #TNasm::X86::Variable::setZmm
my $s = Rb(0..128);
my $source = V(Source, $s);
if (1) # First block
{my $offset = V(Offset, 7);
my $length = V(Length, 3);
$source->setZmm(0, $offset, $length);
}
if (1) # Second block
{my $offset = V(Offset, 33);
my $length = V(Length, 12);
$source->setZmm(0, $offset, $length);
}
PrintOutRegisterInHex zmm0;
ok Assemble(debug => 0, eq => <<END);
zmm0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 000B 0A09 0807 0605 0403 0201 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0201 0000 0000 0000 0000
END
}
#latest:;
if (1) { #TLoadZmm #Tzmm
LoadZmm 0, 0..63;
PrintOutRegisterInHex zmm 0;
ok Assemble(debug => 0, eq => <<END);
zmm0: 3F3E 3D3C 3B3A 3938 3736 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100
END
}
#latest:;
if (1) { #TgetDFromZmm #TNasm::X86::Variable::putDIntoZmm
my $s = Rb(0..8);
my $c = V("Content", "[$s]");
$c->putBIntoZmm(0, 4);
$c->putWIntoZmm(0, 6);
$c->putDIntoZmm(0, 10);
$c->putQIntoZmm(0, 16);
PrintOutRegisterInHex zmm0;
getBFromZmm(0, 12)->outNL;
getWFromZmm(0, 12)->outNL;
getDFromZmm(0, 12, r15)->outNL;
getQFromZmm(0, 12)->outNL;
ok Assemble(debug => 0, eq => <<END);
zmm0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0706 0504 0302 0100 0000 0302 0100 0000 0100 0000 0000 0000
b at offset 12 in zmm0: 0000 0000 0000 0002
w at offset 12 in zmm0: 0000 0000 0000 0302
d at offset 12 in zmm0: 0000 0000 0000 0302
q at offset 12 in zmm0: 0302 0100 0000 0302
END
}
#latest:;
if (1) { #TCreateString
my $s = Rb(0..255);
my $B = CreateArena;
my $b = $B->CreateString;
$b->append(V(source, $s), V(size, 3)); $b->dump;
$b->append(V(source, $s), V(size, 4)); $b->dump;
$b->append(V(source, $s), V(size, 5)); $b->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0201 0003
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0007
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0302 0100 0201 0007
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 000C
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0004 0302 0100 0302 0100 0201 000C
END
}
if (1) { #TCreateString
my $s = Rb(0..255);
my $B = CreateArena;
my $b = $B->CreateString;
$b->append(V(source, $s), V(size, 165)); $b->dump;
$b->append(V(source, $s), V(size, 2)); $b->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0058 A4A3 A2A1 A09F 9E9D 9C9B 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E37
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 00D8 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 00D8 0000 0058 A4A3 A2A1 A09F 9E9D 9C9B 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E37
Offset: 0000 0000 0000 00D8 Length: 0000 0000 0000 0002
zmm31: 0000 0018 0000 0098 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0002
END
}
#latest:;
if (1) { #TCreateString
my $s = Rb(0..255);
my $B = CreateArena;
my $b = $B->CreateString;
$b->append(V(source, $s), V(size, 56)); $b->dump;
$b->append(V(source, $s), V(size, 4)); $b->dump;
$b->append(V(source, $s), V(size, 5)); $b->dump;
$b->append(V(source, $s), V(size, 0)); $b->dump;
$b->append(V(source, $s), V(size, 256)); $b->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0001
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3701
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0005
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0302 0100 3705
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 000A
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0004 0302 0100 0302 0100 370A
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 000A
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0004 0302 0100 0302 0100 370A
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0158 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0004 0302 0100 0302 0100 3737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 00D8 0000 0058 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3736 3534 3332 3130 2F2E 2D37
Offset: 0000 0000 0000 00D8 Length: 0000 0000 0000 0037
zmm31: 0000 0118 0000 0098 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E6D 6C6B 6A69 6867 6665 6437
Offset: 0000 0000 0000 0118 Length: 0000 0000 0000 0037
zmm31: 0000 0158 0000 00D8 D1D0 CFCE CDCC CBCA C9C8 C7C6 C5C4 C3C2 C1C0 BFBE BDBC BBBA B9B8 B7B6 B5B4 B3B2 B1B0 AFAE ADAC ABAA A9A8 A7A6 A5A4 A3A2 A1A0 9F9E 9D9C 9B37
Offset: 0000 0000 0000 0158 Length: 0000 0000 0000 002E
zmm31: 0000 0018 0000 0118 0000 0000 0000 0000 00FF FEFD FCFB FAF9 F8F7 F6F5 F4F3 F2F1 F0EF EEED ECEB EAE9 E8E7 E6E5 E4E3 E2E1 E0DF DEDD DCDB DAD9 D8D7 D6D5 D4D3 D22E
END
}
#latest:;
if (1) {
my $s = Rb(0..255);
my $A = CreateArena;
my $S = $A->CreateString;
$S->append(V(source, $s), K(size, 256));
$S->len->outNL;
$S->clear;
$S->append(V(source, $s), K(size, 16));
$S->len->outNL;
$S->dump;
ok Assemble(debug => 0, eq => <<END);
size: 0000 0000 0000 0100
size: 0000 0000 0000 0010
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0010
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000F 0E0D 0C0B 0A09 0807 0605 0403 0201 0010
END
}
#latest:;
if (1) { #T Nasm::X86::String::concatenate
my $c = Rb(0..255);
my $S = CreateArena; my $s = $S->CreateString;
my $T = CreateArena; my $t = $T->CreateString;
$s->append(source=>V(source, $c), V(size, 256));
$t->concatenate($s);
$t->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0000
zmm31: 0000 0058 0000 0158 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 00D8 0000 0058 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3737
Offset: 0000 0000 0000 00D8 Length: 0000 0000 0000 0037
zmm31: 0000 0118 0000 0098 A4A3 A2A1 A09F 9E9D 9C9B 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E37
Offset: 0000 0000 0000 0118 Length: 0000 0000 0000 0037
zmm31: 0000 0158 0000 00D8 DBDA D9D8 D7D6 D5D4 D3D2 D1D0 CFCE CDCC CBCA C9C8 C7C6 C5C4 C3C2 C1C0 BFBE BDBC BBBA B9B8 B7B6 B5B4 B3B2 B1B0 AFAE ADAC ABAA A9A8 A7A6 A537
Offset: 0000 0000 0000 0158 Length: 0000 0000 0000 0024
zmm31: 0000 0018 0000 0118 0000 0000 0000 0000 0000 0000 0000 0000 0000 00FF FEFD FCFB FAF9 F8F7 F6F5 F4F3 F2F1 F0EF EEED ECEB EAE9 E8E7 E6E5 E4E3 E2E1 E0DF DEDD DC24
END
}
#latest:;
if (1) { # Strings doubled
my $s1 = Rb(0..63);
my $s2 = Rb(64..127);
my $S = CreateArena; my $s = $S->CreateString;
my $T = CreateArena; my $t = $T->CreateString;
$s->append(source=>V(source, $s1), V(size, 64));
$t->append(source=>V(source, $s2), V(size, 64));
$s->append(source=>V(source, $s1), V(size, 64));
$t->append(source=>V(source, $s2), V(size, 64));
$s->dump;
$t->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100 3F3E 3D3C 3B3A 3938 3737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0012
zmm31: 0000 0018 0000 0058 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 003F 3E3D 3C3B 3A39 3837 3635 3433 3231 302F 2E12
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0098 7675 7473 7271 706F 6E6D 6C6B 6A69 6867 6665 6463 6261 605F 5E5D 5C5B 5A59 5857 5655 5453 5251 504F 4E4D 4C4B 4A49 4847 4645 4443 4241 4037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 7F7E 7D7C 7B7A 7978 7737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0012
zmm31: 0000 0018 0000 0058 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 007F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E12
END
}
#latest:;
if (1) { # Insert char in a one string
my $c = Rb(0..255);
my $S = CreateArena;
my $s = $S->CreateString;
$s->append(source=>V(source, $c), V(size, 3));
$s->dump;
$s->insertChar(V(source, 0x44), V(size, 2));
$s->dump;
$s->insertChar(V(source, 0x88), V(size, 2));
$s->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0201 0003
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0004
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002 4401 0004
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0244 8801 0005
END
}
#latest:;
if (1) { # Insert char in a multi string at position 22
my $c = Rb(0..255);
my $S = CreateArena; my $s = $S->CreateString;
$s->append(source=>V(source, $c), V(size, 58));
$s->dump;
$s->insertChar(V(character, 0x44), V(position, 22));
$s->dump;
$s->insertChar(V(character, 0x88), V(position, 22));
$s->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3938 3703
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0016
zmm31: 0000 0098 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0016
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0022
zmm31: 0000 0058 0000 0058 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 5836 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 4422
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3938 3703
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0017
zmm31: 0000 0098 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 8815 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0017
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0022
zmm31: 0000 0058 0000 0058 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 5836 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 4422
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3938 3703
END
}
#latest:;
if (1) { #TNasm::X86::String::insertChar
my $c = Rb(0..255);
my $S = CreateArena;
my $s = $S->CreateString;
$s->append(source=>V(source, $c), K(size, 54)); $s->dump;
$s->insertChar(V(character, 0x77), K(position, 4)); $s->dump;
$s->insertChar(V(character, 0x88), K(position, 5)); $s->dump;
$s->insertChar(V(character, 0x99), K(position, 6)); $s->dump;
$s->insertChar(V(character, 0xAA), K(position, 7)); $s->dump;
$s->insertChar(V(character, 0xBB), K(position, 8)); $s->dump;
$s->insertChar(V(character, 0xCC), K(position, 9)); $s->dump;
$s->insertChar(V(character, 0xDD), K(position, 10)); $s->dump;
$s->insertChar(V(character, 0xEE), K(position, 11)); $s->dump;
$s->insertChar(V(character, 0xFF), K(position, 12)); $s->dump;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0036
zmm31: 0000 0018 0000 0018 0035 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0036
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0018 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0037
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0033
zmm31: 0000 0018 0000 0018 0000 0018 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 8833
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0034
zmm31: 0000 0018 0000 0018 0000 0035 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0499 8834
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0035
zmm31: 0000 0018 0000 0018 0000 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 AA99 8835
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0036
zmm31: 0000 0018 0000 0018 0035 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 04BB AA99 8836
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0018 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 CCBB AA99 8837
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0005
zmm31: 0000 0098 0000 0098 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 CCBB AA99 8805
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0033
zmm31: 0000 0018 0000 0018 0000 0018 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 DD33
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0005
zmm31: 0000 0098 0000 0098 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 CCBB AA99 8805
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0034
zmm31: 0000 0018 0000 0018 0000 0035 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 04EE DD34
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0058 0000 0058 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 7703 0201 0005
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0005
zmm31: 0000 0098 0000 0098 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 CCBB AA99 8805
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0035
zmm31: 0000 0018 0000 0018 0000 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 FFEE DD35
END
}
#latest:;
if (1) {
my $c = Rb(0..255);
my $S = CreateArena; my $s = $S->CreateString;
$s->append(source=>V(source, $c), V(size, 3)); $s->dump;
$s->insertChar(V(character, 0xFF), V(position, 64)); $s->dump;
$s->insertChar(V(character, 0xEE), V(position, 64)); $s->dump;
$s->len->outNL;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0003
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0201 0003
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0004
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00FF 0201 0004
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0005
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 EEFF 0201 0005
size: 0000 0000 0000 0005
END
}
#latest:;
if (1) { #TNasm::X86::String::deleteChar #TNasm::X86::String::len
my $c = Rb(0..255);
my $S = CreateArena; my $s = $S->CreateString;
$s->append(source=>V(source, $c), V(size, 165)); $s->dump;
$s->deleteChar(V(position, 0x44)); $s->dump;
$s->len->outNL;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0098 0000 0018 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3737
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0058 A4A3 A2A1 A09F 9E9D 9C9B 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E37
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0098 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0036
zmm31: 0000 0098 0000 0018 186D 6C6B 6A69 6867 6665 6463 6261 605F 5E5D 5C5B 5A59 5857 5655 5453 5251 504F 4E4D 4C4B 4A49 4847 4645 4342 4140 3F3E 3D3C 3B3A 3938 3736
Offset: 0000 0000 0000 0098 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0058 A4A3 A2A1 A09F 9E9D 9C9B 9A99 9897 9695 9493 9291 908F 8E8D 8C8B 8A89 8887 8685 8483 8281 807F 7E7D 7C7B 7A79 7877 7675 7473 7271 706F 6E37
size: 0000 0000 0000 00A4
END
}
#latest:;
if (1) { #TNasm::X86::String::getChar
my $c = Rb(0..255);
my $S = CreateArena; my $s = $S->CreateString;
$s->append(source=>V(source, $c), V(size, 110)); $s->dump;
$s->getCharacter(V(position, 0x44))->outNL;
ok Assemble(debug => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0037
zmm31: 0000 0058 0000 0058 3635 3433 3231 302F 2E2D 2C2B 2A29 2827 2625 2423 2221 201F 1E1D 1C1B 1A19 1817 1615 1413 1211 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0037
Offset: 0000 0000 0000 0058 Length: 0000 0000 0000 0037
zmm31: 0000 0018 0000 0018 6D6C 6B6A 6968 6766 6564 6362 6160 5F5E 5D5C 5B5A 5958 5756 5554 5352 5150 4F4E 4D4C 4B4A 4948 4746 4544 4342 4140 3F3E 3D3C 3B3A 3938 3737
out: 0000 0000 0000 0044
END
}
#latest:;
if (1) { #TNasm::X86::Variable::setMask
my $z = V(\'zero\', 0);
my $o = V(\'one\', 1);
my $t = V(\'two\', 2);
$z->setMask($o, k7); PrintOutRegisterInHex k7;
$z->setMask($t, k6); PrintOutRegisterInHex k6;
$z->setMask($o+$t, k5); PrintOutRegisterInHex k5;
$o->setMask($o, k4); PrintOutRegisterInHex k4;
$o->setMask($t, k3); PrintOutRegisterInHex k3;
$o->setMask($o+$t, k2); PrintOutRegisterInHex k2;
$t->setMask($o, k1); PrintOutRegisterInHex k1;
$t->setMask($t, k0); PrintOutRegisterInHex k0;
ok Assemble(debug => 0, eq => <<END);
k7: 0000 0000 0000 0001
k6: 0000 0000 0000 0003
k5: 0000 0000 0000 0007
k4: 0000 0000 0000 0002
k3: 0000 0000 0000 0006
k2: 0000 0000 0000 000E
k1: 0000 0000 0000 0004
k0: 0000 0000 0000 000C
END
}
#latest:;
if (1) { #TNasm::X86::Array::size
my $N = 15;
my $A = CreateArena;
my $a = $A->CreateArray;
$a->push(V(element, $_)) for 1..$N;
K(loop, $N)->for(sub
{my ($start, $end, $next) = @_;
my $l = $a->size;
If $l == 0, Then {Jmp $end};
my $e = $a->pop;
$e->outNL;
});
ok Assemble(debug => 0, eq => <<END);
element: 0000 0000 0000 000F
element: 0000 0000 0000 000E
element: 0000 0000 0000 000D
element: 0000 0000 0000 000C
element: 0000 0000 0000 000B
element: 0000 0000 0000 000A
element: 0000 0000 0000 0009
element: 0000 0000 0000 0008
element: 0000 0000 0000 0007
element: 0000 0000 0000 0006
element: 0000 0000 0000 0005
element: 0000 0000 0000 0004
element: 0000 0000 0000 0003
element: 0000 0000 0000 0002
element: 0000 0000 0000 0001
END
}
#latest:;
if (1) { # Arrays doubled
my $A = CreateArena; my $a = $A->CreateArray;
my $B = CreateArena; my $b = $B->CreateArray;
$a->push(V(element, $_)), $b->push(V(element, $_ + 0x11)) for 1..15;
$a->push(V(element, $_)), $b->push(V(element, $_ + 0x11)) for 0xff;
$a->push(V(element, $_)), $b->push(V(element, $_ + 0x11)) for 17..31;
$a->push(V(element, $_)), $b->push(V(element, $_ + 0x11)) for 0xee;
$a->push(V(element, $_)), $b->push(V(element, $_ + 0x11)) for 33..36;
$A->dump;
$B->dump;
ok Assemble(debug => 0, eq => <<END);
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00000000 0000 0000 00002400 0000 5800 00009800 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000100 0000 0200 00000300 0000 0400 00000500 0000 0600 00000700 0000 0800 00000900 0000 0A00 0000
Block: 0000 0000 0000 0002 0B00 0000 0C00 00000D00 0000 0E00 00000F00 0000 FF00 00001100 0000 1200 00001300 0000 1400 00001500 0000 1600 00001700 0000 1800 00001900 0000 1A00 0000
Block: 0000 0000 0000 0003 1B00 0000 1C00 00001D00 0000 1E00 00001F00 0000 EE00 00002100 0000 2200 00002300 0000 2400 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00000000 0000 0000 00002400 0000 5800 00009800 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00001200 0000 1300 00001400 0000 1500 00001600 0000 1700 00001800 0000 1900 00001A00 0000 1B00 0000
Block: 0000 0000 0000 0002 1C00 0000 1D00 00001E00 0000 1F00 00002000 0000 1001 00002200 0000 2300 00002400 0000 2500 00002600 0000 2700 00002800 0000 2900 00002A00 0000 2B00 0000
Block: 0000 0000 0000 0003 2C00 0000 2D00 00002E00 0000 2F00 00003000 0000 FF00 00003200 0000 3300 00003400 0000 3500 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
#latest:;
if (1) { #TNasm::X86::Array::push #TNasm::X86::Array::pop #TNasm::X86::Array::put #TNasm::X86::Array::get
my $c = Rb(0..255);
my $A = CreateArena; my $a = $A->CreateArray;
my $l = V(limit, 15);
my $L = $l + 5;
my sub put # Put a constant or a variable
{my ($e) = @_;
$a->push(ref($e) ? $e : V($e, $e));
};
my sub get # Get a constant or a variable
{my ($i) = @_;
my $e = $a->get(my $v = ref($i) ? $i : K(\'index\', $i));
$v->out("index: ", " "); $e->outNL;
};
$l->for(sub # Loop to the limit pushing
{my ($index, $start, $next, $end) = @_;
put($index+1);
});
$l->for(sub # Loop to the limit getting
{my ($index, $start, $next, $end) = @_;
get($index);
});
put(16);
get(15);
$L->for(sub
{my ($index, $start, $next, $end) = @_;
put($index+$l+2);
});
$L->for(sub
{my ($index, $start, $next, $end) = @_;
get($index + $l + 1);
});
if (1)
{$a->put(my $i = V(\'index\', 9), my $e = V(element, 0xFFF9));
get(9);
}
if (1)
{$a->put(my $i = V(\'index\', 19), my $e = V(element, 0xEEE9));
get(19);
}
($l+$L+1)->for(sub
{my ($i, $start, $next, $end) = @_;
my $e = $a->pop;
$e->outNL;
});
V(limit, 38)->for(sub # Push using a loop and reusing the freed space
{my ($index, $start, $next, $end) = @_;
$a->push($index*2);
});
V(limit, 38)->for(sub # Push using a loop and reusing the freed space
{my ($index, $start, $next, $end) = @_;
$a->pop->outNL;
});
$a->dump;
ok Assemble(debug => 0, eq => <<END);
index: 0000 0000 0000 0000 element: 0000 0000 0000 0001
index: 0000 0000 0000 0001 element: 0000 0000 0000 0002
index: 0000 0000 0000 0002 element: 0000 0000 0000 0003
index: 0000 0000 0000 0003 element: 0000 0000 0000 0004
index: 0000 0000 0000 0004 element: 0000 0000 0000 0005
index: 0000 0000 0000 0005 element: 0000 0000 0000 0006
index: 0000 0000 0000 0006 element: 0000 0000 0000 0007
index: 0000 0000 0000 0007 element: 0000 0000 0000 0008
index: 0000 0000 0000 0008 element: 0000 0000 0000 0009
index: 0000 0000 0000 0009 element: 0000 0000 0000 000A
index: 0000 0000 0000 000A element: 0000 0000 0000 000B
index: 0000 0000 0000 000B element: 0000 0000 0000 000C
index: 0000 0000 0000 000C element: 0000 0000 0000 000D
index: 0000 0000 0000 000D element: 0000 0000 0000 000E
index: 0000 0000 0000 000E element: 0000 0000 0000 000F
index: 0000 0000 0000 000F element: 0000 0000 0000 0010
index: 0000 0000 0000 0010 element: 0000 0000 0000 0011
index: 0000 0000 0000 0011 element: 0000 0000 0000 0012
index: 0000 0000 0000 0012 element: 0000 0000 0000 0013
index: 0000 0000 0000 0013 element: 0000 0000 0000 0014
index: 0000 0000 0000 0014 element: 0000 0000 0000 0015
index: 0000 0000 0000 0015 element: 0000 0000 0000 0016
index: 0000 0000 0000 0016 element: 0000 0000 0000 0017
index: 0000 0000 0000 0017 element: 0000 0000 0000 0018
index: 0000 0000 0000 0018 element: 0000 0000 0000 0019
index: 0000 0000 0000 0019 element: 0000 0000 0000 001A
index: 0000 0000 0000 001A element: 0000 0000 0000 001B
index: 0000 0000 0000 001B element: 0000 0000 0000 001C
index: 0000 0000 0000 001C element: 0000 0000 0000 001D
index: 0000 0000 0000 001D element: 0000 0000 0000 001E
index: 0000 0000 0000 001E element: 0000 0000 0000 001F
index: 0000 0000 0000 001F element: 0000 0000 0000 0020
index: 0000 0000 0000 0020 element: 0000 0000 0000 0021
index: 0000 0000 0000 0021 element: 0000 0000 0000 0022
index: 0000 0000 0000 0022 element: 0000 0000 0000 0023
index: 0000 0000 0000 0023 element: 0000 0000 0000 0024
index: 0000 0000 0000 0009 element: 0000 0000 0000 FFF9
index: 0000 0000 0000 0013 element: 0000 0000 0000 EEE9
element: 0000 0000 0000 0024
element: 0000 0000 0000 0023
element: 0000 0000 0000 0022
element: 0000 0000 0000 0021
element: 0000 0000 0000 0020
element: 0000 0000 0000 001F
element: 0000 0000 0000 001E
element: 0000 0000 0000 001D
element: 0000 0000 0000 001C
element: 0000 0000 0000 001B
element: 0000 0000 0000 001A
element: 0000 0000 0000 0019
element: 0000 0000 0000 0018
element: 0000 0000 0000 0017
element: 0000 0000 0000 0016
element: 0000 0000 0000 0015
element: 0000 0000 0000 EEE9
element: 0000 0000 0000 0013
element: 0000 0000 0000 0012
element: 0000 0000 0000 0011
element: 0000 0000 0000 0010
element: 0000 0000 0000 000F
element: 0000 0000 0000 000E
element: 0000 0000 0000 000D
element: 0000 0000 0000 000C
element: 0000 0000 0000 000B
element: 0000 0000 0000 FFF9
element: 0000 0000 0000 0009
element: 0000 0000 0000 0008
element: 0000 0000 0000 0007
element: 0000 0000 0000 0006
element: 0000 0000 0000 0005
element: 0000 0000 0000 0004
element: 0000 0000 0000 0003
element: 0000 0000 0000 0002
element: 0000 0000 0000 0001
element: 0000 0000 0000 004A
element: 0000 0000 0000 0048
element: 0000 0000 0000 0046
element: 0000 0000 0000 0044
element: 0000 0000 0000 0042
element: 0000 0000 0000 0040
element: 0000 0000 0000 003E
element: 0000 0000 0000 003C
element: 0000 0000 0000 003A
element: 0000 0000 0000 0038
element: 0000 0000 0000 0036
element: 0000 0000 0000 0034
element: 0000 0000 0000 0032
element: 0000 0000 0000 0030
element: 0000 0000 0000 002E
element: 0000 0000 0000 002C
element: 0000 0000 0000 002A
element: 0000 0000 0000 0028
element: 0000 0000 0000 0026
element: 0000 0000 0000 0024
element: 0000 0000 0000 0022
element: 0000 0000 0000 0020
element: 0000 0000 0000 001E
element: 0000 0000 0000 001C
element: 0000 0000 0000 001A
element: 0000 0000 0000 0018
element: 0000 0000 0000 0016
element: 0000 0000 0000 0014
element: 0000 0000 0000 0012
element: 0000 0000 0000 0010
element: 0000 0000 0000 000E
element: 0000 0000 0000 000C
element: 0000 0000 0000 000A
element: 0000 0000 0000 0008
element: 0000 0000 0000 0006
element: 0000 0000 0000 0004
element: 0000 0000 0000 0002
element: 0000 0000 0000 0000
array
Size: 0000 0000 0000 0000 zmm31: 0000 001C 0000 001A 0000 0018 0000 0016 0000 0014 0000 0012 0000 0010 0000 000E 0000 000C 0000 000A 0000 0008 0000 0006 0000 0004 0000 0002 0000 0000 0000 0000
END
}
#latest:;
if (1) { #TNasm::X86::Arena::allocBlock #TNasm::X86::Arena::freeBlock
my $a = CreateArena; $a->dump;
for (1..4)
{my $b1 = $a->allocBlock; $a->dump;
my $b2 = $a->allocBlock; $a->dump;
$a->freeBlock($b2); $a->dump;
$a->freeBlock($b1); $a->dump;
}
ok Assemble(debug => 0, eq => <<END);
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0018
Block: 0000 0000 0000 0000 0010 0000 0000 00001800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0058
Block: 0000 0000 0000 0000 0010 0000 0000 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0098
Block: 0000 0000 0000 0000 0010 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00001800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00001800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00001800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00005800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0118
Block: 0000 0000 0000 0000 0010 0000 0000 00001801 0000 0000 00009800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000000 0000 5800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000100 0000 D800 00001800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
#latest:;
if (1) { #TNasm::X86::Array::push
my $c = Rb(0..255);
my $A = CreateArena; my $a = $A->CreateArray;
my sub put
{my ($e) = @_;
$a->push(V($e, $e));
};
my sub get
{my ($i) = @_; # Parameters
my $e = $a->get(my $v = V(\'index\', $i));
$v->out; PrintOutString " "; $e->outNL;
};
put($_) for 1..15; get(15);
ok Assemble(debug => 2, eq => <<END);
Index out of bounds on get from array, Index: 0000 0000 0000 000F Size: 0000 0000 0000 000F
END
}
#latest:
if (1) { #TExtern #TLink #TCallC
my $format = Rs "Hello %s\\n";
my $data = Rs "World";
Extern qw(printf exit malloc strcpy); Link \'c\';
CallC \'malloc\', length($format)+1;
Mov r15, rax;
CallC \'strcpy\', r15, $format;
CallC \'printf\', r15, $data;
CallC \'exit\', 0;
ok Assemble(eq => <<END);
Hello World
END
}
#latest:
if (1) {
my $a = Rb((reverse 0..16)x16);
my $b = Rb(( 0..16)x16);
Mov rax, $a; Vmovdqu8 zmm0, "[rax]";
Mov rax, $b; Vmovdqu8 zmm1, "[rax]";
Vpcmpeqb k0, zmm0, zmm1;
Kmovq rax, k0; Popcnt rax, rax;
PrintOutRegisterInHex zmm0, zmm1, k0, rax;
ok Assemble(eq => <<END);
zmm0: 0405 0607 0809 0A0B 0C0D 0E0F 1000 0102 0304 0506 0708 090A 0B0C 0D0E 0F10 0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 1000 0102 0304 0506 0708 090A 0B0C 0D0E 0F10
zmm1: 0C0B 0A09 0807 0605 0403 0201 0010 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100 100F 0E0D 0C0B 0A09 0807 0605 0403 0201 0010 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100
k0: 0800 0400 0200 0100
rax: 0000 0000 0000 0004
END
}
#latest:
if (1) { # Insert key for Tree
# 0000000001111111 A Length = k7
# .........1111000 B Greater = k6
# 0000000001111000 C = A&B = k5
# 0000000000000111 D = !C&A = k4
# 0000000011110000 E Shift left 1 C = K5
# 0000000011110111 F Want expand mask = E&D = k5&K4 ->k5
# 0000000000001000 G Want broadcast mask !F&A = K5!&k7->k6
Mov eax, 0x007f; Kmovw k7, eax;
Mov esi, 0x0F78; Kmovw k6, esi;
Kandw k5, k6, k7;
Kandnw k4, k5, k7;
Kshiftlw k5, k5, 1;
Korw k5, k4, k5;
Kandnw k6, k5, k7;
PrintOutRegisterInHex k7, k5, k6;
ok Assemble(eq => <<END);
k7: 0000 0000 0000 007F
k5: 0000 0000 0000 00F7
k6: 0000 0000 0000 0008
END
}
#latest:
if (1) { #TNasm::X86::Arena::chain
my $format = Rd(map{4*$_+24} 0..64);
my $b = CreateArena;
my $a = $b->allocBlock;
Vmovdqu8 zmm31, "[$format]";
$b->putZmmBlock($a, 31);
my $r = $b->chain(V(start, 0x18), 4); $r->outNL("chain1: ");
my $s = $b->chain($r, 4); $s->outNL("chain2: ");
my $t = $b->chain($s, 4); $t->outNL("chain3: ");
my $A = $b->chain(V(start, 0x18), 4, 4, 4); $A->outNL("chain4: "); # Get a long chain
$b->putChain(V(start, 0x18), V(end, 0xff), 4, 4, 4); # Put at the end of a long chain
$b->dump;
my $sub = Subroutine
{my ($p) = @_; # Parameters
If ($$p{c} == -1,
sub {PrintOutStringNL "C is minus one"},
sub {PrintOutStringNL "C is NOT minus one"},
);
If ($$p{d} == -1,
sub {PrintOutStringNL "D is minus one"},
sub {PrintOutStringNL "D is NOT minus one"},
);
$$p{c}->outNL;
$$p{e} += 1;
$$p{e}->outNL(\'E: \');
$$p{f}->outNL(\'F1: \');
$$p{f}++;
$$p{f}->outNL(\'F2: \');
} [qw(c d e f)], name=> \'aaa\';
my $c = K(c, -1);
my $d = K(d, -1);
my $e = V(e, 1);
my $f = V(f, 2);
$sub->call($c, $d, $e, $f);
$f->outNL(\'F3: \');
ok Assemble(debug => 0, eq => <<END);
chain1: 0000 0000 0000 001C
chain2: 0000 0000 0000 0020
chain3: 0000 0000 0000 0024
chain4: 0000 0000 0000 0024
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0058
Block: 0000 0000 0000 0000 0010 0000 0000 00005800 0000 0000 00000000 0000 0000 00001800 0000 1C00 00002000 0000 FF00 00002800 0000 2C00 00003000 0000 3400 00003800 0000 3C00 0000
Block: 0000 0000 0000 0001 4000 0000 4400 00004800 0000 4C00 00005000 0000 5400 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
C is minus one
D is minus one
c: FFFF FFFF FFFF FFFF
E: 0000 0000 0000 0002
F1: 0000 0000 0000 0002
F2: 0000 0000 0000 0003
F3: 0000 0000 0000 0003
END
}
#latest:
if (1) { #TLoadConstantIntoMaskRegister #TPopEax #IfZ
Mov r14, 0;
Kmovq k0, r14;
Ktestq k0, k0;
IfZ Then {PrintOutStringNL "0 & 0 == 0"};
PrintOutZF;
LoadConstantIntoMaskRegister k1, r13, 1;
Ktestq k1, k1;
IfNz Then {PrintOutStringNL "1 & 1 != 0"};
PrintOutZF;
LoadConstantIntoMaskRegister k2, r13, eval "0b".((\'1\'x4).(\'0\'x4))x2;
PrintOutRegisterInHex k0, k1, k2;
Mov r15, 0x89abcdef;
Mov r14, 0x01234567;
Shl r14, 32;
Or r15, r14;
Push r15;
Push r15;
PopEax; PrintRaxInHex($stdout, 3); PrintOutNL;
my $a = V(\'aaaa\');
$a->pop;
$a->push;
$a->outNL;
PopEax; PrintRaxInHex($stdout, 3); PrintOutNL;
ok Assemble(debug => 0, eq => <<END);
0 & 0 == 0
ZF=1
1 & 1 != 0
ZF=0
k0: 0000 0000 0000 0000
k1: 0000 0000 0000 0001
k2: 0000 0000 0000 F0F0
89AB CDEF
aaaa: 89AB CDEF 0123 4567
0123 4567
END
}
#latest:
if (1) { #TConvertUtf8ToUtf32
my @p = my ($out, $size, $fail) = (V(out), V(size), V(\'fail\'));
my $Chars = Rb(0x24, 0xc2, 0xa2, 0xc9, 0x91, 0xE2, 0x82, 0xAC, 0xF0, 0x90, 0x8D, 0x88);
my $chars = V(chars, $Chars);
GetNextUtf8CharAsUtf32 in=>$chars, @p; # Dollar UTF-8 Encoding: 0x24 UTF-32 Encoding: 0x00000024
$out->out(\'out1 : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$chars+1, @p; # Cents UTF-8 Encoding: 0xC2 0xA2 UTF-32 Encoding: 0x000000a2
$out->out(\'out2 : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$chars+3, @p; # Alpha UTF-8 Encoding: 0xC9 0x91 UTF-32 Encoding: 0x00000251
$out->out(\'out3 : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$chars+5, @p; # Euro UTF-8 Encoding: 0xE2 0x82 0xAC UTF-32 Encoding: 0x000020AC
$out->out(\'out4 : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$chars+8, @p; # Gothic Letter Hwair UTF-8 Encoding 0xF0 0x90 0x8D 0x88 UTF-32 Encoding: 0x00010348
$out->out(\'out5 : \'); $size->outNL(\' size : \');
my $statement = qq(ð?º\\n ð??ð? ð? ð??ð??ð?? ã?ã?ð?» ð©ð¥ð®ð¬ ð?¼ã??ã??\\nAAAAAAAA); # A sample sentence to parse
my $s = K(statement, Rutf8($statement));
my $l = StringLength string => $s;
AllocateMemory($l, my $address = V(address)); # Allocate enough memory for a copy of the string
CopyMemory(source => $s, target => $address, $l);
GetNextUtf8CharAsUtf32 in=>$address, @p;
$out->out(\'outA : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$address+4, @p;
$out->out(\'outB : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$address+5, @p;
$out->out(\'outC : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$address+30, @p;
$out->out(\'outD : \'); $size->outNL(\' size : \');
GetNextUtf8CharAsUtf32 in=>$address+35, @p;
$out->out(\'outE : \'); $size->outNL(\' size : \');
$address->printOutMemoryInHexNL($l);
ok Assemble(debug => 0, eq => <<END);
out1 : 0000 0000 0000 0024 size : 0000 0000 0000 0001
out2 : 0000 0000 0000 00A2 size : 0000 0000 0000 0002
out3 : 0000 0000 0000 0251 size : 0000 0000 0000 0002
out4 : 0000 0000 0000 20AC size : 0000 0000 0000 0003
out5 : 0000 0000 0001 0348 size : 0000 0000 0000 0004
outA : 0000 0000 0001 D5BA size : 0000 0000 0000 0004
outB : 0000 0000 0000 000A size : 0000 0000 0000 0001
outC : 0000 0000 0000 0020 size : 0000 0000 0000 0001
outD : 0000 0000 0000 0020 size : 0000 0000 0000 0001
outE : 0000 0000 0000 0010 size : 0000 0000 0000 0002
F09D 96BA 0A20 F09D918E F09D 91A0 F09D91A0 F09D 9196 F09D9194 F09D 919B 20E38090 E380 90F0 9D96BB20 F09D 90A9 F09D90A5 F09D 90AE F09D90AC 20F0 9D96 BCE38091 E380 910A 41414141 4141 4141 0000
END
}
#latest:
if (1) { #TNasm::X86::Tree::splitFullLeftNode
my $Sk = Rd(17..28, 0, 0, 12, 0xFF);
my $Sd = Rd(17..28, 0, 0, 0xDD, 0xEE);
my $Sn = Rd(1..13, 0, 0, 0xCC);
my $sk = Rd(1..14, 14, 0xA1);
my $sd = Rd(1..14, 0xCC, 0xA2);
my $sn = Rd(1..15, 0xA3);
my $rk = Rd((0)x14, 14, 0xB1);
my $rd = Rd((0)x14, 0xCC, 0xB2);
my $rn = Rd((0)x15, 0xB3);
my $b = CreateArena;
my $t = $b->CreateTree;
Vmovdqu8 zmm31, "[$Sk]";
Vmovdqu8 zmm30, "[$Sd]";
Vmovdqu8 zmm29, "[$Sn]";
Vmovdqu8 zmm28, "[$sk]";
Vmovdqu8 zmm27, "[$sd]";
Vmovdqu8 zmm26, "[$sn]";
Vmovdqu8 zmm25, "[$rk]";
Vmovdqu8 zmm24, "[$rd]";
Vmovdqu8 zmm23, "[$rn]";
$t->splitFullLeftNode;
PrintOutRegisterInHex reverse zmm(23..31);
ok Assemble(debug => 0, eq => <<END);
zmm31: 0000 00FF 0000 000D 0000 0000 0000 0000 0000 001C 0000 001B 0000 001A 0000 0019 0000 0018 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm30: 0000 00EE 0000 00DD 0000 0000 0000 0000 0000 001C 0000 001B 0000 001A 0000 0019 0000 0018 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm29: 0000 00CC 0000 0000 0000 0000 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm28: 0000 00A1 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm27: 0000 00A2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm26: 0000 00A3 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm25: 0000 00B1 0000 0006 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm24: 0000 00B2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm23: 0000 00B3 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
END
}
#latest:
if (1) { #TNasm::X86::Tree::splitFullLeftNode
my $tk = Rd(1, (0) x 13, 1, 0xC1);
my $td = Rd(1, (0) x 14, 0xC2);
my $tn = Rd(1, 0xAA, (0) x 13, 0xCC);
my $lk = Rd(1..14, 14, 0xA1);
my $ld = Rd(1..14, 0xCC, 0xA2);
my $ln = Rd(1..15, 0xAA);
my $rk = Rd((0)x14, 14, 0xB1);
my $rd = Rd((0)x14, 0xCC, 0xB2);
my $rn = Rd((0)x15, 0xBB);
my $b = CreateArena;
my $t = $b->CreateTree;
Vmovdqu8 zmm31, "[$tk]";
Vmovdqu8 zmm30, "[$td]";
Vmovdqu8 zmm29, "[$tn]";
Vmovdqu8 zmm28, "[$lk]";
Vmovdqu8 zmm27, "[$ld]";
Vmovdqu8 zmm26, "[$ln]";
Vmovdqu8 zmm25, "[$rk]";
Vmovdqu8 zmm24, "[$rd]";
Vmovdqu8 zmm23, "[$rn]";
$t->splitFullLeftNode;
PrintOutRegisterInHex reverse zmm(23..31);
ok Assemble(debug => 0, eq => <<END);
zmm31: 0000 00C1 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0008 0000 0001
zmm30: 0000 00C2 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0008 0000 0001
zmm29: 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00BB 0000 00AA 0000 0001
zmm28: 0000 00A1 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm27: 0000 00A2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm26: 0000 00AA 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm25: 0000 00B1 0000 0006 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm24: 0000 00B2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm23: 0000 00BB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
END
}
#latest:
if (1) { #TNasm::X86::Tree::splitFullRightNode
my $tk = Rd(1..12, 0, 0, 12, 0xC1);
my $td = Rd(1..12, 0, 0, 0, 0xC2);
my $tn = Rd(1, 0xBB, 3..13, 0, 0, 0xCC);
my $lk = Rd(17..30, 14, 0xA1);
my $ld = Rd(17..30, 0xCC, 0xA2);
my $ln = Rd(17..31, 0xAA);
my $rk = Rd(17..30, 14, 0xB1);
my $rd = Rd(17..30, 0xCC, 0xB2);
my $rn = Rd(17..31, 0xBB);
my $b = CreateArena;
my $t = $b->CreateTree;
Vmovdqu8 zmm31, "[$tk]";
Vmovdqu8 zmm30, "[$td]";
Vmovdqu8 zmm29, "[$tn]";
Vmovdqu8 zmm28, "[$lk]";
Vmovdqu8 zmm27, "[$ld]";
Vmovdqu8 zmm26, "[$ln]";
Vmovdqu8 zmm25, "[$rk]";
Vmovdqu8 zmm24, "[$rd]";
Vmovdqu8 zmm23, "[$rn]";
$t->splitFullRightNode;
PrintOutRegisterInHex reverse zmm(23..31);
ok Assemble(debug => 0, eq => <<END);
zmm31: 0000 00C1 0000 000D 0000 0000 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0018 0000 0001
zmm30: 0000 00C2 0000 0000 0000 0000 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0018 0000 0001
zmm29: 0000 00CC 0000 0000 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 00BB 0000 00AA 0000 0001
zmm28: 0000 00A1 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm27: 0000 00A2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm26: 0000 00AA 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm25: 0000 00B1 0000 0006 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
zmm24: 0000 00B2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
zmm23: 0000 00BB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
END
}
#latest:
if (1) { # Insert at start rather than insert in middle
my $tk = Rd(1..12, 0, 0, 12, 0xC1);
my $td = Rd(1..12, 0, 0, 0, 0xC2);
my $tn = Rd(0xBB, 2, 3..13, 0, 0, 0xCC);
my $lk = Rd(17..30, 14, 0xA1);
my $ld = Rd(17..30, 0xCC, 0xA2);
my $ln = Rd(17..31, 0xAA);
my $rk = Rd(17..30, 14, 0xB1);
my $rd = Rd(17..30, 0xCC, 0xB2);
my $rn = Rd(17..31, 0xBB);
my $b = CreateArena;
my $t = $b->CreateTree;
Vmovdqu8 zmm31, "[$tk]";
Vmovdqu8 zmm30, "[$td]";
Vmovdqu8 zmm29, "[$tn]";
Vmovdqu8 zmm28, "[$lk]";
Vmovdqu8 zmm27, "[$ld]";
Vmovdqu8 zmm26, "[$ln]";
Vmovdqu8 zmm25, "[$rk]";
Vmovdqu8 zmm24, "[$rd]";
Vmovdqu8 zmm23, "[$rn]";
$t->splitFullRightNode;
PrintOutRegisterInHex reverse zmm(23..31);
ok Assemble(debug => 0, eq => <<END);
zmm31: 0000 00C1 0000 000D 0000 0000 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001 0000 0018
zmm30: 0000 00C2 0000 0000 0000 0000 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001 0000 0018
zmm29: 0000 00CC 0000 0000 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 00BB 0000 00AA
zmm28: 0000 00A1 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm27: 0000 00A2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm26: 0000 00AA 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm25: 0000 00B1 0000 0006 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
zmm24: 0000 00B2 0000 00CC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
zmm23: 0000 00BB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019
END
}
#latest:
if (1) { #TLoadBitsIntoMaskRegister
for (0..7)
{ClearRegisters "k$_";
K($_,$_)->setMaskBit("k$_");
PrintOutRegisterInHex "k$_";
}
ClearRegisters k7;
LoadBitsIntoMaskRegister(k7, r15, \'1010\', -4, +4, -2, +2, -1, +1, -1, +1);
PrintOutRegisterInHex "k7";
ok Assemble(debug => 0, eq => <<END);
k0: 0000 0000 0000 0001
k1: 0000 0000 0000 0002
k2: 0000 0000 0000 0004
k3: 0000 0000 0000 0008
k4: 0000 0000 0000 0010
k5: 0000 0000 0000 0020
k6: 0000 0000 0000 0040
k7: 0000 0000 0000 0080
k7: 0000 0000 000A 0F35
END
}
#latest:
if (1) { #TInsertZeroIntoRegisterAtPoint #TInsertOneIntoRegisterAtPoint
Mov r15, 0x100; # Given a register with a single one in it indicating the desired position,
Mov r14, 0xFFDC; # Insert a zero into the register at that position shifting the bits above that position up left one to make space for the new zero.
Mov r13, 0xF03F;
PrintOutRegisterInHex r14, r15;
InsertZeroIntoRegisterAtPoint r15, r14;
PrintOutRegisterInHex r14;
Or r14, r15; # Replace the inserted zero with a one
PrintOutRegisterInHex r14;
InsertOneIntoRegisterAtPoint r15, r13;
PrintOutRegisterInHex r13;
ok Assemble(debug => 0, eq => <<END);
r14: 0000 0000 0000 FFDC
r15: 0000 0000 0000 0100
r14: 0000 0000 0001 FEDC
r14: 0000 0000 0001 FFDC
r13: 0000 0000 0001 E13F
END
}
#latest:
if (1) { #TNasm::X86::Tree::dump
my $A = CreateArena;
my $t = $A->CreateTree;
$t->insert(K(\'key\', 0x99), K(\'data\', 0xcc));
$A->dump;
$t->dump;
ok Assemble(debug => 0, eq => <<END);
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0098
Block: 0000 0000 0000 0000 0010 0000 0000 00009800 0000 0000 00000000 0000 0000 00009900 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000100 0000 5800 0000CC00 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00000200 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Tree at: 0000 0000 0000 0018 length: 0000 0000 0000 0001
Keys: 0000 0058 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0099
Data: 0000 0000 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00CC
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0099 data: 0000 0000 0000 00CC
end
END
}
#latest:
if (1) { # Replace a scalar with a tree in the first node
my $b = CreateArena;
my $t = $b->CreateTree;
my $k = V(key, 15);
my $d = V(data, 14);
$t->insert($k, $d); $d->outNL; # Uses \'up\'
$t->insertTree($k); $t->data->outNL; # Retrieve the sub tree rather than creating a new sub tree
$t->insertTree($k); $t->data->outNL;
ok Assemble(debug => 0, eq => <<END);
data: 0000 0000 0000 000E
data: 0000 0000 0000 0098
data: 0000 0000 0000 0098
END
}
#latest:
if (1) { # Replace a scalar with a tree in the first node
my $b = CreateArena;
my $t = $b->CreateTree;
my $k = V(key, 15);
my $d = V(data, 14);
for my $i(1..11) # Create new sub trees
{$t->insertTree(V(key, $i)); $t->data->outNL; # Retrieve the sub tree rather than creating a new new sub tree
}
$b->dump;
ok Assemble(debug => 0, eq => <<END); # Tree bits at 0x50
data: 0000 0000 0000 0098
data: 0000 0000 0000 0118
data: 0000 0000 0000 0198
data: 0000 0000 0000 0218
data: 0000 0000 0000 0298
data: 0000 0000 0000 0318
data: 0000 0000 0000 0398
data: 0000 0000 0000 0418
data: 0000 0000 0000 0498
data: 0000 0000 0000 0518
data: 0000 0000 0000 0598
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0618
Block: 0000 0000 0000 0000 0010 0000 0000 00001806 0000 0000 00000000 0000 0000 00000100 0000 0200 00000300 0000 0400 00000500 0000 0600 00000700 0000 0800 00000900 0000 0A00 0000
Block: 0000 0000 0000 0001 0B00 0000 0000 00000000 0000 0000 00000B00 FF07 5800 00009800 0000 1801 00009801 0000 1802 00009802 0000 1803 00009803 0000 1804 00009804 0000 1805 0000
Block: 0000 0000 0000 0002 9805 0000 0000 00000000 0000 0000 00001600 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
#latest:
if (1) { #TNasm::X86::Tree::setOrClearTreeBits
ClearRegisters zmm0;
my $b = CreateArena;
my $t = $b->CreateTree;
Mov r15, 8;
$t->setTree (r15, 0); PrintOutRegisterInHex zmm0;
$t->isTree (r15, 0); PrintOutZF;
Mov r15, 16;
$t->isTree (r15, 0); PrintOutZF;
$t->setTree (r15, 0); PrintOutRegisterInHex zmm0;
$t->clearTree(r15, 0); PrintOutRegisterInHex zmm0;
$t->isTree (r15, 0); PrintOutZF;
ok Assemble(debug => 0, eq => <<END);
zmm0: 0000 0000 0008 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
ZF=0
ZF=1
zmm0: 0000 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 0008 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
ZF=1
END
}
#latest:
if (1) { #TNasm::X86::Tree::transferTreeBitsFromParent
my $B = Rb(0..63);
Vmovdqu8 zmm0, "[$B]";
loadFromZmm r15, w, zmm, 14;
my $b = CreateArena;
my $t = $b->CreateTree;
$t->getTreeBits(0, r14);
PrintOutRegisterInHex zmm0, r15, r14;
Mov r14, my $treeBits = 0xDCBA;
$t->putTreeBits(1, r14);
PrintOutRegisterInHex zmm1;
$t->transferTreeBitsFromParent(1, 2, 3);
PrintOutStringNL "Split:";
PrintOutRegisterInHex zmm1, zmm2, zmm3;
my $left = $treeBits & ((1<<$t->leftLength) - 1);
my $right = ($treeBits >> ($t->leftLength + 1)) & ((1<<$t->rightLength) - 1);
my $l = sprintf("%02X", $left);
my $r = sprintf("%02X", $right);
ok Assemble(debug => 0, eq => <<END);
zmm0: 3F3E 3D3C 3B3A 3938 3736 3534 3332 3130 2F2E 2D2C 2B2A 2928 2726 2524 2322 2120 1F1E 1D1C 1B1A 1918 1716 1514 1312 1110 0F0E 0D0C 0B0A 0908 0706 0504 0302 0100
r15: 0000 0000 0000 0F0E
r14: 0000 0000 0000 3B3A
zmm1: 0000 0000 DCBA 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Split:
zmm1: 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm2: 0000 0000 00$l 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm3: 0000 0000 00$r 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
END
}
#latest:
if (1) { #TNasm::X86::Tree::transferTreeBitsFromLeft #TNasm::X86::Tree::transferTreeBitsFromRight
my $b = CreateArena;
my $t = $b->CreateTree;
my $lR = "110110";
my $lP = "1";
my $lL = "1110111";
my $p1 = "01010_110010";
my $p2 = "1";
my $epe = sprintf("%04X", eval "0b$p1$lP$p2");
my $ele = sprintf("%04X", eval "0b$lL" );
my $ere = sprintf("%04X", eval "0b$lR" );
my @expected;
for my $i(0..1)
{Mov r15, eval "0b$lR$lP$lL"; $t->putTreeBits(1+$i, r15);
Mov r15, eval "0b$p1$p2"; $t->putTreeBits(0, r15);
PrintOutRegisterInHex zmm 0, 1+$i;
Mov r15, 0b10;
$t->transferTreeBitsFromLeft (r15, 0, 1, 2) unless $i;
$t->transferTreeBitsFromRight(r15, 0, 1, 2) if $i;
PrintOutRegisterInHex zmm 0..2;
my $zzz = $i ? "zmm2" : "zmm1";
push @expected, <<END;
zmm0: 0000 0000 0565 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
$zzz: 0000 0000 36F7 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 $epe 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 $ele 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm2: 0000 0000 $ere 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
END
}
ok Assemble(debug => 0, eq => join "", @expected);
}
#latest:
if (1) { #TNasm::X86::Tree::size
my $b = CreateArena;
my $t = $b->CreateTree;
my $s = $t->size;
$s->outNL;
V(count, 24)->for(sub
{my ($index, $start, $next, $end) = @_;
my $k = $index + 1; my $d = $k + 0x100;
$t->insert($k, $d);
my $s = $t->size;
$s->outNL;
});
$t->getKeysDataNode($t->first, 31, 30, 29);
PrintOutStringNL "Root"; $t->first->outNL(\'First: \');
PrintOutRegisterInHex zmm31, zmm30, zmm29;
$t->getKeysDataNode(V(offset, 0xd8), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0x258), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0x198), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
ok Assemble(debug => 0, eq => <<END);
size: 0000 0000 0000 0000
size: 0000 0000 0000 0001
size: 0000 0000 0000 0002
size: 0000 0000 0000 0003
size: 0000 0000 0000 0004
size: 0000 0000 0000 0005
size: 0000 0000 0000 0006
size: 0000 0000 0000 0007
size: 0000 0000 0000 0008
size: 0000 0000 0000 0009
size: 0000 0000 0000 000A
size: 0000 0000 0000 000B
size: 0000 0000 0000 000C
size: 0000 0000 0000 000D
size: 0000 0000 0000 000E
size: 0000 0000 0000 000F
size: 0000 0000 0000 0010
size: 0000 0000 0000 0011
size: 0000 0000 0000 0012
size: 0000 0000 0000 0013
size: 0000 0000 0000 0014
size: 0000 0000 0000 0015
size: 0000 0000 0000 0016
size: 0000 0000 0000 0017
size: 0000 0000 0000 0018
Root
First: 0000 0000 0000 0018
zmm31: 0000 0058 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 0000 0008
zmm30: 0000 0098 0000 0030 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0110 0000 0108
zmm29: 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0198 0000 0258 0000 00D8
Left
zmm28: 0000 0118 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm27: 0000 0158 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0107 0000 0106 0000 0105 0000 0104 0000 0103 0000 0102 0000 0101
zmm26: 0000 00D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 0298 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000F 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm27: 0000 02D8 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 010F 0000 010E 0000 010D 0000 010C 0000 010B 0000 010A 0000 0109
zmm26: 0000 0258 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 01D8 0000 0008 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0018 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011
zmm27: 0000 0218 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0118 0000 0117 0000 0116 0000 0115 0000 0114 0000 0113 0000 0112 0000 0111
zmm26: 0000 0198 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
END
}
#latest:
if (1) { # Replace a scalar with a tree in the first node
my $b = CreateArena;
my $t = $b->CreateTree;
my $k = V(key, 15);
for my $i(1..15) # Overflow the root node to force a split
{my $d = V(data, 2 * $i);
$t->insert (V(key, $i), $d), $d->outNL if $i % 2;
$t->insertTree(V(key, $i)), $t->data->outNL unless $i % 2;
}
$b->dump(20);
ok Assemble(debug => 0, eq => <<END);
data: 0000 0000 0000 0002
data: 0000 0000 0000 0098
data: 0000 0000 0000 0006
data: 0000 0000 0000 0118
data: 0000 0000 0000 000A
data: 0000 0000 0000 0198
data: 0000 0000 0000 000E
data: 0000 0000 0000 0218
data: 0000 0000 0000 0012
data: 0000 0000 0000 0298
data: 0000 0000 0000 0016
data: 0000 0000 0000 0318
data: 0000 0000 0000 001A
data: 0000 0000 0000 0398
data: 0000 0000 0000 001E
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 05D8
Block: 0000 0000 0000 0000 0010 0000 0000 0000D805 0000 0000 00000000 0000 0000 00000800 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0001 0000 0000 0000 00000000 0000 0000 00000100 0100 5800 00001802 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0002 0000 0000 0000 00000000 0000 0000 00001E00 0000 1804 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 D800 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0004 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0005 0000 0000 0000 00000000 0000 0000 00000000 0000 5801 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0006 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0007 0000 0000 0000 00000000 0000 0000 00000000 0000 D801 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0008 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0009 0000 0000 0000 00000000 0000 0000 00000000 0000 5802 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000A 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000B 0000 0000 0000 00000000 0000 0000 00000000 0000 D802 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000C 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000D 0000 0000 0000 00000000 0000 0000 00000000 0000 5803 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000E 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 000F 0000 0000 0000 00000000 0000 0000 00000000 0000 D803 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0010 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00005804 0000 1805 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0011 0000 0000 0000 00000000 0000 0000 00000000 0000 1800 00000100 0000 0200 00000300 0000 0400 00000500 0000 0600 00000700 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0012 0000 0000 0000 00000000 0000 0000 00000700 2A00 9804 00000200 0000 9800 00000600 0000 1801 00000A00 0000 9801 00000E00 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0013 0000 0000 0000 00000000 0000 0000 00000100 0000 D804 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
END
}
#latest:
if (1) { # Extended sub tree testing
my $b = CreateArena;
my $t = $b->CreateTree;
LoadZmm(0, (0) x 58, 0xf7, (0) x 5);
PrintOutRegisterInHex zmm0;
Mov r15, 2;
$t->expandTreeBitsWithZero(0, r15); PrintOutRegisterInHex zmm0;
$t->expandTreeBitsWithZero(0, r15); PrintOutRegisterInHex zmm0;
$t->expandTreeBitsWithZero(0, r15); PrintOutRegisterInHex zmm0;
$t->expandTreeBitsWithZero(0, r15); PrintOutRegisterInHex zmm0;
LoadZmm(1, (0) x 58, 0xf0, (0) x 5);
PrintOutRegisterInHex zmm1;
Mov r15, 2;
$t->expandTreeBitsWithOne(1, r15); PrintOutRegisterInHex zmm1;
$t->expandTreeBitsWithOne(1, r15); PrintOutRegisterInHex zmm1;
$t->expandTreeBitsWithOne(1, r15); PrintOutRegisterInHex zmm1;
$t->expandTreeBitsWithOne(1, r15); PrintOutRegisterInHex zmm1;
ok Assemble(debug => 0, eq => <<END);
zmm0: 0000 0000 00F7 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 01ED 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 03D9 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 07B1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm0: 0000 0000 0F61 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 00F0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 01E2 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 03C6 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 078E 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
zmm1: 0000 0000 0F1E 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
END
}
#latest:
if (1) {
my $N = 45; my $M = 0;
$N % 2 == 1 or confess "Must be odd";
my $b = CreateArena;
my $t = $b->CreateTree;
my $L = V(loop, $N);
my %I;
for(my $i = 0; $i < ($N-$M); ++$i) # The insertions we intend to make
{my $l = $N - $i;
if ($i % 2 == 0)
{$I{$i} = $l; # Scalar
$I{$l} = -1; # Tree
}
}
($L-$M)->for(sub # Do the planned insertions
{my ($i, $start, $next, $end) = @_;
my $l = $L - $i;
If ($i % 2 == 0, sub
{$t->insert($i, $l);
$t->insertTree($l);
});
});
($L+2)->for(sub # Find each key
{my ($i, $start, $next, $end) = @_;
$t->find($i);
$i->out(\'i: \'); $t->found->out(\' f: \'); $t->data->out(\' d: \'); $t->subTree->outNL(\' s: \');
});
Assemble(debug => 0);
if (1) # Check output has right structure
{my @r = readFile(q(zzzOut.txt));
for my $l(@r)
{my @w = split /\\s*\\w:\\s+/, $l;
shift @w; s/\\s+//gs for @w; $_ = eval("0x$_") for @w;
my ($k, $f, $d, $s) = @w;
# Inserted
if (defined(my $D = $I{$k}))
{if ($D >= 0) # Scalar
{$f == 1 or warn "F != 1 at key $k";
$d == $D or warn "Wrong data at key $k";
$s == 0 or warn "Wrong subTree at key $k";
}
else
{$d % 16 == 8 or warn "Wrong data at key $k";
$s == 1 or warn "Wrong subTree at key $k";
}
}
else
{$f == 0 && $d == 0 && $s == 0 or confess "Find should fail at key $k";
}
}
};
is_deeply scalar(readFile(q(zzzOut.txt))), <<END if $N == 45;
i: 0000 0000 0000 0000 f: 0000 0000 0000 0001 d: 0000 0000 0000 002D s: 0000 0000 0000 0000
i: 0000 0000 0000 0001 f: 0000 0000 0000 0001 d: 0000 0000 0000 0ED8 s: 0000 0000 0000 0001
i: 0000 0000 0000 0002 f: 0000 0000 0000 0001 d: 0000 0000 0000 002B s: 0000 0000 0000 0000
i: 0000 0000 0000 0003 f: 0000 0000 0000 0001 d: 0000 0000 0000 0E58 s: 0000 0000 0000 0001
i: 0000 0000 0000 0004 f: 0000 0000 0000 0001 d: 0000 0000 0000 0029 s: 0000 0000 0000 0000
i: 0000 0000 0000 0005 f: 0000 0000 0000 0001 d: 0000 0000 0000 0DD8 s: 0000 0000 0000 0001
i: 0000 0000 0000 0006 f: 0000 0000 0000 0001 d: 0000 0000 0000 0027 s: 0000 0000 0000 0000
i: 0000 0000 0000 0007 f: 0000 0000 0000 0001 d: 0000 0000 0000 0D58 s: 0000 0000 0000 0001
i: 0000 0000 0000 0008 f: 0000 0000 0000 0001 d: 0000 0000 0000 0025 s: 0000 0000 0000 0000
i: 0000 0000 0000 0009 f: 0000 0000 0000 0001 d: 0000 0000 0000 0CD8 s: 0000 0000 0000 0001
i: 0000 0000 0000 000A f: 0000 0000 0000 0001 d: 0000 0000 0000 0023 s: 0000 0000 0000 0000
i: 0000 0000 0000 000B f: 0000 0000 0000 0001 d: 0000 0000 0000 0C58 s: 0000 0000 0000 0001
i: 0000 0000 0000 000C f: 0000 0000 0000 0001 d: 0000 0000 0000 0021 s: 0000 0000 0000 0000
i: 0000 0000 0000 000D f: 0000 0000 0000 0001 d: 0000 0000 0000 0BD8 s: 0000 0000 0000 0001
i: 0000 0000 0000 000E f: 0000 0000 0000 0001 d: 0000 0000 0000 001F s: 0000 0000 0000 0000
i: 0000 0000 0000 000F f: 0000 0000 0000 0001 d: 0000 0000 0000 0B58 s: 0000 0000 0000 0001
i: 0000 0000 0000 0010 f: 0000 0000 0000 0001 d: 0000 0000 0000 001D s: 0000 0000 0000 0000
i: 0000 0000 0000 0011 f: 0000 0000 0000 0001 d: 0000 0000 0000 0AD8 s: 0000 0000 0000 0001
i: 0000 0000 0000 0012 f: 0000 0000 0000 0001 d: 0000 0000 0000 001B s: 0000 0000 0000 0000
i: 0000 0000 0000 0013 f: 0000 0000 0000 0001 d: 0000 0000 0000 0998 s: 0000 0000 0000 0001
i: 0000 0000 0000 0014 f: 0000 0000 0000 0001 d: 0000 0000 0000 0019 s: 0000 0000 0000 0000
i: 0000 0000 0000 0015 f: 0000 0000 0000 0001 d: 0000 0000 0000 0918 s: 0000 0000 0000 0001
i: 0000 0000 0000 0016 f: 0000 0000 0000 0001 d: 0000 0000 0000 0017 s: 0000 0000 0000 0000
i: 0000 0000 0000 0017 f: 0000 0000 0000 0001 d: 0000 0000 0000 0898 s: 0000 0000 0000 0001
i: 0000 0000 0000 0018 f: 0000 0000 0000 0001 d: 0000 0000 0000 0015 s: 0000 0000 0000 0000
i: 0000 0000 0000 0019 f: 0000 0000 0000 0001 d: 0000 0000 0000 0818 s: 0000 0000 0000 0001
i: 0000 0000 0000 001A f: 0000 0000 0000 0001 d: 0000 0000 0000 0013 s: 0000 0000 0000 0000
i: 0000 0000 0000 001B f: 0000 0000 0000 0001 d: 0000 0000 0000 06D8 s: 0000 0000 0000 0001
i: 0000 0000 0000 001C f: 0000 0000 0000 0001 d: 0000 0000 0000 0011 s: 0000 0000 0000 0000
i: 0000 0000 0000 001D f: 0000 0000 0000 0001 d: 0000 0000 0000 0658 s: 0000 0000 0000 0001
i: 0000 0000 0000 001E f: 0000 0000 0000 0001 d: 0000 0000 0000 000F s: 0000 0000 0000 0000
i: 0000 0000 0000 001F f: 0000 0000 0000 0001 d: 0000 0000 0000 05D8 s: 0000 0000 0000 0001
i: 0000 0000 0000 0020 f: 0000 0000 0000 0001 d: 0000 0000 0000 000D s: 0000 0000 0000 0000
i: 0000 0000 0000 0021 f: 0000 0000 0000 0001 d: 0000 0000 0000 0398 s: 0000 0000 0000 0001
i: 0000 0000 0000 0022 f: 0000 0000 0000 0001 d: 0000 0000 0000 000B s: 0000 0000 0000 0000
i: 0000 0000 0000 0023 f: 0000 0000 0000 0001 d: 0000 0000 0000 0318 s: 0000 0000 0000 0001
i: 0000 0000 0000 0024 f: 0000 0000 0000 0001 d: 0000 0000 0000 0009 s: 0000 0000 0000 0000
i: 0000 0000 0000 0025 f: 0000 0000 0000 0001 d: 0000 0000 0000 0298 s: 0000 0000 0000 0001
i: 0000 0000 0000 0026 f: 0000 0000 0000 0001 d: 0000 0000 0000 0007 s: 0000 0000 0000 0000
i: 0000 0000 0000 0027 f: 0000 0000 0000 0001 d: 0000 0000 0000 0218 s: 0000 0000 0000 0001
i: 0000 0000 0000 0028 f: 0000 0000 0000 0001 d: 0000 0000 0000 0005 s: 0000 0000 0000 0000
i: 0000 0000 0000 0029 f: 0000 0000 0000 0001 d: 0000 0000 0000 0198 s: 0000 0000 0000 0001
i: 0000 0000 0000 002A f: 0000 0000 0000 0001 d: 0000 0000 0000 0003 s: 0000 0000 0000 0000
i: 0000 0000 0000 002B f: 0000 0000 0000 0001 d: 0000 0000 0000 0118 s: 0000 0000 0000 0001
i: 0000 0000 0000 002C f: 0000 0000 0000 0001 d: 0000 0000 0000 0001 s: 0000 0000 0000 0000
i: 0000 0000 0000 002D f: 0000 0000 0000 0001 d: 0000 0000 0000 0098 s: 0000 0000 0000 0001
i: 0000 0000 0000 002E f: 0000 0000 0000 0000 d: 0000 0000 0000 0000 s: 0000 0000 0000 0000
END
}
#latest:
if (1) {
my $b = CreateArena;
my $t = $b->CreateTree;
my $d = V(data);
my $f = V(found);
my $N = 24;
V(count, $N)->for(sub
{my ($index, $start, $next, $end) = @_;
if (1)
{my $k = $index * 2 + 1; my $d = $k + 0x100;
$t->insert($k, $d);
}
if (1)
{my $k = $index * -2 + 2 * $N; my $d = $k + 0x100;
$t->insert($k, $d);
}
});
$t->getKeysDataNode($t->first, 31, 30, 29);
PrintOutStringNL "Root"; $t->first->outNL(\'First: \');
PrintOutRegisterInHex zmm31, zmm30, zmm29;
$t->getKeysDataNode(V(offset, 0x258), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0x3d8), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0x318), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0xd8), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->getKeysDataNode(V(offset, 0x198), 28,27,26);
PrintOutStringNL "Left";
PrintOutRegisterInHex zmm28, zmm27, zmm26;
$t->find(V(key, 0xffff)); $t->found->outNL(\'Found: \');
$t->find(V(key, 0x1b) ); $t->found->outNL(\'Found: \');
ok Assemble(debug => 0, eq => <<END);
Root
First: 0000 0000 0000 0018
zmm31: 0000 0058 0000 0004 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0024 0000 001A 0000 000F 0000 0008
zmm30: 0000 0098 0000 0060 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0124 0000 011A 0000 010F 0000 0108
zmm29: 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0198 0000 00D8 0000 0318 0000 03D8 0000 0258
Left
zmm28: 0000 0298 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001
zmm27: 0000 02D8 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0107 0000 0106 0000 0105 0000 0104 0000 0103 0000 0102 0000 0101
zmm26: 0000 0258 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 0418 0000 0006 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009
zmm27: 0000 0458 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 010E 0000 010D 0000 010C 0000 010B 0000 010A 0000 0109
zmm26: 0000 03D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 0358 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0019 0000 0018 0000 0017 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011 0000 0010
zmm27: 0000 0398 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0119 0000 0118 0000 0117 0000 0116 0000 0115 0000 0114 0000 0113 0000 0112 0000 0111 0000 0110
zmm26: 0000 0318 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 0118 0000 0009 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0023 0000 0022 0000 0021 0000 0020 0000 001F 0000 001E 0000 001D 0000 001C 0000 001B
zmm27: 0000 0158 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0123 0000 0122 0000 0121 0000 0120 0000 011F 0000 011E 0000 011D 0000 011C 0000 011B
zmm26: 0000 00D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Left
zmm28: 0000 01D8 0000 000C 0000 0000 0000 0000 0000 0030 0000 002F 0000 002E 0000 002D 0000 002C 0000 002B 0000 002A 0000 0029 0000 0028 0000 0027 0000 0026 0000 0025
zmm27: 0000 0218 0000 0001 0000 0000 0000 0000 0000 0130 0000 012F 0000 012E 0000 012D 0000 012C 0000 012B 0000 012A 0000 0129 0000 0128 0000 0127 0000 0126 0000 0125
zmm26: 0000 0198 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Found: 0000 0000 0000 0000
Found: 0000 0000 0000 0001
END
}
#latest:
if (1) { #TNasm::X86::Arena::CreateTree
my $N = 12;
my $b = CreateArena;
my $t = $b->CreateTree;
K(count, $N)->for(sub # Add some entries to the tree
{my ($index, $start, $next, $end) = @_;
my $k = $index + 1;
$t->insert($k, $k + 0x100);
$t->insert($k + $N, $k + 0x200);
});
$t->by(sub # Iterate through the tree
{my ($iter, $end) = @_;
$iter->key ->out(\'key: \');
$iter->data->out(\' data: \');
my $D = V(depth);
$iter->tree->depth($t->address, $iter->node, $D);
$t->find($iter->key);
$t->found->out(\' found: \'); $t->data->out(\' data: \'); $D->outNL(\' depth: \');
});
$t->find(K(key, 0xffff)); $t->found->outNL(\'Found: \'); # Find some entries
$t->find(K(key, 0xd)); $t->found->outNL(\'Found: \');
If ($t->found > 0,
Then
{$t->data->outNL("Data : ");
});
ok Assemble(debug => 0, eq => <<END);
key: 0000 0000 0000 0001 data: 0000 0000 0000 0101 found: 0000 0000 0000 0001 data: 0000 0000 0000 0101 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0002 data: 0000 0000 0000 0102 found: 0000 0000 0000 0001 data: 0000 0000 0000 0102 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0003 data: 0000 0000 0000 0103 found: 0000 0000 0000 0001 data: 0000 0000 0000 0103 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0004 data: 0000 0000 0000 0104 found: 0000 0000 0000 0001 data: 0000 0000 0000 0104 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0005 data: 0000 0000 0000 0105 found: 0000 0000 0000 0001 data: 0000 0000 0000 0105 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0006 data: 0000 0000 0000 0106 found: 0000 0000 0000 0001 data: 0000 0000 0000 0106 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0007 data: 0000 0000 0000 0107 found: 0000 0000 0000 0001 data: 0000 0000 0000 0107 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0008 data: 0000 0000 0000 0108 found: 0000 0000 0000 0001 data: 0000 0000 0000 0108 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0009 data: 0000 0000 0000 0109 found: 0000 0000 0000 0001 data: 0000 0000 0000 0109 depth: 0000 0000 0000 0002
key: 0000 0000 0000 000A data: 0000 0000 0000 010A found: 0000 0000 0000 0001 data: 0000 0000 0000 010A depth: 0000 0000 0000 0002
key: 0000 0000 0000 000B data: 0000 0000 0000 010B found: 0000 0000 0000 0001 data: 0000 0000 0000 010B depth: 0000 0000 0000 0002
key: 0000 0000 0000 000C data: 0000 0000 0000 010C found: 0000 0000 0000 0001 data: 0000 0000 0000 010C depth: 0000 0000 0000 0002
key: 0000 0000 0000 000D data: 0000 0000 0000 0201 found: 0000 0000 0000 0001 data: 0000 0000 0000 0201 depth: 0000 0000 0000 0001
key: 0000 0000 0000 000E data: 0000 0000 0000 0202 found: 0000 0000 0000 0001 data: 0000 0000 0000 0202 depth: 0000 0000 0000 0002
key: 0000 0000 0000 000F data: 0000 0000 0000 0203 found: 0000 0000 0000 0001 data: 0000 0000 0000 0203 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0010 data: 0000 0000 0000 0204 found: 0000 0000 0000 0001 data: 0000 0000 0000 0204 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0011 data: 0000 0000 0000 0205 found: 0000 0000 0000 0001 data: 0000 0000 0000 0205 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0012 data: 0000 0000 0000 0206 found: 0000 0000 0000 0001 data: 0000 0000 0000 0206 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0013 data: 0000 0000 0000 0207 found: 0000 0000 0000 0001 data: 0000 0000 0000 0207 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0014 data: 0000 0000 0000 0208 found: 0000 0000 0000 0001 data: 0000 0000 0000 0208 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0015 data: 0000 0000 0000 0209 found: 0000 0000 0000 0001 data: 0000 0000 0000 0209 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0016 data: 0000 0000 0000 020A found: 0000 0000 0000 0001 data: 0000 0000 0000 020A depth: 0000 0000 0000 0002
key: 0000 0000 0000 0017 data: 0000 0000 0000 020B found: 0000 0000 0000 0001 data: 0000 0000 0000 020B depth: 0000 0000 0000 0002
key: 0000 0000 0000 0018 data: 0000 0000 0000 020C found: 0000 0000 0000 0001 data: 0000 0000 0000 020C depth: 0000 0000 0000 0002
Found: 0000 0000 0000 0000
Found: 0000 0000 0000 0001
Data : 0000 0000 0000 0201
END
}
#latest:
if (1) { #TNasm::X86::Tree::insertTreeAndReload #TNasm::X86::Tree::Reload #TNasm::X86::Tree::findAndReload
my $L = K(loop, 4);
my $b = CreateArena;
my $T = $b->CreateTree;
my $t = $T->reload;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$t->insertTreeAndReload($i);
$t->first->outNL;
});
$t->insert($L, $L*2);
my $f = $T->reload;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$f->findAndReload($i);
$i->out(\'i: \'); $f->found->out(\' f: \'); $f->data->out(\' d: \'); $f->subTree->outNL(\' s: \');
});
$f->find($L);
$L->out(\'N: \'); $f->found->out(\' f: \'); $f->data->out(\' d: \'); $f->subTree->outNL(\' s: \');
ok Assemble(debug => 0, eq => <<END);
first: 0000 0000 0000 0098
first: 0000 0000 0000 0118
first: 0000 0000 0000 0198
first: 0000 0000 0000 0218
i: 0000 0000 0000 0000 f: 0000 0000 0000 0001 d: 0000 0000 0000 0098 s: 0000 0000 0000 0001
i: 0000 0000 0000 0001 f: 0000 0000 0000 0001 d: 0000 0000 0000 0118 s: 0000 0000 0000 0001
i: 0000 0000 0000 0002 f: 0000 0000 0000 0001 d: 0000 0000 0000 0198 s: 0000 0000 0000 0001
i: 0000 0000 0000 0003 f: 0000 0000 0000 0001 d: 0000 0000 0000 0218 s: 0000 0000 0000 0001
N: 0000 0000 0000 0004 f: 0000 0000 0000 0001 d: 0000 0000 0000 0008 s: 0000 0000 0000 0000
END
}
#latest:
if (1) { #TNasm::X86::Tree::insert #TNasm::X86::Tree::print
my $b = CreateArena;
my $t = $b->CreateTree;
my $T = $b->CreateTree;
$T->insert(K(key, 2), K(data, 4));
$t->insert(K(key, 5), K(data, 7));
$T->print;
$t->print;
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0098
key: 0000 0000 0000 0002 data: 0000 0000 0000 0004 depth: 0000 0000 0000 0001
Tree at: 0000 0000 0000 0018
key: 0000 0000 0000 0005 data: 0000 0000 0000 0007 depth: 0000 0000 0000 0001
END
}
#latest:
if (0) { ### print/iter #TNasm::X86::Tree::insertTree
my $b = CreateArena;
my $t = $b->CreateTree;
my $T = $b->CreateTree;
$T->insert (K(key, 2), K(data, 4));
$t->insertTree(K(key, 1), $T);
$t->print;
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0098
key: 0000 0000 0000 0002 data: 0000 0000 0000 0004 depth: 0000 0000 0000 0001
Tree at: 0000 0000 0000 0018
key: 0000 0000 0000 0005 data: 0000 0000 0000 0007 depth: 0000 0000 0000 0001
END
}
#latest:
if (1) { #TNasm::X86::Tree::insertTree # Trees doubled
my $L = K(loop, 11);
my $b = CreateArena;
my $B = CreateArena;
my $t = $b->CreateTree;
my $T = $B->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$t->insert($i+0x11, K(data, 0xFF));
$T->insert($i+0x22, K(data, 0xDD));
});
$b->dump;
$B->dump;
$t->print;
$T->print;
ok Assemble(debug => 0, eq => <<END);
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0098
Block: 0000 0000 0000 0000 0010 0000 0000 00009800 0000 0000 00000000 0000 0000 00001100 0000 1200 00001300 0000 1400 00001500 0000 1600 00001700 0000 1800 00001900 0000 1A00 0000
Block: 0000 0000 0000 0001 1B00 0000 0000 00000000 0000 0000 00000B00 0000 5800 0000FF00 0000 FF00 0000FF00 0000 FF00 0000FF00 0000 FF00 0000FF00 0000 FF00 0000FF00 0000 FF00 0000
Block: 0000 0000 0000 0002 FF00 0000 0000 00000000 0000 0000 00001600 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Arena
Size: 0000 0000 0000 1000
Used: 0000 0000 0000 0098
Block: 0000 0000 0000 0000 0010 0000 0000 00009800 0000 0000 00000000 0000 0000 00002200 0000 2300 00002400 0000 2500 00002600 0000 2700 00002800 0000 2900 00002A00 0000 2B00 0000
Block: 0000 0000 0000 0001 2C00 0000 0000 00000000 0000 0000 00000B00 0000 5800 0000DD00 0000 DD00 0000DD00 0000 DD00 0000DD00 0000 DD00 0000DD00 0000 DD00 0000DD00 0000 DD00 0000
Block: 0000 0000 0000 0002 DD00 0000 0000 00000000 0000 0000 00001600 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Block: 0000 0000 0000 0003 0000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
Tree at: 0000 0000 0000 0018
key: 0000 0000 0000 0011 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0012 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0013 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0014 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0015 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0016 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0017 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0018 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 0019 data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 001A data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
key: 0000 0000 0000 001B data: 0000 0000 0000 00FF depth: 0000 0000 0000 0001
Tree at: 0000 0000 0000 0018
key: 0000 0000 0000 0022 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0023 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0024 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0025 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0026 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0027 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0028 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 0029 data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 002A data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 002B data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
key: 0000 0000 0000 002C data: 0000 0000 0000 00DD depth: 0000 0000 0000 0001
END
}
#latest:
if (1) { #TNasm::X86::Tree::print
my $L = V(loop, 45);
my $b = CreateArena;
my $t = $b->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
my $l = $L - $i;
If ($i % 2 == 0, sub
{$t->insert($i, $l);
$t->insertTree($l);
});
});
$t->print;
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0018
key: 0000 0000 0000 0000 data: 0000 0000 0000 002D depth: 0000 0000 0000 0002
key: 0000 0000 0000 0001 data: 0000 0000 0000 0ED8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0ED8
key: 0000 0000 0000 0002 data: 0000 0000 0000 002B depth: 0000 0000 0000 0002
key: 0000 0000 0000 0003 data: 0000 0000 0000 0E58 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0E58
key: 0000 0000 0000 0004 data: 0000 0000 0000 0029 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0005 data: 0000 0000 0000 0DD8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0DD8
key: 0000 0000 0000 0006 data: 0000 0000 0000 0027 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0007 data: 0000 0000 0000 0D58 depth: 0000 0000 0000 0001
Tree at: 0000 0000 0000 0D58
key: 0000 0000 0000 0008 data: 0000 0000 0000 0025 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0009 data: 0000 0000 0000 0CD8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0CD8
key: 0000 0000 0000 000A data: 0000 0000 0000 0023 depth: 0000 0000 0000 0002
key: 0000 0000 0000 000B data: 0000 0000 0000 0C58 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0C58
key: 0000 0000 0000 000C data: 0000 0000 0000 0021 depth: 0000 0000 0000 0002
key: 0000 0000 0000 000D data: 0000 0000 0000 0BD8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0BD8
key: 0000 0000 0000 000E data: 0000 0000 0000 001F depth: 0000 0000 0000 0001
key: 0000 0000 0000 000F data: 0000 0000 0000 0B58 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0B58
key: 0000 0000 0000 0010 data: 0000 0000 0000 001D depth: 0000 0000 0000 0002
key: 0000 0000 0000 0011 data: 0000 0000 0000 0AD8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0AD8
key: 0000 0000 0000 0012 data: 0000 0000 0000 001B depth: 0000 0000 0000 0002
key: 0000 0000 0000 0013 data: 0000 0000 0000 0998 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0998
key: 0000 0000 0000 0014 data: 0000 0000 0000 0019 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0015 data: 0000 0000 0000 0918 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0918
key: 0000 0000 0000 0016 data: 0000 0000 0000 0017 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0017 data: 0000 0000 0000 0898 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0898
key: 0000 0000 0000 0018 data: 0000 0000 0000 0015 depth: 0000 0000 0000 0001
key: 0000 0000 0000 0019 data: 0000 0000 0000 0818 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0818
key: 0000 0000 0000 001A data: 0000 0000 0000 0013 depth: 0000 0000 0000 0002
key: 0000 0000 0000 001B data: 0000 0000 0000 06D8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 06D8
key: 0000 0000 0000 001C data: 0000 0000 0000 0011 depth: 0000 0000 0000 0002
key: 0000 0000 0000 001D data: 0000 0000 0000 0658 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0658
key: 0000 0000 0000 001E data: 0000 0000 0000 000F depth: 0000 0000 0000 0002
key: 0000 0000 0000 001F data: 0000 0000 0000 05D8 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 05D8
key: 0000 0000 0000 0020 data: 0000 0000 0000 000D depth: 0000 0000 0000 0002
key: 0000 0000 0000 0021 data: 0000 0000 0000 0398 depth: 0000 0000 0000 0001
Tree at: 0000 0000 0000 0398
key: 0000 0000 0000 0022 data: 0000 0000 0000 000B depth: 0000 0000 0000 0002
key: 0000 0000 0000 0023 data: 0000 0000 0000 0318 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0318
key: 0000 0000 0000 0024 data: 0000 0000 0000 0009 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0025 data: 0000 0000 0000 0298 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0298
key: 0000 0000 0000 0026 data: 0000 0000 0000 0007 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0027 data: 0000 0000 0000 0218 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0218
key: 0000 0000 0000 0028 data: 0000 0000 0000 0005 depth: 0000 0000 0000 0002
key: 0000 0000 0000 0029 data: 0000 0000 0000 0198 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0198
key: 0000 0000 0000 002A data: 0000 0000 0000 0003 depth: 0000 0000 0000 0002
key: 0000 0000 0000 002B data: 0000 0000 0000 0118 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0118
key: 0000 0000 0000 002C data: 0000 0000 0000 0001 depth: 0000 0000 0000 0002
key: 0000 0000 0000 002D data: 0000 0000 0000 0098 depth: 0000 0000 0000 0002
Tree at: 0000 0000 0000 0098
END
}
#latest:
if (1) { # Performance
my $d = V(byte)->getDFromZmm(31, 0, r8);
ok Assemble(debug => 0, eq => <<END);
END
}
#latest:
if (1) { # Print empty tree
my $b = CreateArena;
my $t = $b->CreateTree;
$t->dump();
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0018 length: 0000 0000 0000 0000
Keys: 0000 0058 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
END
}
#latest:
if (1) { # Performance of tree inserts
my $L = V(loop, 45);
my $b = CreateArena;
my $t = $b->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$t->insert($i, $i);
});
$t->dump();
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0018 length: 0000 0000 0000 0004
Keys: 0000 0058 0000 0004 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001F 0000 0017 0000 000F 0000 0007
Data: 0000 0098 0000 005A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001F 0000 0017 0000 000F 0000 0007
Node: 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0198 0000 03D8 0000 0318 0000 0258 0000 00D8
index: 0000 0000 0000 0000 key: 0000 0000 0000 0007 data: 0000 0000 0000 0007
index: 0000 0000 0000 0001 key: 0000 0000 0000 000F data: 0000 0000 0000 000F
index: 0000 0000 0000 0002 key: 0000 0000 0000 0017 data: 0000 0000 0000 0017
index: 0000 0000 0000 0003 key: 0000 0000 0000 001F data: 0000 0000 0000 001F
Tree at: 0000 0000 0000 00D8 length: 0000 0000 0000 0007
Keys: 0000 0118 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001 0000 0000
Data: 0000 0158 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001 0000 0000
Node: 0000 00D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0000 data: 0000 0000 0000 0000
index: 0000 0000 0000 0001 key: 0000 0000 0000 0001 data: 0000 0000 0000 0001
index: 0000 0000 0000 0002 key: 0000 0000 0000 0002 data: 0000 0000 0000 0002
index: 0000 0000 0000 0003 key: 0000 0000 0000 0003 data: 0000 0000 0000 0003
index: 0000 0000 0000 0004 key: 0000 0000 0000 0004 data: 0000 0000 0000 0004
index: 0000 0000 0000 0005 key: 0000 0000 0000 0005 data: 0000 0000 0000 0005
index: 0000 0000 0000 0006 key: 0000 0000 0000 0006 data: 0000 0000 0000 0006
end
Tree at: 0000 0000 0000 0258 length: 0000 0000 0000 0007
Keys: 0000 0298 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008
Data: 0000 02D8 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008
Node: 0000 0258 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0008 data: 0000 0000 0000 0008
index: 0000 0000 0000 0001 key: 0000 0000 0000 0009 data: 0000 0000 0000 0009
index: 0000 0000 0000 0002 key: 0000 0000 0000 000A data: 0000 0000 0000 000A
index: 0000 0000 0000 0003 key: 0000 0000 0000 000B data: 0000 0000 0000 000B
index: 0000 0000 0000 0004 key: 0000 0000 0000 000C data: 0000 0000 0000 000C
index: 0000 0000 0000 0005 key: 0000 0000 0000 000D data: 0000 0000 0000 000D
index: 0000 0000 0000 0006 key: 0000 0000 0000 000E data: 0000 0000 0000 000E
end
Tree at: 0000 0000 0000 0318 length: 0000 0000 0000 0007
Keys: 0000 0358 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011 0000 0010
Data: 0000 0398 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0016 0000 0015 0000 0014 0000 0013 0000 0012 0000 0011 0000 0010
Node: 0000 0318 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0010 data: 0000 0000 0000 0010
index: 0000 0000 0000 0001 key: 0000 0000 0000 0011 data: 0000 0000 0000 0011
index: 0000 0000 0000 0002 key: 0000 0000 0000 0012 data: 0000 0000 0000 0012
index: 0000 0000 0000 0003 key: 0000 0000 0000 0013 data: 0000 0000 0000 0013
index: 0000 0000 0000 0004 key: 0000 0000 0000 0014 data: 0000 0000 0000 0014
index: 0000 0000 0000 0005 key: 0000 0000 0000 0015 data: 0000 0000 0000 0015
index: 0000 0000 0000 0006 key: 0000 0000 0000 0016 data: 0000 0000 0000 0016
end
Tree at: 0000 0000 0000 03D8 length: 0000 0000 0000 0007
Keys: 0000 0418 0000 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019 0000 0018
Data: 0000 0458 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001E 0000 001D 0000 001C 0000 001B 0000 001A 0000 0019 0000 0018
Node: 0000 03D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0018 data: 0000 0000 0000 0018
index: 0000 0000 0000 0001 key: 0000 0000 0000 0019 data: 0000 0000 0000 0019
index: 0000 0000 0000 0002 key: 0000 0000 0000 001A data: 0000 0000 0000 001A
index: 0000 0000 0000 0003 key: 0000 0000 0000 001B data: 0000 0000 0000 001B
index: 0000 0000 0000 0004 key: 0000 0000 0000 001C data: 0000 0000 0000 001C
index: 0000 0000 0000 0005 key: 0000 0000 0000 001D data: 0000 0000 0000 001D
index: 0000 0000 0000 0006 key: 0000 0000 0000 001E data: 0000 0000 0000 001E
end
Tree at: 0000 0000 0000 0198 length: 0000 0000 0000 000D
Keys: 0000 01D8 0000 000D 0000 0000 0000 002C 0000 002B 0000 002A 0000 0029 0000 0028 0000 0027 0000 0026 0000 0025 0000 0024 0000 0023 0000 0022 0000 0021 0000 0020
Data: 0000 0218 0000 0001 0000 0000 0000 002C 0000 002B 0000 002A 0000 0029 0000 0028 0000 0027 0000 0026 0000 0025 0000 0024 0000 0023 0000 0022 0000 0021 0000 0020
Node: 0000 0198 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0020 data: 0000 0000 0000 0020
index: 0000 0000 0000 0001 key: 0000 0000 0000 0021 data: 0000 0000 0000 0021
index: 0000 0000 0000 0002 key: 0000 0000 0000 0022 data: 0000 0000 0000 0022
index: 0000 0000 0000 0003 key: 0000 0000 0000 0023 data: 0000 0000 0000 0023
index: 0000 0000 0000 0004 key: 0000 0000 0000 0024 data: 0000 0000 0000 0024
index: 0000 0000 0000 0005 key: 0000 0000 0000 0025 data: 0000 0000 0000 0025
index: 0000 0000 0000 0006 key: 0000 0000 0000 0026 data: 0000 0000 0000 0026
index: 0000 0000 0000 0007 key: 0000 0000 0000 0027 data: 0000 0000 0000 0027
index: 0000 0000 0000 0008 key: 0000 0000 0000 0028 data: 0000 0000 0000 0028
index: 0000 0000 0000 0009 key: 0000 0000 0000 0029 data: 0000 0000 0000 0029
index: 0000 0000 0000 000A key: 0000 0000 0000 002A data: 0000 0000 0000 002A
index: 0000 0000 0000 000B key: 0000 0000 0000 002B data: 0000 0000 0000 002B
index: 0000 0000 0000 000C key: 0000 0000 0000 002C data: 0000 0000 0000 002C
end
end
END
}
#latest:
if (1) { #TNasm::X86::Tree::dump
my $L = V(loop, 15);
my $b = CreateArena;
my $t = $b->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
If ($i % 2 == 0,
Then
{$t->insert ($i, $i);
},
Else
{$t->insertTree($i);
});
});
$t->dump();
ok Assemble(debug => 0, eq => <<END);
Tree at: 0000 0000 0000 0018 length: 0000 0000 0000 0001
Keys: 0000 0058 0001 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0007
Data: 0000 0418 0000 001E 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0218
Node: 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0518 0000 0458
index: 0000 0000 0000 0000 key: 0000 0000 0000 0007 data: 0000 0000 0000 0218 subTree
Tree at: 0000 0000 0000 0218 length: 0000 0000 0000 0000
Keys: 0000 0258 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
Tree at: 0000 0000 0000 0458 length: 0000 0000 0000 0007
Keys: 0000 0498 002A 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0006 0000 0005 0000 0004 0000 0003 0000 0002 0000 0001 0000 0000
Data: 0000 04D8 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0006 0000 0198 0000 0004 0000 0118 0000 0002 0000 0098 0000 0000
Node: 0000 0458 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0000 data: 0000 0000 0000 0000
index: 0000 0000 0000 0001 key: 0000 0000 0000 0001 data: 0000 0000 0000 0098 subTree
index: 0000 0000 0000 0002 key: 0000 0000 0000 0002 data: 0000 0000 0000 0002
index: 0000 0000 0000 0003 key: 0000 0000 0000 0003 data: 0000 0000 0000 0118 subTree
index: 0000 0000 0000 0004 key: 0000 0000 0000 0004 data: 0000 0000 0000 0004
index: 0000 0000 0000 0005 key: 0000 0000 0000 0005 data: 0000 0000 0000 0198 subTree
index: 0000 0000 0000 0006 key: 0000 0000 0000 0006 data: 0000 0000 0000 0006
Tree at: 0000 0000 0000 0098 length: 0000 0000 0000 0000
Keys: 0000 00D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
Tree at: 0000 0000 0000 0118 length: 0000 0000 0000 0000
Keys: 0000 0158 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
Tree at: 0000 0000 0000 0198 length: 0000 0000 0000 0000
Keys: 0000 01D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
end
Tree at: 0000 0000 0000 0518 length: 0000 0000 0000 0007
Keys: 0000 0558 002A 0007 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 000D 0000 000C 0000 000B 0000 000A 0000 0009 0000 0008
Data: 0000 0598 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000E 0000 0398 0000 000C 0000 0318 0000 000A 0000 0298 0000 0008
Node: 0000 0518 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0008 data: 0000 0000 0000 0008
index: 0000 0000 0000 0001 key: 0000 0000 0000 0009 data: 0000 0000 0000 0298 subTree
index: 0000 0000 0000 0002 key: 0000 0000 0000 000A data: 0000 0000 0000 000A
index: 0000 0000 0000 0003 key: 0000 0000 0000 000B data: 0000 0000 0000 0318 subTree
index: 0000 0000 0000 0004 key: 0000 0000 0000 000C data: 0000 0000 0000 000C
index: 0000 0000 0000 0005 key: 0000 0000 0000 000D data: 0000 0000 0000 0398 subTree
index: 0000 0000 0000 0006 key: 0000 0000 0000 000E data: 0000 0000 0000 000E
Tree at: 0000 0000 0000 0298 length: 0000 0000 0000 0000
Keys: 0000 02D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
Tree at: 0000 0000 0000 0318 length: 0000 0000 0000 0000
Keys: 0000 0358 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
Tree at: 0000 0000 0000 0398 length: 0000 0000 0000 0000
Keys: 0000 03D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Data: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
end
end
end
END
}
#latest:
if (1) { # Performance of tree inserts
# Time: 1.18s, bytes: 156,672, execs: 51,659
# Time: 0.62s, bytes: 156,240, execs: 49,499
# Time: 0.63s, bytes: 156,096, execs: 49,043
# Time: 0.58s, bytes: 150,624, execs: 43,802
# Time: 0.59s, bytes: 151,008, execs: 43,965
# Time: 0.62s, bytes: 142,808, execs: 43,763
# Time: 0.94s, bytes: 138,704, execs: 43,561
# Time: 0.54s, bytes: 126,400, execs: 43,157
# Time: 0.52s, bytes: 123,088, execs: 40,796
# Time: 0.51s, bytes: 120,160, execs: 37,761
# Time: 0.49s, bytes: 108,264, execs: 31,014
# Time: 0.50s, bytes: 102,560, execs: 29,496
my $L = V(loop, 45);
my $b = CreateArena;
my $t = $b->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$t->insert($i, $i);
});
ok Assemble(debug => 0, eq => <<END);
END
}
#latest:
if (1) { # Performance of tree inserts
my $L = V(loop, 45);
my $b = CreateArena;
my $t = $b->CreateTree;
$L->for(sub
{my ($i, $start, $next, $end) = @_;
$t->insert($i, $i);
});
ok Assemble(debug => 0, eq => <<END);
END
}
#latest:
if (1) { #TNasm::X86::Sub::call #TNasm::X86::Sub::via
my $s = Subroutine
{my ($p) = @_;
$$p{in}->outNL;
} [qw(in)], name => \'sss\';
my $t = Subroutine
{my ($p) = @_;
$s->call($$p{in});
} [qw(in)], name => \'ttt\';
my $c = Subroutine
{my ($p) = @_;
$t->via($$p{call}, $$p{in});
} [qw(call in)], name => \'ccc\';
$c->call($t->V, V(in, 42));
ok Assemble(debug => 0, eq => <<END);
in: 0000 0000 0000 002A
END
}
#latest:
if (1) { # An example of using sigaction in x86 and x64 assembler code. Linux on x86 requires not only a signal handler but a signal trampoline. The following code shows how to set up a signal and its associated trampoline using sigaction or rt_sigaction.
my $end = Label;
Jmp $end; # Jump over subroutine definition
my $start = SetLabel;
Enter 0, 0; # Inline code of signal handler
Mov r15, rbp; # Preserve the new stack frame
Mov rbp, "[rbp]"; # Restore our last stack frame
PrintOutTraceBack; # Print our trace back
Mov rbp, r15; # Restore supplied stack frame
Exit(0); # Exit so we do not trampoline. Exit with code zero to show that the program is functioning correctly, else L<Assemble> will report an error.
Leave;
Ret;
SetLabel $end;
Mov r15, 0; # Push sufficient zeros onto the stack to make a struct sigaction as described in: https://www.man7.org/linux/man-pages/man2/sigaction.2.html
Push r15 for 1..16;
Mov r15, $start; # Actual signal handler
Mov "[rsp]", r15; # Show as signal handler
Mov "[rsp+0x10]", r15; # Add as trampoline as well - which is fine because we exit in the handler so this will never be called
Mov r15, 0x4000000; # Mask to show we have a trampoline which is, apparently, required on x86
Mov "[rsp+0x8]", r15; # Confirm we have a trampoline
Mov rax, 13; # Sigaction from "kill -l"
Mov rdi, 11; # Confirmed SIGSEGV = 11 from kill -l and tracing with sde64
Mov rsi, rsp; # Sigaction structure on stack
Mov rdx, 0; # Confirmed by trace
Mov r10, 8; # Found by tracing "signal.c" with sde64 it is the width of the signal set and mask. "signal.c" is reproduced below.
Syscall;
Add rsp, 128;
my $s = Subroutine # Subroutine that will cause an error to occur to force a trace back to be printed
{Mov r15, 0;
Mov r15, "[r15]"; # Try to read an unmapped memory location
} [qw(in)], name => \'sub that causes a segv\'; # The name that will appear in the trace back
$s->call(K(in, 42));
ok Assemble(debug => 0, keep2 => \'signal\', emulator=>0, eq => <<END); # Cannot use the emulator because it does not understand signals
Subroutine trace back, depth: 0000 0000 0000 0001
0000 0000 0000 002A sub that causes a segv
END
# /var/isde/sde64 -mix -ptr-check -debugtrace -- ./signal
##include <stdlib.h>
##include <stdio.h>
##include <signal.h>
##include <string.h>
##include <unistd.h>
#
#void handle_sigint(int sig)
# {exit(sig);
# }
#
#int main(void)
# {struct sigaction s;
# memset(&s, 0, sizeof(s));
# s.sa_sigaction = (void *)handle_sigint;
#
# long a = 0xabcdef;
# sigaction(SIGSEGV, &s, 0);
# long *c = 0; *c = a;
# }
#
# gcc -finput-charset=UTF-8 -fmax-errors=7 -rdynamic -Wall -Wextra -Wno-unused-function -o signal signal.c && /var/isde/sde64 -mix -ptr-check -debugtrace -- ./signal; echo $?;
}
#latest:
if (1) { #TOnSegv
OnSegv(); # Request a trace back followed by exit on a segv signal.
my $t = Subroutine # Subroutine that will cause an error to occur to force a trace back to be printed
{Mov r15, 0;
Mov r15, "[r15]"; # Try to read an unmapped memory location
} [qw(in)], name => \'sub that causes a segv\'; # The name that will appear in the trace back
$t->call(K(in, 42));
ok Assemble(debug => 0, keep2 => \'signal\', emulator=>0, eq => <<END); # Cannot use the emulator because it does not understand signals
Subroutine trace back, depth: 0000 0000 0000 0001
0000 0000 0000 002A sub that causes a segv
END
}
#latest:
if (1) { # R11 being disturbed by syscall 1
Push 0x0a61; # A followed by new line on the stack
Mov rax, rsp;
Mov rdx, 2; # Length of string
Mov rsi, rsp; # Address of string
Mov rax, 1; # Write
Mov rdi, 1; # File descriptor
Syscall;
Pushfq;
Pop rax;
PrintOutRegisterInHex rax, r11;
ok Assemble(debug => 0, keep2=>\'z\', emulator => 0, eq => <<END);
a
rax: 0000 0000 0000 0202
r11: 0000 0000 0000 0202
END
}
#latest:
if (1) { # Print the utf8 string corresponding to a lexical item
PushR zmm0, zmm1, rax, r14, r15;
Sub rsp, RegisterSize xmm0;;
Mov "dword[rsp+0*4]", 0x0600001A;
Mov "dword[rsp+1*4]", 0x0600001B;
Mov "dword[rsp+2*4]", 0x05000001;
Mov "dword[rsp+3*4]", 0x0600001B;
Vmovdqu8 zmm0, "[rsp]";
Add rsp, RegisterSize zmm0;
Pextrw rax, xmm0, 1; # Extract lexical type of first element
Vpbroadcastw zmm1, ax; # Broadcast
Vpcmpeqw k0, zmm0, zmm1; # Check extent of first lexical item up to 16
Shr rax, 8; # Lexical type in lowest byte
Mov r15, 0x55555555; # Set odd positions to one where we know the match will fail
Kmovq k1, r15;
Korq k2, k0, k1; # Fill in odd positions
Kmovq r15, k2;
Not r15; # Swap zeroes and ones
Tzcnt r14, r15; # Trailing zero count is a factor two too big
Shr r14, 1; # Normalized count of number of characters int name
Mov r15, 0xffff; # Zero out lexical type
Vpbroadcastd zmm1, r15d; # Broadcast
Vpandd zmm1, zmm0, zmm1; # Remove lexical type to leave index into alphabet
Cmp rax, 6; # Test for variable
IfEq
Then
{my $va = Rutf8 "\\x{1D5D4}\\x{1D5D5}\\x{1D5D6}\\x{1D5D7}\\x{1D5D8}\\x{1D5D9}\\x{1D5DA}\\x{1D5DB}\\x{1D5DC}\\x{1D5DD}\\x{1D5DE}\\x{1D5DF}\\x{1D5E0}\\x{1D5E1}\\x{1D5E2}\\x{1D5E3}\\x{1D5E4}\\x{1D5E5}\\x{1D5E6}\\x{1D5E7}\\x{1D5E8}\\x{1D5E9}\\x{1D5EA}\\x{1D5EB}\\x{1D5EC}\\x{1D5ED}\\x{1D5EE}\\x{1D5EF}\\x{1D5F0}\\x{1D5F1}\\x{1D5F2}\\x{1D5F3}\\x{1D5F4}\\x{1D5F5}\\x{1D5F6}\\x{1D5F7}\\x{1D5F8}\\x{1D5F9}\\x{1D5FA}\\x{1D5FB}\\x{1D5FC}\\x{1D5FD}\\x{1D5FE}\\x{1D5FF}\\x{1D600}\\x{1D601}\\x{1D602}\\x{1D603}\\x{1D604}\\x{1D605}\\x{1D606}\\x{1D607}\\x{1D756}\\x{1D757}\\x{1D758}\\x{1D759}\\x{1D75A}\\x{1D75B}\\x{1D75C}\\x{1D75D}\\x{1D75E}\\x{1D75F}\\x{1D760}\\x{1D761}\\x{1D762}\\x{1D763}\\x{1D764}\\x{1D765}\\x{1D766}\\x{1D767}\\x{1D768}\\x{1D769}\\x{1D76A}\\x{1D76B}\\x{1D76C}\\x{1D76D}\\x{1D76E}\\x{1D76F}\\x{1D770}\\x{1D771}\\x{1D772}\\x{1D773}\\x{1D774}\\x{1D775}\\x{1D776}\\x{1D777}\\x{1D778}\\x{1D779}\\x{1D77A}\\x{1D77B}\\x{1D77C}\\x{1D77D}\\x{1D77E}\\x{1D77F}\\x{1D780}\\x{1D781}\\x{1D782}\\x{1D783}\\x{1D784}\\x{1D785}\\x{1D786}\\x{1D787}\\x{1D788}\\x{1D789}\\x{1D78A}\\x{1D78B}\\x{1D78C}\\x{1D78D}\\x{1D78E}\\x{1D78F}";
PushR zmm1;
V(loop)->getReg(r14)->for(sub # Write each letter out from its position on the stack
{my ($index, $start, $next, $end) = @_; # Execute body
$index->setReg(r14); # Index stack
ClearRegisters r15;
Mov r15b, "[rsp+4*r14]"; # Load alphabet offset from stack
Shl r15, 2; # Each letter is 4 bytes wide in utf8
Mov r14, $va; # Alphabet address
Mov r14d, "[r14+r15]"; # Alphabet letter as utf8
PushR r14; # Utf8 is on the stack and it is 4 bytes wide
Mov rax, rsp;
Mov rdi, 4;
PrintOutMemory; # Print letter from stack
PopR;
});
PrintOutNL;
};
PopR;
ok Assemble(debug => 0, eq => "ð?®ð?¯\\n");
}
#latest:
if (1) { #TPrintOutUtf8Char
my $u = Rd(convertUtf32ToUtf8LE(ord(\'α\')));
Mov rax, $u;
PrintOutUtf8Char;
PrintOutNL;
ok Assemble(debug => 0, trace => 0, eq => <<END);
α
END
}
#latest:
if (1) { #TNasm::X86::Variable::printOutZeroString
my $s = Rutf8 \'ð°ð±ð²ð³\';
V(address, $s)->printOutZeroString;
ok Assemble(debug => 0, trace => 0, eq => <<END);
ð°ð±ð²ð³
END
}
#latest:
if (1) { #TNasm::X86::Variable::printOutMemoryInHexNL
my $u = Rd(ord(\'ð°\'), ord(\'ð±\'), ord(\'ð²\'), ord(\'ð³\'));
Mov rax, $u;
my $address = V(address)->getReg(rax);
$address->printOutMemoryInHexNL(K(size, 16));
ok Assemble(debug => 0, trace => 0, eq => <<END);
70D7 0100 71D7 010072D7 0100 73D7 0100
END
}
#latest:
if (1) { #TNasm::X86::Variable::printOutMemoryInHexNL
my $v = V(var, 2);
If $v == 0, Then {Mov rax, 0},
Ef {$v == 1} Then {Mov rax, 1},
Ef {$v == 2} Then {Mov rax, 2},
Else {Mov rax, 3};
PrintOutRegisterInHex rax;
ok Assemble(debug => 0, trace => 0, eq => <<END);
rax: 0000 0000 0000 0002
END
}
#latest:
if (1) { #TloadRegFromMm #TsaveRegIntoMm
Mov rax, 1; SaveRegIntoMm(zmm0, 0, rax);
Mov rax, 2; SaveRegIntoMm(zmm0, 1, rax);
Mov rax, 3; SaveRegIntoMm(zmm0, 2, rax);
Mov rax, 4; SaveRegIntoMm(zmm0, 3, rax);
LoadRegFromMm(zmm0, 0, r15);
LoadRegFromMm(zmm0, 1, r14);
LoadRegFromMm(zmm0, 2, r13);
LoadRegFromMm(zmm0, 3, r12);
PrintOutRegisterInHex ymm0, r15, r14, r13, r12;
ok Assemble(debug => 0, trace => 1, eq => <<END);
ymm0: 0000 0000 0000 0004 0000 0000 0000 0003 0000 0000 0000 0002 0000 0000 0000 0001
r15: 0000 0000 0000 0001
r14: 0000 0000 0000 0002
r13: 0000 0000 0000 0003
r12: 0000 0000 0000 0004
END
}
#latest:
if (1) { #TCreateShortString #TNasm::X86::ShortString::load #TNasm::X86::ShortString::append #TNasm::X86::ShortString::getLength #TNasm::X86::ShortString::setLength
my $s = CreateShortString(0);
my $d = Rb(1..63);
$s->load(K(address, $d), K(size, 9));
PrintOutRegisterInHex xmm0;
$s->len->outNL;
$s->setLength(K(size, 7));
PrintOutRegisterInHex xmm0;
$s->append($s);
PrintOutRegisterInHex ymm0;
$s->appendByte(K(append,0xFF));
PrintOutRegisterInHex ymm0;
ok Assemble(debug => 0, trace => 0, eq => <<END);
xmm0: 0000 0000 0000 0908 0706 0504 0302 0109
size: 0000 0000 0000 0009
xmm0: 0000 0000 0000 0908 0706 0504 0302 0107
ymm0: 0000 0000 0000 0000 0000 0000 0000 0000 0007 0605 0403 0201 0706 0504 0302 010E
ymm0: 0000 0000 0000 0000 0000 0000 0000 0000 FF07 0605 0403 0201 0706 0504 0302 010F
END
}
#latest:
if (1) { #TNasm::X86::String::appendShortString
my $a = CreateArena;
my $S = $a->CreateString;
my $s = CreateShortString(0);
my $d = Rb(1..63);
$s->load(K(address, $d), K(size, 9));
$s->append($s);
$S->appendShortString($s);
$S->dump;
ok Assemble(debug => 0, trace => 0, eq => <<END);
string Dump
Offset: 0000 0000 0000 0018 Length: 0000 0000 0000 0012
zmm31: 0000 0018 0000 0018 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0009 0807 0605 0403 0201 0908 0706 0504 0302 0112
END
}
#latest:
if (1) { #TNasm::X86::String::appendShortString
my $a = CreateArena;
my $t = $a->CreateTree;
my $s = CreateShortString(0);
my $d = Rb(1..63);
$s->load(K(address, $d), K(size, 9));
$t->insertShortString($s, K(data,42));
$t->dump;
ok Assemble(debug => 0, trace => 0, eq => <<END);
Tree at: 0000 0000 0000 0018 length: 0000 0000 0000 0001
Keys: 0000 0058 0001 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0403 0201
Data: 0000 0000 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0098
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0403 0201 data: 0000 0000 0000 0098 subTree
Tree at: 0000 0000 0000 0098 length: 0000 0000 0000 0001
Keys: 0000 00D8 0001 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0807 0605
Data: 0000 0000 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0118
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0807 0605 data: 0000 0000 0000 0118 subTree
Tree at: 0000 0000 0000 0118 length: 0000 0000 0000 0001
Keys: 0000 0158 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0009
Data: 0000 0000 0000 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 002A
Node: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
index: 0000 0000 0000 0000 key: 0000 0000 0000 0009 data: 0000 0000 0000 002A
end
end
end
END
}
#latest:
if (1) { #TNasm::X86::Arena::CreateQuarks #TNasm::X86::Quarks::quarkFromShortString #TNasm::X86::Quarks::shortStringFromQuark
my $N = 5;
my $a = CreateArena; # Arena containing quarks
my $Q = $a->CreateQuarks; # Quarks
my $s = CreateShortString(0); # Short string used to load and unload quarks
my $d = Rb(1..63);
for my $i(1..$N) # Load a set of quarks
{my $j = $i - 1;
$s->load(K(address, $d), K(size, 4+$i));
my $q = $Q->quarkFromShortString($s);
$q->outNL("New quark $j: "); # New quark, new number
}
PrintOutNL;
for my $i(reverse 1..$N) # Reload a set of quarks
{my $j = $i - 1;
$s->load(K(address, $d), K(size, 4+$i));
my $q = $Q->quarkFromShortString($s);
$q->outNL("Old quark $j: "); # Old quark, old number
}
PrintOutNL;
for my $i(1..$N) # Dump quarks
{my $j = $i - 1;
$s->clear;
$Q->shortStringFromQuark(K(quark, $j), $s);
PrintOutString "Quark string $j: ";
PrintOutRegisterInHex xmm0;
}
ok Assemble(debug => 0, trace => 0, eq => <<END);
New quark 0: 0000 0000 0000 0000
New quark 1: 0000 0000 0000 0001
New quark 2: 0000 0000 0000 0002
New quark 3: 0000 0000 0000 0003
New quark 4: 0000 0000 0000 0004
Old quark 4: 0000 0000 0000 0004
Old quark 3: 0000 0000 0000 0003
Old quark 2: 0000 0000 0000 0002
Old quark 1: 0000 0000 0000 0001
Old quark 0: 0000 0000 0000 0000
Quark string 0: xmm0: 0000 0000 0000 0000 0000 0504 0302 0105
Quark string 1: xmm0: 0000 0000 0000 0000 0006 0504 0302 0106
Quark string 2: xmm0: 0000 0000 0000 0000 0706 0504 0302 0107
Quark string 3: xmm0: 0000 0000 0000 0008 0706 0504 0302 0108
Quark string 4: xmm0: 0000 0000 0000 0908 0706 0504 0302 0109
END
}
#latest:
if (1) { #TNasm::X86::Arena::CreateQuarks #TNasm::X86::Quarks::quarkFromShortString #TNasm::X86::Quarks::shortStringFromQuark
my $N = 5;
my $a = CreateArena; # Arena containing quarks
my $Q1 = $a->CreateQuarks; # Quarks
my $Q2 = $a->CreateQuarks; # Quarks
my $s = CreateShortString(0); # Short string used to load and unload quarks
my $d = Rb(1..63);
for my $i(1..$N) # Load first set of quarks
{my $j = $i - 1;
$s->load(K(address, $d), K(size, 4+$i));
my $q = $Q1->quarkFromShortString($s);
$q->outNL("Q1 $j: ");
}
PrintOutNL;
for my $i(1..$N) # Load second set of quarks
{my $j = $i - 1;
$s->load(K(address, $d), K(size, 5+$i));
my $q = $Q2->quarkFromShortString($s);
$q->outNL("Q2 $j: ");
}
PrintOutNL;
$Q1->quarkToQuark(K(three,3), $Q1)->outNL;
$Q1->quarkToQuark(K(three,3), $Q2)->outNL;
$Q2->quarkToQuark(K(two, 2), $Q1)->outNL;
$Q2->quarkToQuark(K(two, 2), $Q2)->outNL;
ok Assemble(debug => 0, trace => 0, eq => <<END);
Q1 0: 0000 0000 0000 0000
Q1 1: 0000 0000 0000 0001
Q1 2: 0000 0000 0000 0002
Q1 3: 0000 0000 0000 0003
Q1 4: 0000 0000 0000 0004
Q2 0: 0000 0000 0000 0000
Q2 1: 0000 0000 0000 0001
Q2 2: 0000 0000 0000 0002
Q2 3: 0000 0000 0000 0003
Q2 4: 0000 0000 0000 0004
found: 0000 0000 0000 0003
found: 0000 0000 0000 0002
found: 0000 0000 0000 0003
found: 0000 0000 0000 0002
END
}
#latest:
if (1) { #TNasm::X86::Arena::CreateQuarks #TNasm::X86::Quarks::quarkFromShortString #TNasm::X86::Quarks::shortStringFromQuark
my $s = CreateShortString(0); # Short string used to load and unload quarks
my $d = Rb(1..63);
$s->loadDwordBytes(0, K(address, $d), K(size, 9));
PrintOutRegisterInHex xmm0;
ok Assemble(debug => 0, trace => 0, eq => <<END);
xmm0: 0000 0000 0000 211D 1915 110D 0905 0109
END
}
#latest:
if (1) { #TNasm::Variable::copy #TNasm::Variable::copyRef
my $a = V(\'a\', 1);
my $r = R(\'r\')->copyRef($a);
my $R = R(\'R\')->copyRef($r);
$a->outNL;
$r->outNL;
$R->outNL;
$a->copy(2);
$a->outNL;
$r->outNL;
$R->outNL;
$r->copy(3);
$a->outNL;
$r->outNL;
$R->outNL;
$R->copy(4);
$a->outNL;
$r->outNL;
$R->outNL;
ok Assemble(debug => 0, trace => 0, eq => <<END);
a: 0000 0000 0000 0001
r: 0000 0000 0000 0001
R: 0000 0000 0000 0001
a: 0000 0000 0000 0002
r: 0000 0000 0000 0002
R: 0000 0000 0000 0002
a: 0000 0000 0000 0003
r: 0000 0000 0000 0003
R: 0000 0000 0000 0003
a: 0000 0000 0000 0004
r: 0000 0000 0000 0004
R: 0000 0000 0000 0004
END
}
#latest:
if (1) { #TNasm::X86::Quarks::quarkFromSub #TNasm::X86::Quarks::subFromQuark #TNasm::X86::Quarks::loadConstantString
my $s1 = Subroutine
{PrintOutStringNL "11111";
} [], name => \'test1\';
my $s2 = Subroutine
{PrintOutStringNL "22222";
} [], name => \'test2\';
my $a = CreateArena;
my $q = $a->CreateQuarks;
my $n1 = $q->quarkFromSub($s1);
my $s = CreateShortString(0);
$s->loadConstantString("assign");
my $n2 = $q->quarkFromSub($s2, $s);
my $S1 = $q->subFromQuark($n1);
$s1->V->outNL;
$S1 ->outNL(" sub: ");
my $S2 = $q->subFromQuark($n2);
$s2->V->outNL;
$S2 ->outNL(" sub: ");
$q->call($n1);
$q->call($n2);
ok Assemble(debug => 0, trace => 0, eq => <<END);
call: 0000 0000 0040 1006
sub: 0000 0000 0040 1006
call: 0000 0000 0040 107A
sub: 0000 0000 0040 107A
11111
22222
END
}
#latest:
if (1) { # Register expressions in parameter lists
my $s = Subroutine
{my ($p) = @_;
$$p{p}->outNL;
} [qw(p)], name => \'test\';
$s->call(p => 221);
Mov r15, 0xcc;
$s->call(p => r15);
ok Assemble(debug => 0, trace => 0, eq => <<END);
p: 0000 0000 0000 00DD
p: 0000 0000 0000 00CC
END
}
#latest:
if (1) { # Consolidated parameter lists
my $s = Subroutine
{my ($p, $s) = @_;
my $t = Subroutine
{my ($p) = @_;
$$p{p}->outNL;
$$p{q}->outNL;
} [], name => \'tttt\', with => $s;
$t->call(q => 0xcc);
} [qw(p q)], name => \'ssss\';
$s->call(p => 0xee, q => 0xdd);
ok Assemble(debug => 0, trace => 0, eq => <<END);
p: 0000 0000 0000 00EE
q: 0000 0000 0000 00CC
END
}
#latest:
if (1) { #TNasm::X86::Sub::dispatch
my $p = Subroutine # Prototype subroutine to establish parameter list
{} [qw(p)], name => \'prototype\';
my $a = Subroutine # Subroutine we are actually going to call
{$p->variables->{p}->outNL;
} [], name => \'actual\', with => $p;
my $d = Subroutine # Dispatcher
{my ($p, $s) = @_;
$a->dispatch(r15);
PrintOutStringNL "This should NOT happen!";
} [], name => \'dispatch\', with => $p;
$d->call(p => 0xcc);
PrintOutStringNL "This should happen!";
ok Assemble(debug => 0, trace => 0, eq => <<END);
p: 0000 0000 0000 00CC
This should happen!
END
}
#latest:
if (1) { #TNasm::X86::Sub::dispatchV
my $s = Subroutine # Containing sub
{my ($parameters, $sub) = @_;
my $p = Subroutine # Prototype subroutine with cascading parameter lists
{} [qw(q)], with => $sub, name => \'prototype\';
my $a = Subroutine # Subroutine we are actually going to call with extended parameter list
{$p->variables->{p}->outNL;
$p->variables->{q}->outNL;
} [], name => \'actual\', with => $p;
my $d = Subroutine # Dispatcher
{my ($p, $s) = @_;
$a->dispatchV($a->V, r15);
PrintOutStringNL "This should NOT happen!";
} [], name => \'dispatch\', with => $p;
$d->call(q => 0xdd) ; # Extend cascading parameter list
} [qw(p)], name => \'outer\';
$s->call(p => 0xcc); # Start cascading parameter list
PrintOutStringNL "This should happen!";
ok Assemble(debug => 0, trace => 0, eq => <<END);
p: 0000 0000 0000 00CC
q: 0000 0000 0000 00DD
This should happen!
END
}
#latest:
if (1) { #TNasm::X86::CreateQuarks #TNasm::X86::Quarks::put #TNasm::X86::Quarks::putSub #TNasm::X86::Quarks::dump #TNasm::X86::Quarks::subFromQuarkViaQuarks #TNasm::X86::Quarks::subFromQuarkNumber #TNasm::X86::Quarks::subFromShortString #TNasm::X86::Quarks::callSubFromShortString
my $s = Subroutine
{my ($p, $s) = @_;
PrintOutString "SSSS";
$$p{p}->setReg(r15);
PrintOutRegisterInHex r15;
} [qw(p)], name => \'ssss\';
my $t = Subroutine
{my ($p, $s) = @_;
PrintOutString "TTTT";
$$p{p}->setReg(r15);
PrintOutRegisterInHex r15;
} [], name => \'tttt\', with => $s;
my $A = CreateArena;
my $Q = $A->CreateQuarks;
$Q->put(\'aaaa\');
$Q->put(\'bbbb\');
my $Qs = $Q->put(\'ssss\');
my $Qt = $Q->put(\'tttt\');
my $q = $A->CreateQuarks;
my $qs = $q->putSub(\'ssss\', $s);
my $qt = $q->putSub(\'tttt\', $t);
PrintOutStringNL "Quarks"; $Q->dump;
PrintOutStringNL "Subs"; $q->dump;
$q->subFromQuarkViaQuarks($Q, $Qs)->outNL;
$q->subFromQuarkViaQuarks($Q, $Qt)->outNL;
$q->subFromQuarkNumber($qs)->outNL;
$q->subFromQuarkNumber($qt)->outNL;
my $cs = $q->subFromQuarkNumber($qs); $s->via($cs, p => 1);
my $ct = $q->subFromQuarkNumber($qt); $s->via($ct, p => 2);
$q->callSubFromQuarkNumber ( $s, $qs, p => 0x11);
$q->callSubFromQuarkNumber ( $s, $qt, p => 0x22);
$q->callSubFromQuarkViaQuarks($Q, $s, $Qs, p => 0x111);
$q->callSubFromQuarkViaQuarks($Q, $s, $Qt, p => 0x222);
if (1)
{my $s = CreateShortString(0);
$s->loadConstantString("ssss");
$test.pl .. skipped: Nasm or Intel 64 emulator not available
Files=1, Tests=0, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.26 cusr 0.01 csys = 0.28 CPU)
Result: NOTESTS
q->subFromShortString($s)->outNL;
}
if (1)
{my $s = CreateShortString(0);
$s->loadConstantString("ssss");
$q->callSubFromShortString($t, $s, p => 3);
}
ok Assemble(debug => 0, trace => 1, eq => <<END);
Quarks
Quark : 0000 0000 0000 0000 => 0000 0000 0000 00D8 == 0000 00D8 0000 00D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0061 6161 6104
Quark : 0000 0000 0000 0001 => 0000 0000 0000 0198 == 0000 0198 0000 0198 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0062 6262 6204
Quark : 0000 0000 0000 0002 => 0000 0000 0000 01D8 == 0000 01D8 0000 01D8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0073 7373 7304
Quark : 0000 0000 0000 0003 => 0000 0000 0000 0218 == 0000 0218 0000 0218 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0074 7474 7404
Subs
Quark : 0000 0000 0000 0000 => 0000 0000 0040 1009
Quark : 0000 0000 0000 0001 => 0000 0000 0040 124A
sub: 0000 0000 0040 1009
sub: 0000 0000 0040 124A
sub: 0000 0000 0040 1009
sub: 0000 0000 0040 124A
SSSS r15: 0000 0000 0000 0001
TTTT r15: 0000 0000 0000 0002
SSSS r15: 0000 0000 0000 0011
TTTT r15: 0000 0000 0000 0022
SSSS r15: 0000 0000 0000 0111
TTTT r15: 0000 0000 0000 0222
sub: 0000 0000 0040 1009
SSSS r15: 0000 0000 0000 0003
END
}
#latest:
if (1) { #TNasm::X86::CreateQuarks #TNasm::X86::Quarks::put #TNasm::X86::Quarks::putSub #TNasm::X86::Quarks::dump #TNasm::X86::Quarks::subFromQuarkViaQuarks #TNasm::X86::Quarks::subFromQuarkNumber #TNasm::X86::Quarks::subFromShortString #TNasm::X86::Quarks::callSubFromShortString
my $a = V(\'a\', 1);
my $b = $a->clone();
$_->outNL for $a, $b;
ok Assemble(debug => 0, trace => 1, eq => <<END);
a: 0000 0000 0000 0001
a: 0000 0000 0000 0001
END
}
ok 1 for 6..10;
#unlink $_ for qw(hash print2 sde-log.txt sde-ptr-check.out.txt z.txt); # Remove incidental files
#unlink $_ for qw(hash print2 pin-log.txt pin-tool-log.txt sde-footprint.txt sde-log.txt clear hash signal z.o);
say STDERR sprintf("# Time: %.2fs, bytes: %s, execs: %s",
time - $start,
map {numberWithCommas $_} totalBytesAssembled, $instructionsExecuted);
' called at /home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/lib/Nasm/X86.pm line 20964
Nasm::X86::test() called at test.pl line 11
PREREQUISITES:
Here is a list of prerequisites you specified and versions we
managed to load:
Module Name Have Want
Asm::C 20210330 0
Carp 1.50 0
Data::Dump 1.25 0
Data::Table::Text 20210915 20210725
Test2::API 1.302186 0
Test::More 1.302186 0
Test::Most 0.37 0
feature 1.54 0
Perl module toolchain versions installed:
Module Name Have
CPANPLUS 0.9912
CPANPLUS::Dist::Build 0.90
Cwd 3.78
ExtUtils::CBuilder 0.280236
ExtUtils::Command 7.62
ExtUtils::Install 2.20
ExtUtils::MakeMaker 7.62
ExtUtils::Manifest 1.73
ExtUtils::ParseXS 3.40
File::Spec 3.78
Module::Build 0.4231
Pod::Parser 1.63
Pod::Simple 3.35
Test2 1.302186
Test::Harness 3.42
Test::More 1.302186
version 0.9929
******************************** NOTE ********************************
The comments above are created mechanically, possibly without manual
checking by the sender. As there are many people performing automatic
tests on each upload to CPAN, it is likely that you will receive
identical messages about the same problem.
If you believe that the message is mistaken, please reply to the first
one with correction and/or additional informations, and do not take
it personally. We appreciate your patience. :)
**********************************************************************
Additional comments:
This report was machine-generated by CPANPLUS::Dist::YACSmoke 1.08.
Powered by minismokebox version 0.68
CPANPLUS is prefering Build.PL
------------------------------
ENVIRONMENT AND OTHER CONTEXT
------------------------------
Environment variables:
AUTOMATED_TESTING = 1
LANG = en_GB.UTF-8
LANGUAGE = en_GB:en
NONINTERACTIVE_TESTING = 1
PATH = /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PERL5LIB = /home/cpan/pit/jail/dd_QL6cCln/lib/perl5:/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/lib:/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/arch
PERL5_CPANPLUS_IS_RUNNING = 23351
PERL5_CPANPLUS_IS_VERSION = 0.9912
PERL5_MINISMOKEBOX = 0.68
PERL5_YACSMOKE_BASE = /home/cpan/pit/thr-ld/conf/perl-5.30.2
PERL_EXTUTILS_AUTOINSTALL = --defaultdeps
PERL_LOCAL_LIB_ROOT = /home/cpan/pit/jail/dd_QL6cCln
PERL_MB_OPT = --install_base "/home/cpan/pit/jail/dd_QL6cCln"
PERL_MM_OPT = INSTALL_BASE=/home/cpan/pit/jail/dd_QL6cCln
PERL_MM_USE_DEFAULT = 1
SHELL = /bin/bash
TERM = screen.xterm-256color
Perl special variables (and OS-specific diagnostics, for MSWin32):
Perl: $^X = /home/cpan/pit/thr-ld/perl-5.30.2/bin/perl
UID: $< = 1001
EUID: $> = 1001
GID: $( = 1001 1001
EGID: $) = 1001 1001
-------------------------------
--
Summary of my perl5 (revision 5 version 30 subversion 2) configuration:
Platform:
osname=linux
osvers=4.19.0-16-686
archname=i686-linux-thread-multi-ld
uname='linux dagobah 4.19.0-16-686 #1 smp debian 4.19.181-1 (2021-03-19) i686 gnulinux '
config_args='-des -Dprefix=/home/cpan/pit/thr-ld/perl-5.30.2 -Dusethreads -Duselongdouble'
hint=recommended
useposix=true
d_sigaction=define
useithreads=define
usemultiplicity=define
use64bitint=undef
use64bitall=undef
uselongdouble=define
usemymalloc=n
default_inc_excludes_dot=define
bincompat5005=undef
Compiler:
cc='cc'
ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
optimize='-O2'
cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='8.3.0'
gccosandvers=''
intsize=4
longsize=4
ptrsize=4
doublesize=8
byteorder=1234
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=12
longdblkind=3
ivtype='long'
ivsize=4
nvtype='long double'
nvsize=12
Off_t='off_t'
lseeksize=8
alignbytes=4
prototype=define
Linker and Libraries:
ld='cc'
ldflags =' -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/lib/gcc/i686-linux-gnu/8/include-fixed /usr/include/i386-linux-gnu /usr/lib /lib/i386-linux-gnu /lib/../lib /usr/lib/i386-linux-gnu /usr/lib/../lib /lib /lib64 /usr/lib64
libs=-lpthread -lnsl -lgdbm -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.28.so
so=so
useshrplib=false
libperl=libperl.a
gnulibc_version='2.28'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E'
cccdlflags='-fPIC'
lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'
Characteristics of this binary (from libperl):
Compile-time options:
HAS_TIMES
MULTIPLICITY
PERLIO_LAYERS
PERL_COPY_ON_WRITE
PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP
PERL_OP_PARENT
PERL_PRESERVE_IVUV
USE_ITHREADS
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_COLLATE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_LONG_DOUBLE
USE_PERLIO
USE_PERL_ATOF
USE_REENTRANT_API
USE_THREAD_SAFE_LOCALE
Locally applied patches:
Devel::PatchPerl 2.08
Built under linux
Compiled at Jun 13 2021 00:58:56
%ENV:
PERL5LIB="/home/cpan/pit/jail/dd_QL6cCln/lib/perl5:/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/lib:/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/arch"
PERL5_CPANPLUS_IS_RUNNING="23351"
PERL5_CPANPLUS_IS_VERSION="0.9912"
PERL5_MINISMOKEBOX="0.68"
PERL5_YACSMOKE_BASE="/home/cpan/pit/thr-ld/conf/perl-5.30.2"
PERL_EXTUTILS_AUTOINSTALL="--defaultdeps"
PERL_LOCAL_LIB_ROOT="/home/cpan/pit/jail/dd_QL6cCln"
PERL_MB_OPT="--install_base "/home/cpan/pit/jail/dd_QL6cCln""
PERL_MM_OPT="INSTALL_BASE=/home/cpan/pit/jail/dd_QL6cCln"
PERL_MM_USE_DEFAULT="1"
@INC:
/home/cpan/pit/jail/dd_QL6cCln/lib/perl5/5.30.2/i686-linux-thread-multi-ld
/home/cpan/pit/jail/dd_QL6cCln/lib/perl5/5.30.2
/home/cpan/pit/jail/dd_QL6cCln/lib/perl5/i686-linux-thread-multi-ld
/home/cpan/pit/jail/dd_QL6cCln/lib/perl5
/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/lib
/home/cpan/pit/thr-ld/conf/perl-5.30.2/.cpanplus/5.30.2/build/alkLuzb7fP/Nasm-X86-20211013/blib/arch
/home/cpan/pit/thr-ld/perl-5.30.2/lib/site_perl/5.30.2/i686-linux-thread-multi-ld
/home/cpan/pit/thr-ld/perl-5.30.2/lib/site_perl/5.30.2
/home/cpan/pit/thr-ld/perl-5.30.2/lib/5.30.2/i686-linux-thread-multi-ld
/home/cpan/pit/thr-ld/perl-5.30.2/lib/5.30.2