// File: /workspace/github_cpp_makefile_star2_O3/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 %rbx
movq 0x18(%rsp), %rax
xorl %r10d, %r10d
movl %r10d, (%r8)
movl %r10d, (%rax)
movl %r10d, (%r9)
movq (%rsi), %r11
cmpq %r11, 0x8(%rsi)
sete %sil
cmpl %ecx, %edx
setg %bl
orb %sil, %bl
xorps %xmm1, %xmm1
jne 0x24e2b
movq (%rdi), %rbx
movq 0x8(%rdi), %rdi
subq %rbx, %rdi
sarq $0x3, %rdi
movabsq $-0x5555555555555555, %rsi # imm = 0xAAAAAAAAAAAAAAAB
imulq %rdi, %rsi
movslq %edx, %rdx
incl %ecx
imulq $0x38, %rdx, %rdi
addq %r11, %rdi
addq $0x24, %rdi
leaq (%rdx,%rdx,2), %r11
leaq 0x8(%rbx,%r11,8), %r11
xorps %xmm2, %xmm2
movss 0xb685(%rip), %xmm3     # 0x303e0
xorps %xmm4, %xmm4
xorps %xmm5, %xmm5
cmpq %rdx, %rsi
jbe 0x24e2b
movss -0x10(%rdi), %xmm6
addss (%rdi), %xmm6
subss -0x8(%rdi), %xmm6
movss (%r11), %xmm7
ucomiss %xmm0, %xmm7
jbe 0x24d97
ucomiss %xmm2, %xmm6
jbe 0x24db6
ucomiss %xmm2, %xmm5
jbe 0x24dd0
ucomiss %xmm6, %xmm5
jbe 0x24dfe
subss %xmm6, %xmm5
jmp 0x24e0d
ucomiss %xmm6, %xmm2
jbe 0x24e0d
subss %xmm6, %xmm5
ucomiss (%rax), %xmm5
jbe 0x24daf
movss %xmm5, (%rax)
movl %edx, (%r9)
movl %edx, %r10d
ucomiss %xmm3, %xmm5
jbe 0x24e0d
jmp 0x24e22
subss %xmm6, %xmm5
ucomiss (%rax), %xmm5
jbe 0x24dc9
movss %xmm5, (%rax)
movl %edx, (%r9)
movl %edx, %r10d
ucomiss %xmm3, %xmm5
jbe 0x24e0d
jmp 0x24e2b
addss %xmm6, %xmm4
ucomiss (%r8), %xmm4
jbe 0x24df3
movslq %r10d, %rbx
cmpq %rbx, %rdx
setge %bpl
testl %ebx, %ebx
setne %bl
testb %bl, %bpl
jne 0x24df3
movss %xmm4, (%r8)
addss %xmm6, %xmm1
ucomiss %xmm3, %xmm1
jb 0x24e0d
jmp 0x24e2b
subss %xmm5, %xmm6
addss %xmm6, %xmm1
addss %xmm6, %xmm4
xorps %xmm5, %xmm5
incq %rdx
addq $0x38, %rdi
addq $0x18, %r11
cmpl %edx, %ecx
jne 0x24d61
jmp 0x24e2b
movl $0x42c80000, (%rax)     # imm = 0x42C80000
movl %edx, (%r9)
movaps %xmm1, %xmm0
popq %rbx
popq %rbp
retq