File: 221_asm.t

package info (click to toggle)
libconvert-binary-c-perl 0.85-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 13,260 kB
  • sloc: ansic: 47,820; perl: 4,980; yacc: 2,143; makefile: 61
file content (133 lines) | stat: -rw-r--r-- 3,581 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
################################################################################
#
# Copyright (c) 2002-2024 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################

use Test;
use Convert::Binary::C @ARGV;

$^W = 1;

BEGIN {
  plan tests => 14;
}

my $c = eval {
  Convert::Binary::C->new(
    KeywordMap => { __asm__ => 'asm', __volatile__ => 'volatile' }
  );
};
ok($@,'');

my $d = eval { Convert::Binary::C->new( DisabledKeywords => [ 'asm' ] ) };
ok($@,'');

for my $code ( do { local $/; split /-{20,}\r?\n?/, <DATA> } ) {
  my $out = $code;
  $out =~ s/^/# /mg;
  print '# ', '-'x72, "\n", $out, '# ', '-'x72, "\n";
  my @pass = map { $_ ? '' : qr/\S/ } $code =~ /\((\d+)(?:,(\d+))*\)/m;
  eval { $c->clean->parse( $code ) };
  ok($@, $pass[0]);
  eval { $d->clean->parse( $code ) };
  ok($@, $pass[1]);
}

################################################################################
# CODE SNIPPETS
################################################################################

__DATA__

/* (1,1) function-like calls aren't a problem anyway */

void main()
{
  asm("foo");
  __asm__("foo");
  asm("\n\
        global memctl\n\
memctl:\n\
        movq &75,%d0\n\
        trap &0\n\
        bcc.b noerror\n\
        jmp cerror%\n\
noerror:\n\
        movq &0,%d0\n\
        rts");
}

--------------------------------------------------

/* (1,0) this one's a lot better ;-) */

void main()
{
  __asm__ ("" : : "r" (reference));
}

--------------------------------------------------

/* (1,0) even more complex statements */

void main()
{
  __asm__ __volatile__ ("getcon cr%1, %0" : "=r" (res) : "n" (k));
  __asm__ __volatile__ ("putcon %0, cr%1" : : "r" (mm), "n" (k));
  __asm__ __volatile__ ("putcfg %0, %1, %2" : : "r" (mm), "n" (s), "r" (mw));
  __asm__ __volatile__ ("ld.b   %m0, r63" : : "o" (((char*)mm)[s]));
  __asm__ __volatile__ ("" : "+m"(x->a) : "r"(x) : "memory", "cc");
  __asm__ ("" : "=r"(tmp), "=r"(ret));
  asm volatile ("sleep");
  asm("%0"::"r"(1.5));
}

--------------------------------------------------

/* (1,0) declarators */

void main()
{
  register unsigned long long r18 asm ("r18");
  register unsigned long long r19 asm ("r19");
  register unsigned long long r0 asm ("r0") = 0;
  register unsigned long long r1 asm ("r1") = 1;
  register int r2 asm ("r2") = i >> 31;
  register int r3 asm ("r3") = j >> 31;
}

--------------------------------------------------

/* (1,0) declarators */

__asm__ ("foo");
__asm__ ("foo");
register unsigned long long r18 asm ("r18");

--------------------------------------------------

/* (1,0) from the gcc regression tests */

f(){asm("f":::"cc");}
g(x,y){asm("g"::"%r"(x), "r"(y));}

void foo (void) asm ("_bar");

void main()
{
  asm("": "+r" (v) : "r" (0), "r" (1));
  __asm__ ("mull %3" : "=a" (rp[0]), "=d" (rp[1]) : "%0" (7), "rm" (7));
  asm volatile ("" : : :
                "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
                "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
                "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
                "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31");

  asm volatile ("test0 X%0Y%[arg]Z" : [arg] "=g" (x));
  asm volatile ("test1 X%[out]Y%[in]Z" : [out] "=g" (y) : [in] "0"(y));
  asm volatile ("test2 X%a0Y%a[arg]Z" : : [arg] "p" (&z));
  asm volatile ("test3 %[in]" : [inout] "=g"(x) : "[inout]" (x), [in] "g" (y));
}