cp: make con_printf non-fatal no-op
[hvf.git] / doc / inline-asm.txt
blob72c590b4f98194f25e27eb3800d1c34f617b24e5
1 The following information has been taken from Dr. Ulrich Weigand's SHARE 100
2 presentation: "The GNU Compiler Collection on zSeries", as well as from
3 "Using the GNU Compiler Collection" [1,2]. Some modifications have been made
4 to follow the HVF coding conventions.
6 Syntax of "asm" construct
7 =========================
9         asm volatile(
10                 <assembler template>
11         : <output operands>
12         : <input operands>
13         : <clobber statements>
14         );
17 Assembler template
18 ------------------
19 - string passed to the assembler
20 - may contain operand placeholders %0, %1, ...
21 - registers specified as %%r0, %%r1, ...
24 Clobber statements
25 ------------------
26 - specify registers changed by template: "r0", "r1", ...
27 - special clobbers: "cc" (condition code), "memory"
30 Operand specification
31 ---------------------
33 List of:
35         "<constraints>" (<expression>)
37 - constraint letters:
38   "a"   address register (general purpose register except r0)
39   "c"   condition code register
40   "d"   data register (arbitrary general purpose register)
41   "f"   floating-point register
42   "I"   unsigned 8-bit constant (0..255)
43   "i"   an immediate integer operand (one with constant value) is allowed.
44         This includes symbolic constants whose values will be known only at
45         assembly time or later.
46   "J"   unsigned 12-bit constant (0..4095)
47   "K"   signed 16-bit constant (-32768..32767)
48   "L"   value appropriate as displacement.
49           (0..4095)             for short displacement
50           (-524288..524287)     for long displacement 
51   "M"   constant integer with a value of 0x7fffffff.
52   "m"   a memory operand is allowed, with any kind of address that the
53         machine supports in general.
55   "N"   multiple letter constraint followed by 4 parameter letters.
56           0..9:   number of the part counting from most to least significant
57           H,Q:    mode of the part
58           D,S,H:  mode of the containing operand
59           0,F:    value of the other parts (F-all bits set) 
60         the constraint matches if the specified part of a constant has a
61         value different from it's other parts.
62   "Q"   memory reference without index register and with short displacement.
63   "R"   memory reference with index register and short displacement.
64   "S"   memory reference without index register but with long displacement.
65   "T"   memory reference with index register and long displacement.
66   "U"   pointer with short displacement.
67   "W"   pointer with long displacement.
68   "Y"   shift count operand.
70 (most useful being: "d" "f" "a" "m" "Q" "i")
72 - constraint modifier characters:
73   "="   write-only output operand
74   "+"   read-write output operand
75   "&"   operand modified before all inputs are processed
78 Examples
79 --------
81 - simple register constraint
83         asm volatile(
84                 "       ear     %0,%%a0"
85         : /* output */
86           "=d" (ar0_value)
87         );
89 - simple memory constraint
91         asm volatile(
92                 "       cvb     %0, %1"
93         : /* output */
94           "=d" (bin)
95         : /* input */
96           "m (dec)
97         );
99 - handling S-operands
101         asm volatile(
102                 "       stck    %0"
103         : /* output */
104           "=Q" (time)
105         : /* input */
106         : /* clobber */
107           "cc"
108         );
110         asm volatile(
111                 "       stck    0(%0)"
112         : /* output */
113         : /* input */
114           "a" (&time)
115         : /* clobber */
116           "memory", "cc"
117         );
119         asm volatile(
120                 "       stck    0(%1)"
121         : /* output */
122           "=m" (time)
123         : /* input */
124           "a" (&time)
125         : /* clobber */
126           "cc"
127         );
130 Links
131 =====
133 [1] http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Simple-Constraints.html
134 [2] http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Machine-Constraints.html