// File: /workspace/github_cpp_makefile_star2_O2/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
andl $0x0, (%r8)
movq 0x20(%rsp), %r11
andl $0x0, (%r11)
andl $0x0, (%r9)
movq (%rsi), %rbx
cmpq %rbx, 0x8(%rsi)
je 0x2147c
movl %edx, %r10d
movq (%rdi), %r14
movq 0x8(%rdi), %rax
subq %r14, %rax
movabsq $0x18, %rsi
cqto
idivq %rsi
movslq %r10d, %rdx
movslq %ecx, %rcx
imulq $0x38, %rdx, %rsi
addq %rbx, %rsi
addq $0x24, %rsi
imulq $0x18, %rdx, %rdi
addq %r14, %rdi
addq $0x8, %rdi
xorps %xmm2, %xmm2
xorl %r10d, %r10d
movss 0x9f65(%rip), %xmm3     # 0x2b310
xorps %xmm1, %xmm1
xorps %xmm5, %xmm5
xorps %xmm4, %xmm4
cmpq %rcx, %rdx
jg 0x2148b
cmpq %rdx, %rax
jbe 0x2148b
movss -0x10(%rsi), %xmm6
addss (%rsi), %xmm6
subss -0x8(%rsi), %xmm6
movss (%rdi), %xmm7
ucomiss %xmm0, %xmm7
jbe 0x213f2
ucomiss %xmm2, %xmm6
jbe 0x21413
ucomiss %xmm2, %xmm5
jbe 0x2142f
ucomiss %xmm6, %xmm5
jbe 0x2145d
subss %xmm6, %xmm5
jmp 0x2146c
ucomiss %xmm6, %xmm2
jbe 0x2146c
subss %xmm6, %xmm5
ucomiss (%r11), %xmm5
jbe 0x2140c
movss %xmm5, (%r11)
movl %edx, (%r9)
movl %edx, %r10d
ucomiss %xmm3, %xmm5
jbe 0x2146c
jmp 0x21481
subss %xmm6, %xmm5
ucomiss (%r11), %xmm5
jbe 0x21428
movss %xmm5, (%r11)
movl %edx, (%r9)
movl %edx, %r10d
ucomiss %xmm3, %xmm5
jbe 0x2146c
jmp 0x2148b
addss %xmm6, %xmm4
ucomiss (%r8), %xmm4
jbe 0x21452
movslq %r10d, %rbx
cmpq %rbx, %rdx
setge %bpl
testl %ebx, %ebx
setne %bl
testb %bl, %bpl
jne 0x21452
movss %xmm4, (%r8)
addss %xmm6, %xmm1
ucomiss %xmm3, %xmm1
jb 0x2146c
jmp 0x2148b
subss %xmm5, %xmm6
addss %xmm6, %xmm1
addss %xmm6, %xmm4
xorps %xmm5, %xmm5
incq %rdx
addq $0x38, %rsi
addq $0x18, %rdi
jmp 0x213b4
xorps %xmm1, %xmm1
jmp 0x2148b
movl $0x42c80000, (%r11)     # imm = 0x42C80000
movl %edx, (%r9)
movaps %xmm1, %xmm0
popq %rbx
popq %r14
popq %rbp
retq