// File: /workspace/github_c_makefile_star2_O3/mishun[P]plantri/fullgen.c
// Function: add_polygon_invers
void add_polygon_invers(int n, PLANMAP map, KANTE *start, KANTE **lastout)
/* fuegt ein weiteres polygon einer Reihe an. Dabei ist n die groesse des polygons. 
   Angefuegt wird immer an start. Ueber lastout wird die letzte Aussenkante des 
   Polygons zurueckgegeben.
   Es arbeitet wie add_polygon nur im anderen Drehsinn. Das wird fuer die REkonstruktion
   der Patches gebraucht
   Im Falle, dass nur eine Kante eingefuegt werden muss, wird *lastout auf die naechste 
   zu benutzende Aussenkante gesetzt. Die ist nicht mit dem gebauten Polygon
   inzident. Im Falle, dass es sie nicht gibt, wird *lastout auf nil gesetzt.

   angefuegt wird in den Winkel in prev-Richtung, d.h. zwischen start und start->prev

 */


{
int i, new_tempknz, tempknz;
KANTE *ende, *run;
int common_vertices;


if (start->name != aussen) { fprintf(stderr,"ERROR ADD_P_INV not starting at external edge\n");
			     exit(86); }

if (IPR && (n==5))
  { 
    if (checksize_2(start->prev)==5) is_ipr=0;
    for (ende=start->prev->invers->prev, common_vertices=2; ende->name != aussen; 
	  ende=ende->invers->prev) {if (checksize_2(ende)==5) is_ipr=0;
                                     common_vertices++;
				   }
  }
else for (ende=start->prev->invers->prev, common_vertices=2; ende->name != aussen; 
	  ende=ende->invers->prev) common_vertices++;


if (n<common_vertices) 
   { fprintf(stderr,"polygon to insert (inv) too small !\n"); 
     exit(87); }

/* es muessen also n-common_vertices knoten hinzugefuegt werden */

tempknz=map[0][0].name;
new_tempknz=tempknz+n-common_vertices;

if (n-common_vertices==0) /* dann kommt kein knoten dazu */
  { start->name=ende->ursprung; start->invers=ende;
    ende->name=start->ursprung; ende->invers=start;

    for (ende=start->next->invers->next, common_vertices=2; 
	 (ende->name != aussen) && (common_vertices<6); 
         ende=ende->invers->next) common_vertices++;
    if (common_vertices<6) *lastout=ende; /* ein common_vertices+1 -- Eck ist noch moeglich */
    else { *lastout=nil;
	   if (ende==start->next) /* dann ist nur noch eine 5-Eck Luecke */
	     { for (i=anzahl_5ek+5, run=start->invers; anzahl_5ek<i; 
		  anzahl_5ek++, run=run->invers->next) { F_eck_kanten[anzahl_5ek]=run;
							 if (IPR)
							   if (checksize_right_2(run)==5) is_ipr=0; }
	     }
	 }
  }
else
  {
    if (n-common_vertices==1) /* dann kommt nur ein knoten dazu */
      {
	tempknz++;
	start->name=tempknz; start->invers=map[tempknz];
	map[tempknz][0].name=start->ursprung; map[tempknz][0].invers=start;
	map[tempknz][1].name=ende->ursprung; map[tempknz][1].invers=ende;
	ende->name=tempknz; ende->invers=map[tempknz]+1;
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	*lastout=map[tempknz]+2;
	map[0][0].name=tempknz;
      }
    else
      {
	
	/* es bleibt: mindestens zwei neue knoten */
	
	tempknz++;
	start->name=tempknz; start->invers=map[tempknz];
	map[tempknz][0].name=start->ursprung; map[tempknz][0].invers=start;
	map[tempknz][1].name=tempknz+1; map[tempknz][1].invers=map[tempknz+1];
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	
	for (tempknz++; tempknz<new_tempknz; tempknz++)
	  { map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+1;
	    map[tempknz][1].name=tempknz+1; map[tempknz][1].invers=map[tempknz+1]; 
	    map[tempknz][2].name=aussen; map[tempknz][2].invers=nil; }
	
	/* und nun noch den letzten knoten */
	map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+1;
	map[tempknz][1].name=ende->ursprung; map[tempknz][1].invers= ende;
	ende->name=tempknz; ende->invers=map[tempknz]+1;
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	*lastout=map[tempknz]+2;
	map[0][0].name=tempknz;
      } /* ende zweites else */
  } /* ende erstes else */

if (n==5)
  for (i=anzahl_5ek+5, run=start; anzahl_5ek<i; 
       anzahl_5ek++, run=run->invers->next) F_eck_kanten[anzahl_5ek]=run;

return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
cmpw $0x246, 0x2(%rdx)       # imm = 0x246
jne 0xc8ee
movb 0x8c06(%rip), %r8b      # 0x15191
testb %r8b, %r8b
setne %r9b
cmpl $0x5, %edi
sete %r10b
movq 0x18(%rdx), %rax
testb %r9b, %r10b
je 0xc62e
movq 0x28(%rax), %r9
movq 0x20(%r9), %r10
cmpq %rax, %r10
je 0xc5de
movl $0x4, %r11d
cmpw $0x246, 0x2(%r10)       # imm = 0x246
je 0xc5de
movq 0x28(%r10), %r10
movq 0x20(%r10), %r10
decl %r11d
cmpq %rax, %r10
jne 0xc5b9
testl %r11d, %r11d
jne 0xc5de
movb $0x0, 0x8b86(%rip)      # 0x15164
movq 0x18(%r9), %rax
movl $0x2, %r9d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0xc647
movq 0x28(%rax), %r10
movq 0x20(%r10), %r11
cmpq %rax, %r11
je 0xc625
movl $0x4, %ebx
cmpw $0x246, 0x2(%r11)       # imm = 0x246
je 0xc625
movq 0x28(%r11), %r11
movq 0x20(%r11), %r11
decl %ebx
cmpq %rax, %r11
jne 0xc602
testl %ebx, %ebx
jne 0xc625
movb $0x0, 0x8b3f(%rip)      # 0x15164
incl %r9d
movq 0x18(%r10), %rax
jmp 0xc5e8
movl $0x1, %r9d
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
incl %r9d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
jne 0xc634
cmpl %r9d, %edi
jl 0xc8f3
movl %edi, %r10d
subl %r9d, %r10d
jne 0xc6a9
movzwl (%rax), %esi
movw %si, 0x2(%rdx)
leaq 0x28(%rdx), %rsi
movq %rax, 0x28(%rdx)
movzwl (%rdx), %r9d
movw %r9w, 0x2(%rax)
movq %rdx, 0x28(%rax)
movq 0x20(%rdx), %rax
movl $0x2, %r10d
movl %r10d, %r9d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0xc69b
leal 0x1(%r9), %r10d
cmpl $0x6, %r9d
jb 0xc67e
cmpl $0x5, %r9d
ja 0xc71a
movq %rax, (%rcx)
jmp 0xc8a3
movzwl 0x2(%rsi), %r11d
leaq 0x1(%r11), %r8
leaq (%r8,%r8,8), %rbx
shll $0x4, %ebx
leaq (%rsi,%rbx), %r9
movw %r8w, 0x2(%rdx)
movq %r9, 0x28(%rdx)
movzwl (%rdx), %ebp
movw %bp, 0x2(%rsi,%rbx)
movq %rdx, 0x28(%rsi,%rbx)
cmpl $0x1, %r10d
jne 0xc79a
movzwl (%rax), %r10d
leaq 0x30(%r9), %r11
movw %r10w, 0x32(%r9)
movq %rax, 0x58(%r9)
movw %r8w, 0x2(%rax)
movq %r11, 0x28(%rax)
leaq 0x60(%r9), %rax
movw $0x246, 0x62(%r9)       # imm = 0x246
movq $0x0, 0x88(%r9)
movq %rax, (%rcx)
movw %r8w, 0x2(%rsi)
jmp 0xc8a3
movq $0x0, (%rcx)
cmpq 0x20(%rdx), %rax
jne 0xc8a3
movslq 0x15626(%rip), %r10     # 0x21d58
leaq 0x4(%r10), %rax
leaq 0x8b33(%rip), %rcx      # 0x15270
movq %r10, %r9
movq (%rsi), %r10
movq %r10, (%rcx,%r9,8)
movq 0x28(%r10), %rsi
testb %r8b, %r8b
je 0xc781
movq 0x18(%rsi), %r11
cmpq %r10, %r11
je 0xc781
movl $0x4, %ebx
cmpw $0x246, 0x2(%r11)       # imm = 0x246
je 0xc781
movq 0x28(%r11), %r11
movq 0x18(%r11), %r11
decl %ebx
cmpq %r10, %r11
jne 0xc75e
testl %ebx, %ebx
jne 0xc781
movb $0x0, 0x89e3(%rip)      # 0x15164
leaq 0x1(%r9), %r10
addq $0x20, %rsi
cmpq %rax, %r9
jl 0xc73d
movl %r10d, 0x155c3(%rip)    # 0x21d58
jmp 0xc8a3
leal (%r10,%r11), %r8d
leaq 0x2(%r11), %r10
movw %r10w, 0x32(%r9)
leaq (%r10,%r10,8), %rbx
shll $0x4, %ebx
addq %rsi, %rbx
movq %rbx, 0x58(%r9)
movw $0x246, 0x62(%r9)       # imm = 0x246
movq $0x0, 0x88(%r9)
movq %r10, %r9
movl %r10d, %ebx
cmpl %r8d, %r10d
jge 0xc845
movl %r11d, %r11d
movl %r8d, %r9d
leaq (%r11,%r11,8), %r10
shll $0x4, %r10d
addq %rsi, %r10
leaq -0x2(%r9), %rbx
leaq 0x1(%r11), %r14
movw %r14w, 0x122(%r10)
leaq 0xc0(%r10), %r15
movq %r15, 0x148(%r10)
addl $0x3, %r11d
movw %r11w, 0x152(%r10)
leaq 0x1b0(%r10), %r11
movq %r11, 0x178(%r10)
movw $0x246, 0x182(%r10)     # imm = 0x246
movq $0x0, 0x1a8(%r10)
addq $0x90, %r10
movq %r14, %r11
cmpq %r14, %rbx
jne 0xc7e7
movl %r8d, %r10d
movl %r8d, %ebx
decl %ebx
leaq (%r9,%r9,8), %r8
shlq $0x4, %r8
leaq (%rsi,%r8), %r9
addq $0x30, %r9
movw %bx, -0x2e(%r9)
movslq %ebx, %r11
leaq (%r11,%r11,8), %r11
shlq $0x4, %r11
addq %rsi, %r11
addq $0x30, %r11
movq %r11, -0x8(%r9)
movzwl (%rax), %r11d
movw %r11w, 0x2(%r9)
movq %rax, 0x28(%r9)
movw %r10w, 0x2(%rax)
movq %r9, 0x28(%rax)
leaq 0x60(%rsi,%r8), %rax
movw $0x246, 0x2(%rax)       # imm = 0x246
movq $0x0, 0x28(%rax)
movq %rax, (%rcx)
movw %r10w, 0x2(%rsi)
cmpl $0x5, %edi
jne 0xc8e3
movslq 0x154a9(%rip), %rax     # 0x21d58
leaq 0x4(%rax), %rcx
leaq 0x89b6(%rip), %rsi      # 0x15270
leaq (%rsi,%rax,8), %rsi
movq %rax, %rdi
decq %rdi
movq %rdx, (%rsi)
movq 0x28(%rdx), %rdx
movq 0x20(%rdx), %rdx
incq %rdi
addq $0x8, %rsi
incl %eax
cmpq %rcx, %rdi
jl 0xc8c4
movl %eax, 0x15475(%rip)     # 0x21d58
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
callq 0x2000
callq 0x2025