File: 221_asm.t

package info (click to toggle)
libconvert-binary-c-perl 0.74-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 9,100 kB
  • ctags: 21,416
  • sloc: ansic: 63,666; perl: 18,582; yacc: 2,143; makefile: 44
file content (141 lines) | stat: -rw-r--r-- 3,705 bytes parent folder | download
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
134
135
136
137
138
139
140
141
################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2009/03/15 04:10:57 +0100 $
# $Revision: 10 $
# $Source: /tests/221_asm.t $
#
################################################################################
#
# Copyright (c) 2002-2009 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 {
          new Convert::Binary::C
          KeywordMap => { __asm__ => 'asm', __volatile__ => 'volatile' }
        };
ok($@,'');

my $d = eval { new Convert::Binary::C 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));
}