|
@@ -68,7 +68,6 @@
|
|
|
|
|
|
\definecolor{comment-red}{rgb}{0.8,0,0}
|
|
|
\if{0}
|
|
|
-% Peanut gallery comments:
|
|
|
\newcommand{\rn}[1]{{\color{comment-red}{(RRN: #1)}}}
|
|
|
\newcommand{\margincomment}[1]{\marginpar{#1}}
|
|
|
\else
|
|
@@ -79,7 +78,7 @@
|
|
|
\lstset{%
|
|
|
language=Lisp,
|
|
|
basicstyle=\ttfamily\small,
|
|
|
-morekeywords={seq,assign,program,block,define,lambda,match,goto,if,else,then,struct,Integer,Boolean},
|
|
|
+morekeywords={seq,assign,program,block,define,lambda,match,goto,if,else,then,struct,Integer,Boolean,Vector,Void},
|
|
|
deletekeywords={read},
|
|
|
escapechar=|,
|
|
|
columns=flexible,
|
|
@@ -4809,13 +4808,13 @@ conclusion:
|
|
|
\node (R2-5) at (9,0) {\large $R_2$};
|
|
|
\node (C1-1) at (3,-2) {\large $C_1$};
|
|
|
|
|
|
-\node (x86-2) at (3,-4) {\large $\text{x86}^{*}$};
|
|
|
-\node (x86-3) at (6,-4) {\large $\text{x86}^{*}$};
|
|
|
-\node (x86-4) at (9,-4) {\large $\text{x86}^{*}$};
|
|
|
-\node (x86-5) at (9,-6) {\large $\text{x86}^{\dagger}$};
|
|
|
+\node (x86-2) at (3,-4) {\large $\text{x86}^{*}_1$};
|
|
|
+\node (x86-3) at (6,-4) {\large $\text{x86}^{*}_1$};
|
|
|
+\node (x86-4) at (9,-4) {\large $\text{x86}^{*}_1$};
|
|
|
+\node (x86-5) at (9,-6) {\large $\text{x86}^{\dagger}_1$};
|
|
|
|
|
|
-\node (x86-2-1) at (3,-6) {\large $\text{x86}^{*}$};
|
|
|
-\node (x86-2-2) at (6,-6) {\large $\text{x86}^{*}$};
|
|
|
+\node (x86-2-1) at (3,-6) {\large $\text{x86}^{*}_1$};
|
|
|
+\node (x86-2-2) at (6,-6) {\large $\text{x86}^{*}_1$};
|
|
|
|
|
|
\path[->,bend left=15] (R2) edge [above] node {\ttfamily\footnotesize\color{red} typecheck} (R2-2);
|
|
|
\path[->,bend left=15] (R2-2) edge [above] node {\ttfamily\footnotesize\color{red} shrink} (R2-3);
|
|
@@ -5619,9 +5618,9 @@ before \code{remove-complex-opera*} because the code generated by
|
|
|
\code{expose-allocation} introduces new variables using \code{let},
|
|
|
but \code{let} is gone after \code{explicate-control}.
|
|
|
|
|
|
-The output of \code{expose-allocation} is a language that extends
|
|
|
-$R_3$ with the three new forms that we use in the translation of the
|
|
|
-\code{vector} form.
|
|
|
+The output of \code{expose-allocation} is a language $R'_3$ that
|
|
|
+extends $R_3$ with the three new forms that we use in the translation
|
|
|
+of the \code{vector} form.
|
|
|
\[
|
|
|
\begin{array}{lcl}
|
|
|
\Exp &::=& \cdots
|
|
@@ -5677,7 +5676,7 @@ Figure~\ref{fig:expose-alloc-output} shows the output of the
|
|
|
(let ([vecinit7976
|
|
|
(let ([vecinit7972 42])
|
|
|
(let ([collectret7974
|
|
|
- (if (< (+ free_ptr 16) fromspace_end)
|
|
|
+ (if (< (+ (global free_ptr) 16) (global fromspace_end))
|
|
|
(void)
|
|
|
(collect 16)
|
|
|
)])
|
|
@@ -5689,7 +5688,7 @@ Figure~\ref{fig:expose-alloc-output} shows the output of the
|
|
|
)
|
|
|
])
|
|
|
(let ([collectret7978
|
|
|
- (if (< (+ free_ptr 16) fromspace_end)
|
|
|
+ (if (< (+ (global free_ptr) 16) (global fromspace_end))
|
|
|
(void)
|
|
|
(collect 16)
|
|
|
)])
|
|
@@ -5703,7 +5702,7 @@ Figure~\ref{fig:expose-alloc-output} shows the output of the
|
|
|
0)
|
|
|
\end{lstlisting}
|
|
|
\caption{Output of the \code{expose-allocation} pass, minus
|
|
|
- all of the \code{HasType} forms.}
|
|
|
+ all of the \code{has-type} forms.}
|
|
|
\label{fig:expose-alloc-output}
|
|
|
\end{figure}
|
|
|
|
|
@@ -5772,7 +5771,7 @@ C_2 & ::= & \gray{ \PROGRAM{\itm{info}}{\CFG{(\itm{label}\,\key{.}\,\Tail)^{+}}}
|
|
|
\]
|
|
|
\end{minipage}
|
|
|
}
|
|
|
-\caption{The abstract syntax $C_2$, an extention of $C_1$
|
|
|
+\caption{The abstract syntax of $C_2$, an extention of $C_1$
|
|
|
(Figure~\ref{fig:c1-syntax}).}
|
|
|
\label{fig:c2-syntax}
|
|
|
\end{figure}
|
|
@@ -5814,43 +5813,43 @@ locals:
|
|
|
tmp7984 : 'Integer, tmp7979 : 'Integer, tmp7982 : 'Integer,
|
|
|
alloc7971 : '(Vector Integer), tmp7981 : 'Integer,
|
|
|
vecinit7972 : 'Integer, initret7973 : 'Void,
|
|
|
-block7991:
|
|
|
+block91:
|
|
|
(collect 16)
|
|
|
- goto block7989;
|
|
|
-block7990:
|
|
|
+ goto block89;
|
|
|
+block90:
|
|
|
collectret7974 = (void);
|
|
|
- goto block7989;
|
|
|
-block7989:
|
|
|
+ goto block89;
|
|
|
+block89:
|
|
|
alloc7971 = (allocate 1 (Vector Integer));
|
|
|
initret7973 = (vector-set! alloc7971 0 vecinit7972);
|
|
|
vecinit7976 = alloc7971;
|
|
|
- tmp7982 = free_ptr;
|
|
|
+ tmp7982 = (global free_ptr);
|
|
|
tmp7983 = (+ tmp7982 16);
|
|
|
- tmp7984 = fromspace_end;
|
|
|
+ tmp7984 = (global fromspace_end);
|
|
|
if (< tmp7983 tmp7984) then
|
|
|
- goto block7987;
|
|
|
+ goto block87;
|
|
|
else
|
|
|
- goto block7988;
|
|
|
-block7988:
|
|
|
+ goto block88;
|
|
|
+block88:
|
|
|
(collect 16)
|
|
|
- goto block7986;
|
|
|
-block7987:
|
|
|
+ goto block86;
|
|
|
+block87:
|
|
|
collectret7978 = (void);
|
|
|
- goto block7986;
|
|
|
-block7986:
|
|
|
+ goto block86;
|
|
|
+block86:
|
|
|
alloc7975 = (allocate 1 (Vector (Vector Integer)));
|
|
|
initret7977 = (vector-set! alloc7975 0 vecinit7976);
|
|
|
tmp7985 = (vector-ref alloc7975 0);
|
|
|
return (vector-ref tmp7985 0);
|
|
|
start:
|
|
|
vecinit7972 = 42;
|
|
|
- tmp7979 = free_ptr;
|
|
|
+ tmp7979 = (global free_ptr);
|
|
|
tmp7980 = (+ tmp7979 16);
|
|
|
- tmp7981 = fromspace_end;
|
|
|
+ tmp7981 = (global fromspace_end);
|
|
|
if (< tmp7980 tmp7981) then
|
|
|
- goto block7990;
|
|
|
+ goto block90;
|
|
|
else
|
|
|
- goto block7991;
|
|
|
+ goto block91;
|
|
|
\end{lstlisting}
|
|
|
\caption{Output of \code{uncover-locals} for the running example.}
|
|
|
\label{fig:uncover-locals-r3}
|
|
@@ -5878,19 +5877,19 @@ The \code{vector-ref} and \code{vector-set!} forms translate into
|
|
|
plus one is to get past the tag at the beginning of the tuple
|
|
|
representation.)
|
|
|
\begin{lstlisting}
|
|
|
- (assign |$\itm{lhs}$| (vector-ref |$\itm{vec}$| |$n$|))
|
|
|
+ |$\itm{lhs}$| = (vector-ref |$\itm{vec}$| |$n$|);
|
|
|
|$\Longrightarrow$|
|
|
|
- (movq |$\itm{vec}'$| (reg r11))
|
|
|
- (movq (deref r11 |$8(n+1)$|) |$\itm{lhs}$|)
|
|
|
+ movq |$\itm{vec}'$|, %r11
|
|
|
+ movq |$-8(n+1)$|(%r11), |$\itm{lhs}$|
|
|
|
|
|
|
- (assign |$\itm{lhs}$| (vector-set! |$\itm{vec}$| |$n$| |$\itm{arg}$|))
|
|
|
+ |$\itm{lhs}$| = (vector-set! |$\itm{vec}$| |$n$| |$\itm{arg}$|);
|
|
|
|$\Longrightarrow$|
|
|
|
- (movq |$\itm{vec}'$| (reg r11))
|
|
|
- (movq |$\itm{arg}'$| (deref r11 |$8(n+1)$|))
|
|
|
- (movq (int 0) |$\itm{lhs}$|)
|
|
|
+ movq |$\itm{vec}'$|, %r11
|
|
|
+ movq |$\itm{arg}'$|, |$8(n+1)$|(%r11)
|
|
|
+ movq $0, |$\itm{lhs}$|
|
|
|
\end{lstlisting}
|
|
|
-The $\itm{vec}'$ and $\itm{arg}'$ are obtained by recursively
|
|
|
-processing $\itm{vec}$ and $\itm{arg}$. The move of $\itm{vec}'$ to
|
|
|
+The $\itm{vec}'$ and $\itm{arg}'$ are obtained by translating
|
|
|
+$\itm{vec}$ and $\itm{arg}$ to x86. The move of $\itm{vec}'$ to
|
|
|
register \code{r11} ensures that offsets are only performed with
|
|
|
register operands. This requires removing \code{r11} from
|
|
|
consideration by the register allocating.
|
|
@@ -5907,12 +5906,12 @@ how the tag is organized. We recommend using the Racket operations
|
|
|
The type annotation in the \code{vector} form is used to determine the
|
|
|
pointer mask region of the tag.
|
|
|
\begin{lstlisting}
|
|
|
- (assign |$\itm{lhs}$| (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|)))
|
|
|
+ |$\itm{lhs}$| = (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|));
|
|
|
|$\Longrightarrow$|
|
|
|
- (movq (global free_ptr) |$\itm{lhs}'$|)
|
|
|
- (addq (int |$8(\itm{len}+1)$|) (global free_ptr))
|
|
|
- (movq |$\itm{lhs}'$| (reg r11))
|
|
|
- (movq (int |$\itm{tag}$|) (deref r11 0))
|
|
|
+ movq (global free_ptr), |$\itm{lhs}'$|
|
|
|
+ addq $|$8(\itm{len}+1)$|, (global free_ptr)
|
|
|
+ movq |$\itm{lhs}'$|, %r11
|
|
|
+ movq $|$\itm{tag}$|, 0(%r11)
|
|
|
\end{lstlisting}
|
|
|
|
|
|
The \code{collect} form is compiled to a call to the \code{collect}
|
|
@@ -5924,9 +5923,9 @@ the register allocator.
|
|
|
\begin{lstlisting}
|
|
|
(collect |$\itm{bytes}$|)
|
|
|
|$\Longrightarrow$|
|
|
|
- (movq (reg r15) (reg rdi))
|
|
|
- (movq |\itm{bytes}| (reg rsi))
|
|
|
- (callq collect)
|
|
|
+ movq %r15, %rdi
|
|
|
+ movq $|\itm{bytes}|, %rsi
|
|
|
+ callq collect
|
|
|
\end{lstlisting}
|
|
|
|
|
|
|
|
@@ -5972,66 +5971,62 @@ Figure~\ref{fig:select-instr-output-gc} shows the output of the
|
|
|
\begin{figure}[tbp]
|
|
|
\centering
|
|
|
\begin{minipage}{0.75\textwidth}
|
|
|
+% tests/s2_17.rkt
|
|
|
\begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
|
|
|
-(program
|
|
|
- ((locals . ((tmp54 . Integer) (tmp51 . Integer) (tmp53 . Integer)
|
|
|
- (alloc43 . (Vector Integer)) (tmp55 . Integer)
|
|
|
- (initret45 . Void) (alloc47 . (Vector (Vector Integer)))
|
|
|
- (collectret46 . Void) (vecinit48 . (Vector Integer))
|
|
|
- (tmp52 . Integer) (tmp57 Vector Integer) (vecinit44 . Integer)
|
|
|
- (tmp56 . Integer) (initret49 . Void) (collectret50 . Void))))
|
|
|
- ((block63 . (block ()
|
|
|
- (movq (reg r15) (reg rdi))
|
|
|
- (movq (int 16) (reg rsi))
|
|
|
- (callq collect)
|
|
|
- (jmp block61)))
|
|
|
- (block62 . (block () (movq (int 0) (var collectret46)) (jmp block61)))
|
|
|
- (block61 . (block ()
|
|
|
- (movq (global free_ptr) (var alloc43))
|
|
|
- (addq (int 16) (global free_ptr))
|
|
|
- (movq (var alloc43) (reg r11))
|
|
|
- (movq (int 3) (deref r11 0))
|
|
|
- (movq (var alloc43) (reg r11))
|
|
|
- (movq (var vecinit44) (deref r11 8))
|
|
|
- (movq (int 0) (var initret45))
|
|
|
- (movq (var alloc43) (var vecinit48))
|
|
|
- (movq (global free_ptr) (var tmp54))
|
|
|
- (movq (var tmp54) (var tmp55))
|
|
|
- (addq (int 16) (var tmp55))
|
|
|
- (movq (global fromspace_end) (var tmp56))
|
|
|
- (cmpq (var tmp56) (var tmp55))
|
|
|
- (jmp-if l block59)
|
|
|
- (jmp block60)))
|
|
|
- (block60 . (block ()
|
|
|
- (movq (reg r15) (reg rdi))
|
|
|
- (movq (int 16) (reg rsi))
|
|
|
- (callq collect)
|
|
|
- (jmp block58))
|
|
|
- (block59 . (block ()
|
|
|
- (movq (int 0) (var collectret50))
|
|
|
- (jmp block58)))
|
|
|
- (block58 . (block ()
|
|
|
- (movq (global free_ptr) (var alloc47))
|
|
|
- (addq (int 16) (global free_ptr))
|
|
|
- (movq (var alloc47) (reg r11))
|
|
|
- (movq (int 131) (deref r11 0))
|
|
|
- (movq (var alloc47) (reg r11))
|
|
|
- (movq (var vecinit48) (deref r11 8))
|
|
|
- (movq (int 0) (var initret49))
|
|
|
- (movq (var alloc47) (reg r11))
|
|
|
- (movq (deref r11 8) (var tmp57))
|
|
|
- (movq (var tmp57) (reg r11))
|
|
|
- (movq (deref r11 8) (reg rax))
|
|
|
- (jmp conclusion)))
|
|
|
- (start . (block ()
|
|
|
- (movq (int 42) (var vecinit44))
|
|
|
- (movq (global free_ptr) (var tmp51))
|
|
|
- (movq (var tmp51) (var tmp52))
|
|
|
- (addq (int 16) (var tmp52))
|
|
|
- (movq (global fromspace_end) (var tmp53))
|
|
|
- (cmpq (var tmp53) (var tmp52))
|
|
|
- (jmp-if l block62)
|
|
|
- (jmp block63))))))
|
|
|
+block35:
|
|
|
+ movq (global free_ptr), alloc9024
|
|
|
+ addq $16, (global free_ptr)
|
|
|
+ movq alloc9024, %r11
|
|
|
+ movq $131, 0(%r11)
|
|
|
+ movq alloc9024, %r11
|
|
|
+ movq vecinit9025, 8(%r11)
|
|
|
+ movq $0, initret9026
|
|
|
+ movq alloc9024, %r11
|
|
|
+ movq 8(%r11), tmp9034
|
|
|
+ movq tmp9034, %r11
|
|
|
+ movq 8(%r11), %rax
|
|
|
+ jmp conclusion
|
|
|
+block36:
|
|
|
+ movq $0, collectret9027
|
|
|
+ jmp block35
|
|
|
+block37:
|
|
|
+ movq %r15, %rdi
|
|
|
+ movq $16, %rsi
|
|
|
+ callq 'collect
|
|
|
+ jmp block35
|
|
|
+block38:
|
|
|
+ movq (global free_ptr), alloc9020
|
|
|
+ addq $16, (global free_ptr)
|
|
|
+ movq alloc9020, %r11
|
|
|
+ movq $3, 0(%r11)
|
|
|
+ movq alloc9020, %r11
|
|
|
+ movq vecinit9021, 8(%r11)
|
|
|
+ movq $0, initret9022
|
|
|
+ movq alloc9020, vecinit9025
|
|
|
+ movq (global free_ptr), tmp9031
|
|
|
+ movq tmp9031, tmp9032
|
|
|
+ addq $16, tmp9032
|
|
|
+ movq (global fromspace_end), tmp9033
|
|
|
+ cmpq tmp9033, tmp9032
|
|
|
+ jl block36
|
|
|
+ jmp block37
|
|
|
+block39:
|
|
|
+ movq $0, collectret9023
|
|
|
+ jmp block38
|
|
|
+block40:
|
|
|
+ movq %r15, %rdi
|
|
|
+ movq $16, %rsi
|
|
|
+ callq 'collect
|
|
|
+ jmp block38
|
|
|
+start:
|
|
|
+ movq $42, vecinit9021
|
|
|
+ movq (global free_ptr), tmp9028
|
|
|
+ movq tmp9028, tmp9029
|
|
|
+ addq $16, tmp9029
|
|
|
+ movq (global fromspace_end), tmp9030
|
|
|
+ cmpq tmp9030, tmp9029
|
|
|
+ jl block39
|
|
|
+ jmp block40
|
|
|
\end{lstlisting}
|
|
|
\end{minipage}
|
|
|
\caption{Output of the \code{select-instructions} pass.}
|
|
@@ -6113,9 +6108,9 @@ if it is null prior to dereferencing it.
|
|
|
\begin{figure}[htbp]
|
|
|
\begin{minipage}[t]{0.5\textwidth}
|
|
|
\begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
|
|
|
-_block58:
|
|
|
- movq _free_ptr(%rip), %rcx
|
|
|
- addq $16, _free_ptr(%rip)
|
|
|
+block35:
|
|
|
+ movq free_ptr(%rip), %rcx
|
|
|
+ addq $16, free_ptr(%rip)
|
|
|
movq %rcx, %r11
|
|
|
movq $131, 0(%r11)
|
|
|
movq %rcx, %r11
|
|
@@ -6126,74 +6121,69 @@ _block58:
|
|
|
movq 8(%r11), %rcx
|
|
|
movq %rcx, %r11
|
|
|
movq 8(%r11), %rax
|
|
|
- jmp _conclusion
|
|
|
-_block59:
|
|
|
- movq $0, %rcx
|
|
|
- jmp _block58
|
|
|
-_block62:
|
|
|
+ jmp conclusion
|
|
|
+block36:
|
|
|
movq $0, %rcx
|
|
|
- jmp _block61
|
|
|
-_block60:
|
|
|
- movq %r15, %rdi
|
|
|
- movq $16, %rsi
|
|
|
- callq _collect
|
|
|
- jmp _block58
|
|
|
-_block63:
|
|
|
- movq %r15, %rdi
|
|
|
- movq $16, %rsi
|
|
|
- callq _collect
|
|
|
- jmp _block61
|
|
|
-_start:
|
|
|
- movq $42, %rbx
|
|
|
- movq _free_ptr(%rip), %rdx
|
|
|
- addq $16, %rdx
|
|
|
- movq _fromspace_end(%rip), %rcx
|
|
|
- cmpq %rcx, %rdx
|
|
|
- jl _block62
|
|
|
- jmp _block63
|
|
|
-\end{lstlisting}
|
|
|
-\end{minipage}
|
|
|
-\begin{minipage}[t]{0.45\textwidth}
|
|
|
-\begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
|
|
|
-_block61:
|
|
|
- movq _free_ptr(%rip), %rcx
|
|
|
- addq $16, _free_ptr(%rip)
|
|
|
+ jmp block35
|
|
|
+block38:
|
|
|
+ movq free_ptr(%rip), %rcx
|
|
|
+ addq $16, free_ptr(%rip)
|
|
|
movq %rcx, %r11
|
|
|
movq $3, 0(%r11)
|
|
|
movq %rcx, %r11
|
|
|
movq %rbx, 8(%r11)
|
|
|
movq $0, %rdx
|
|
|
movq %rcx, -8(%r15)
|
|
|
- movq _free_ptr(%rip), %rcx
|
|
|
+ movq free_ptr(%rip), %rcx
|
|
|
addq $16, %rcx
|
|
|
- movq _fromspace_end(%rip), %rdx
|
|
|
+ movq fromspace_end(%rip), %rdx
|
|
|
cmpq %rdx, %rcx
|
|
|
- jl _block59
|
|
|
- jmp _block60
|
|
|
-
|
|
|
- .globl _main
|
|
|
-_main:
|
|
|
+ jl block36
|
|
|
+ movq %r15, %rdi
|
|
|
+ movq $16, %rsi
|
|
|
+ callq collect
|
|
|
+ jmp block35
|
|
|
+block39:
|
|
|
+ movq $0, %rcx
|
|
|
+ jmp block38
|
|
|
+\end{lstlisting}
|
|
|
+\end{minipage}
|
|
|
+\begin{minipage}[t]{0.45\textwidth}
|
|
|
+\begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
|
|
|
+start:
|
|
|
+ movq $42, %rbx
|
|
|
+ movq free_ptr(%rip), %rdx
|
|
|
+ addq $16, %rdx
|
|
|
+ movq fromspace_end(%rip), %rcx
|
|
|
+ cmpq %rcx, %rdx
|
|
|
+ jl block39
|
|
|
+ movq %r15, %rdi
|
|
|
+ movq $16, %rsi
|
|
|
+ callq collect
|
|
|
+ jmp block38
|
|
|
+ .globl main
|
|
|
+main:
|
|
|
pushq %rbp
|
|
|
movq %rsp, %rbp
|
|
|
+ pushq %r13
|
|
|
pushq %r12
|
|
|
pushq %rbx
|
|
|
- pushq %r13
|
|
|
pushq %r14
|
|
|
subq $0, %rsp
|
|
|
movq $16384, %rdi
|
|
|
movq $16, %rsi
|
|
|
- callq _initialize
|
|
|
- movq _rootstack_begin(%rip), %r15
|
|
|
+ callq initialize
|
|
|
+ movq rootstack_begin(%rip), %r15
|
|
|
movq $0, (%r15)
|
|
|
addq $8, %r15
|
|
|
- jmp _start
|
|
|
-_conclusion:
|
|
|
+ jmp start
|
|
|
+conclusion:
|
|
|
subq $8, %r15
|
|
|
addq $0, %rsp
|
|
|
popq %r14
|
|
|
- popq %r13
|
|
|
popq %rbx
|
|
|
popq %r12
|
|
|
+ popq %r13
|
|
|
popq %rbp
|
|
|
retq
|
|
|
\end{lstlisting}
|
|
@@ -6215,8 +6205,8 @@ _conclusion:
|
|
|
\node (R3-2) at (3,2) {\large $R_3$};
|
|
|
\node (R3-3) at (6,2) {\large $R_3$};
|
|
|
\node (R3-4) at (9,2) {\large $R_3$};
|
|
|
-\node (R3-5) at (9,0) {\large $R_3$};
|
|
|
-\node (R3-6) at (6,0) {\large $R_3$};
|
|
|
+\node (R3-5) at (9,0) {\large $R'_3$};
|
|
|
+\node (R3-6) at (6,0) {\large $R'_3$};
|
|
|
\node (C2-4) at (3,-2) {\large $C_2$};
|
|
|
\node (C2-3) at (0,-2) {\large $C_2$};
|
|
|
|