// File: ddunbar[P]PDSample/RangeList.cpp
// Function: RangeList::subtract(float, float)
void RangeList::subtract(float a, float b)
{
	static const float twoPi = (float) (M_PI*2);

	if (a>twoPi) {
		subtract(a-twoPi, b-twoPi);
	} else if (b<0) {
		subtract(a+twoPi, b+twoPi);
	} else if (a<0) {
		subtract(0, b);
		subtract(a+twoPi,twoPi);
	} else if (b>twoPi) {
		subtract(a, twoPi);
		subtract(0, b-twoPi);
	} else if (numRanges==0) {
		;
	} else {
		int pos;

		if (a<ranges[0].min) {
			pos = -1;
		} else {
			int lo=0, mid=0, hi=numRanges;

			while (lo<hi-1) {
				mid = (lo+hi)>>1;
				if (ranges[mid].min<a) {
					lo = mid;
				} else {
					hi = mid;
				}
			}

			pos = lo;
		}

		if (pos==-1) {
			pos = 0;
		} else if (a<ranges[pos].max) {
			float c = ranges[pos].min;
			float d = ranges[pos].max;
			if (a-c<kSmallestRange) {
				if (b<d) {
					ranges[pos].min = b;
				} else {
					deleteRange(pos);
				}
			} else {
				ranges[pos].max = a;
				if (b<d) {
					insertRange(pos+1, b, d);
				}
				pos++;
			}
		} else {
			if (pos<numRanges-1 && b>ranges[pos+1].min) {
				pos++;
			} else {
				return;
			}
		}

		while (pos<numRanges && b>ranges[pos].min) {
			if (ranges[pos].max-b<kSmallestRange) {
				deleteRange(pos);
			} else {
				ranges[pos].min = b;
			}
		}
	}
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x30(%rsp)
movss %xmm0, 0x2c(%rsp)
movss %xmm1, 0x28(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x8(%rsp)
movss 0x2c(%rsp), %xmm0
movss 0x658b(%rip), %xmm1     # 0x164d8
ucomiss %xmm1, %xmm0
jbe 0xff85
movq 0x8(%rsp), %rdi
movss 0x2c(%rsp), %xmm0
movss 0x6573(%rip), %xmm1     # 0x164d8
subss %xmm1, %xmm0
movss 0x28(%rsp), %xmm1
movss 0x6561(%rip), %xmm2     # 0x164d8
subss %xmm2, %xmm1
callq 0xff20
jmp 0x102da
xorps %xmm0, %xmm0
ucomiss 0x28(%rsp), %xmm0
jbe 0xffba
movq 0x8(%rsp), %rdi
movss 0x653c(%rip), %xmm0     # 0x164d8
addss 0x2c(%rsp), %xmm0
movss 0x652e(%rip), %xmm1     # 0x164d8
addss 0x28(%rsp), %xmm1
callq 0xff20
jmp 0x102d8
xorps %xmm0, %xmm0
ucomiss 0x2c(%rsp), %xmm0
jbe 0xfffc
movq 0x8(%rsp), %rdi
movss 0x28(%rsp), %xmm1
xorps %xmm0, %xmm0
callq 0xff20
movq 0x8(%rsp), %rdi
movss 0x64f4(%rip), %xmm0     # 0x164d8
addss 0x2c(%rsp), %xmm0
movss 0x64e6(%rip), %xmm1     # 0x164d8
callq 0xff20
jmp 0x102d6
movss 0x28(%rsp), %xmm0
movss 0x64ce(%rip), %xmm1     # 0x164d8
ucomiss %xmm1, %xmm0
jbe 0x1004b
movq 0x8(%rsp), %rdi
movss 0x2c(%rsp), %xmm0
movss 0x64b6(%rip), %xmm1     # 0x164d8
callq 0xff20
movq 0x8(%rsp), %rdi
movss 0x28(%rsp), %xmm1
movss 0x649e(%rip), %xmm0     # 0x164d8
subss %xmm0, %xmm1
xorps %xmm0, %xmm0
callq 0xff20
jmp 0x102d4
movq 0x8(%rsp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x1005b
jmp 0x102d2
movq 0x8(%rsp), %rax
movss 0x2c(%rsp), %xmm1
movq (%rax), %rax
movss (%rax), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x1007c
movl $0xffffffff, 0x24(%rsp) # imm = 0xFFFFFFFF
jmp 0x100ee
movq 0x8(%rsp), %rax
movl $0x0, 0x20(%rsp)
movl $0x0, 0x1c(%rsp)
movl 0x8(%rax), %eax
movl %eax, 0x18(%rsp)
movl 0x20(%rsp), %eax
movl 0x18(%rsp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jge 0x100e6
movq 0x8(%rsp), %rax
movl 0x20(%rsp), %ecx
addl 0x18(%rsp), %ecx
sarl %ecx
movl %ecx, 0x1c(%rsp)
movq (%rax), %rax
movslq 0x1c(%rsp), %rcx
movss (%rax,%rcx,8), %xmm1
movss 0x2c(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x100dc
movl 0x1c(%rsp), %eax
movl %eax, 0x20(%rsp)
jmp 0x100e4
movl 0x1c(%rsp), %eax
movl %eax, 0x18(%rsp)
jmp 0x10098
movl 0x20(%rsp), %eax
movl %eax, 0x24(%rsp)
cmpl $-0x1, 0x24(%rsp)
jne 0x10102
movl $0x0, 0x24(%rsp)
jmp 0x1023f
movq 0x8(%rsp), %rax
movss 0x2c(%rsp), %xmm1
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss 0x4(%rax,%rcx,8), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x101f8
movq 0x8(%rsp), %rax
movq (%rax), %rcx
movslq 0x24(%rsp), %rdx
movss (%rcx,%rdx,8), %xmm0
movss %xmm0, 0x14(%rsp)
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss 0x4(%rax,%rcx,8), %xmm0
movss %xmm0, 0x10(%rsp)
movss 0x2c(%rsp), %xmm1
subss 0x14(%rsp), %xmm1
movss 0x82a8(%rip), %xmm0     # 0x1840c
ucomiss %xmm1, %xmm0
jbe 0x101a4
movss 0x28(%rsp), %xmm1
movss 0x10(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x10194
movq 0x8(%rsp), %rax
movss 0x28(%rsp), %xmm0
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss %xmm0, (%rax,%rcx,8)
jmp 0x101a2
movq 0x8(%rsp), %rdi
movl 0x24(%rsp), %esi
callq 0xfd70
jmp 0x101f6
movq 0x8(%rsp), %rax
movss 0x2c(%rsp), %xmm0
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss %xmm0, 0x4(%rax,%rcx,8)
movss 0x28(%rsp), %xmm1
movss 0x10(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x101eb
movq 0x8(%rsp), %rdi
movl 0x24(%rsp), %esi
addl $0x1, %esi
movss 0x28(%rsp), %xmm0
movss 0x10(%rsp), %xmm1
callq 0xfdf0
movl 0x24(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x24(%rsp)
jmp 0x1023d
movq 0x8(%rsp), %rcx
movl 0x24(%rsp), %eax
movl 0x8(%rcx), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jge 0x10236
movq 0x8(%rsp), %rax
movss 0x28(%rsp), %xmm0
movq (%rax), %rax
movl 0x24(%rsp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
ucomiss (%rax,%rcx,8), %xmm0
jbe 0x10236
movl 0x24(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x24(%rsp)
jmp 0x1023b
jmp 0x102da
jmp 0x1023d
jmp 0x1023f
jmp 0x10241
movq 0x8(%rsp), %rdx
movl 0x24(%rsp), %ecx
xorl %eax, %eax
cmpl 0x8(%rdx), %ecx
movb %al, 0x7(%rsp)
jge 0x10273
movq 0x8(%rsp), %rax
movss 0x28(%rsp), %xmm0
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
ucomiss (%rax,%rcx,8), %xmm0
seta %al
movb %al, 0x7(%rsp)
movb 0x7(%rsp), %al
testb $0x1, %al
jne 0x1027d
jmp 0x102d0
movq 0x8(%rsp), %rax
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss 0x4(%rax,%rcx,8), %xmm1
subss 0x28(%rsp), %xmm1
movss 0x816e(%rip), %xmm0     # 0x1840c
ucomiss %xmm1, %xmm0
jbe 0x102b3
movq 0x8(%rsp), %rdi
movl 0x24(%rsp), %esi
callq 0xfd70
jmp 0x102cb
movq 0x8(%rsp), %rax
movss 0x28(%rsp), %xmm0
movq (%rax), %rax
movslq 0x24(%rsp), %rcx
movss %xmm0, (%rax,%rcx,8)
jmp 0x10241
jmp 0x102d2
jmp 0x102d4
jmp 0x102d6
jmp 0x102d8
jmp 0x102da
addq $0x38, %rsp
retq
nop