Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use 5.16.1;
- use strict;
- use warnings;
- use Inline C => <<'...';
- void bit_scan_f(int n, int start) {
- int res[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- __asm__ __volatile__ (
- "xorl %%eax, %%eax\n"
- "leaq (%[res]), %%rdi\n"
- "movl %1, %%ecx\n"
- "movl %0, %%edx\n"
- "inloop:\n"
- "shrl %%cl, %%edx\n"
- "orl %%edx, %%edx\n"
- "jz outloop\n"
- "bsf %%edx, %%ecx\n"
- "addl %%ecx, %%eax\n"
- "movl %%eax, (%%rdi)\n"
- "leaq 4(%%rdi), %%rdi\n"
- "incl %%eax\n"
- "incl %%ecx\n"
- "jmp inloop\n"
- "outloop:\n"
- "cmpl $32, %%eax\n"
- "jge skip128\n"
- "movl $128, (%%rdi)\n"
- "skip128:\n"
- :
- : "r"(n),"r"(start),[res]"r"(&res)
- : "%eax", "%ecx", "%edx", "%rdi"
- );
- Inline_Stack_Vars;
- Inline_Stack_Reset;
- for (int i=0; i<32; i++) {
- if (res[i] == 128) { break; }
- Inline_Stack_Push(sv_2mortal(newSViv(res[i])));
- // printf("%d: %d\n", i, res[i]);
- }
- Inline_Stack_Done;
- }
- ...
- say '[' .
- join(', ' => bit_scan_f($ARGV[0] // 0 + 0, $ARGV[1] // 0))
- . ']';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement