// Aplica o back-end do juninho
@target          : mips 
// Especifica o tipo de metodo empregado para salvar o resultado da compilação
//@export          : MultCoreJun
@export          : simulation

// Diretorio onde o resultado da compilação será gravado
@outputDirectory : `C:\Users\EUGENIO CARVALHO\Desktop\tmp\bitCount`

// Quantidade de palavras de um bloco 32 palavras de 4bytes
@cacheBlockSize: `32`

/**
    Profile de compilacao do back-end
    O formato da string é um json que descreve um array de definições de cada core
    {
        "stackBaseAddress"   : 5888,     -> endereço da base da pilha do core em questão
        "initFunction": "multiplica(0)", -> define a main de cada core. aceita ate 4 parametros com valores de constantes
        "id": "core0"                    -> label que define o codigo de cada core
    },

    Se "stackBaseAddress" não for definido o compilador irá inferir o valor iniciando do ultimo endereço da memoria    
*/

@profile: `[
    {
        "id"               : "core0",
        "initFunction"     : "bitCount(0)",
        "filename"         : "%s_core_0.txt"
    },
    {
        "id"               : "core1",
        "initFunction"     : "bitCount(18750)",
        "filename"         : "%s_core_1.txt"
    },
    {
        "id"               : "core2",
        "initFunction"     : "bitCount(37500)",
        "filename"         : "%s_core_2.txt"
    },
    {
        "id"               : "core3",
        "initFunction"     : "bitCount(56250)",
        "filename"         : "%s_core_3.txt"
    }
]`

package main;

import "sync"

type x struct {
    a int32
    b bool
    c int32
    d bool
    e byte
}

var (
    result = 0
    bolena bool 
    //mut sync.Mutex
    x1 x
)



func bitCount(x int32) int {
    n := 0
    if x > 0 {
        for true {
            n++
            if x = x & (x-1); x == 0 {
                    break
            }
        }
    }
    //mut.Lock()
    result += n
    //mut.Unlock()

    return n
}

func main(){
    var (
	n     = 0
	seed  = 10033
    )
    
    bolena = true

    for i := 0; i < 10; i++ {
    //for i := 0; i < 2; i++ {
        n += bitCount(seed)
	//seed += 1
	seed += 2
    }

    return n
}