// File: /workspace/github_cpp_makefile_star2_O1/Eba-M[P]E3DC-Control/awattar.cpp
// Function: fHighprice(std::vector<watt_s, std::allocator<watt_s>>&, std::vector<wetter_s, std::allocator<wetter_s>>&, int, int, float, float&, int&, float&)
float fHighprice(std::vector<watt_s> &w,std::vector<wetter_s> &wetter,int ab,int bis,float preis,float &minsoc,int &maxpos,float &maxsoc)    // Anzahle Einträge mit > preis
{                                            // l1 = erste position h1 = letzte Position
    float x1 = 0;   // x1 = Bedarf
    float x2 = 0;   // solarer zugewinn
    float x3 = 0;   // Verbrauch/Ertrag
    float x4 = 0;   // maximale Entladung = Bedarf
    minsoc = 0; // min erreicher Soc
    maxsoc = 0; // maximal erreicher Soc
    maxpos = 0;
    if (wetter.size() == 0)
        return 0;
    for (int j = ab; (j <= bis)&&(j<w.size()); j++ )
    {
        x3 = wetter[j].hourly + wetter[j].wpbedarf - wetter[j].solar;;
        // Suchen nach Hoch und Tiefs
        if (w[j].pp > preis) 
        {
            if (x3 > 0)  // Verbrauch bei höheren Preis
            {
                if (x2 > 0)
                {
                    if (x2>x3)    // Konnte schon nachgeladen werden, dann vom bedarf abziehen.
                        x2 = x2 - x3;
                    else
                    {
                        x3 = x3 - x2; // solaren Zugewinn abziehen
                        x1 = x1 + x3; // Bedarf hinzurechen
                        x2 = 0;       // Zugewinn ist nun 0
                        x4 = x4 + x3; // MinSoC
                    }
                }
                        // mit Solaretrag verrechnen
                else
                {
                    x1 = x1 + x3;
                    x4 = x4 + x3;
                    if (x4 > minsoc&&(j<maxpos||maxpos==0))
                        minsoc = x4;
                    if (x1>=100) return x1;
                }
            }
            else // Ertrag bei höheren Preis
            {
                x2 = x2 - x3;
                if (x2>maxsoc) {
                    maxsoc = x2;
                    maxpos = j;
                }
// Highpricesuche abbrechen
                if (x2 > 100)
                return x1;
                    
            }
        } else
            if (x3 < 0)
            {              // PV Überschuss ?
                x2 = x2 - x3;
                if (x2>maxsoc) {
                    maxsoc = x2;
                    maxpos = j;
                }
                if (x2 > 100)
                {
                    x2 = 100;
                    maxsoc = x2;
                    maxpos = j;
                    // Wenn der Speicher voll ist, kann abgebrochen werden?
                    return x1;
                }
            }
    }
    return x1;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
movq 0x20(%rsp), %r10
xorl %eax, %eax
movl %eax, (%r8)
movl %eax, (%r10)
movl %eax, (%r9)
movq (%rsi), %r11
cmpq %r11, 0x8(%rsi)
je 0x24ded
movb $0x1, %al
cmpl %ecx, %edx
jle 0x24df5
xorps %xmm0, %xmm0
jmp 0x24f17
xorps %xmm0, %xmm0
jmp 0x24f19
movaps %xmm0, %xmm1
movl (%r9), %esi
movq (%rdi), %rbx
movq 0x8(%rdi), %r14
subq %rbx, %r14
sarq $0x3, %r14
movabsq $-0x5555555555555555, %rdi # imm = 0xAAAAAAAAAAAAAAAB
imulq %r14, %rdi
movslq %edx, %rdx
incl %ecx
imulq $0x38, %rdx, %r14
addq %r14, %r11
addq $0x24, %r11
leaq (%rdx,%rdx,2), %r14
leaq 0x8(%rbx,%r14,8), %rbx
xorps %xmm2, %xmm2
movss 0xb5a5(%rip), %xmm3     # 0x303e0
xorps %xmm4, %xmm4
xorps %xmm5, %xmm5
xorps %xmm0, %xmm0
cmpq %rdx, %rdi
jbe 0x24f17
movss -0x10(%r11), %xmm6
addss (%r11), %xmm6
subss -0x8(%r11), %xmm6
movss (%rbx), %xmm7
ucomiss %xmm1, %xmm7
jbe 0x24e7c
ucomiss %xmm2, %xmm6
jbe 0x24e9c
ucomiss %xmm2, %xmm5
jbe 0x24eb7
ucomiss %xmm6, %xmm5
jbe 0x24ee7
subss %xmm6, %xmm5
jmp 0x24ef6
ucomiss %xmm6, %xmm2
jbe 0x24ef6
subss %xmm6, %xmm5
ucomiss (%r10), %xmm5
jbe 0x24e95
movss %xmm5, (%r10)
movl %edx, (%r9)
movl %edx, %esi
ucomiss %xmm3, %xmm5
jbe 0x24ef6
jmp 0x24f0b
subss %xmm6, %xmm5
ucomiss (%r10), %xmm5
jbe 0x24eb0
movss %xmm5, (%r10)
movl %edx, (%r9)
movl %edx, %esi
ucomiss %xmm3, %xmm5
jbe 0x24ef6
jmp 0x24f15
addss %xmm6, %xmm4
ucomiss (%r8), %xmm4
jbe 0x24edc
movslq %esi, %r14
cmpq %r14, %rdx
setge %bpl
testl %r14d, %r14d
setne %r14b
testb %r14b, %bpl
jne 0x24edc
movss %xmm4, (%r8)
addss %xmm6, %xmm0
ucomiss %xmm3, %xmm0
jb 0x24ef6
jmp 0x24f15
subss %xmm5, %xmm6
addss %xmm6, %xmm0
addss %xmm6, %xmm4
xorps %xmm5, %xmm5
incq %rdx
addq $0x38, %r11
addq $0x18, %rbx
cmpl %edx, %ecx
jne 0x24e44
jmp 0x24f17
movl $0x42c80000, (%r10)     # imm = 0x42C80000
movl %edx, (%r9)
xorl %eax, %eax
testb %al, %al
popq %rbx
popq %r14
popq %rbp
retq