Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.2 kB
1
Indexable
Never
. data
l e n : . dword 16
vec1 :  .dword 6 , 1 , 1 5 , 8 , 6 , 1 0 , 2 , 1 9 , 6 , 6 , 1 , 1 1 , 9 , 1 9 , 1 2 , 8
vec2 :  .dword 4 , 1 8 , 8 , 9 , 6 , 6 , 3 , 1 3 , 1 2 , 9 , 3 , 0 , 1 3 , 0 , 8 , 1 6
vec3 :  .dword 8 , 1 3 , 1 5 , 9 , 6 , 1 1 , 1 2 , 1 0 , 8 , 1 3 , 2 , 1 5 , 1 1 , 5 , 1 9 , 0
rslt1 : .dword 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
rslt2 : .dword 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
rslt3 : .dword 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
.text                               # no entiendo la parte del código .text
addi x10 , x3 , 8
ld x30 , 0 ( x3 )
loop :  ld      x11 ,0(x10)         # cargamos en el regsitro x11 el puntero al elemento del array rstl1
        ld      x12 , 128(x10)      # cargamos en el registro x12 el puntero al elemento del array rstl2
        ld      x13 , 256(x10)      # cargamos en el registro x13 el puntero al elemento del array rstl3
        add     x14 , x11 , x12     # sumamos el valor del primer elemento del primer array y el primer elemento del segundo array --> seguramente los arrays cargados son vec
        add     x14 , x14 , x13     # sumamos a la suma anterior, el primer elemento del 3er array (total: vec1[i] + vec2[i] + vec3[i])
        sd      x14 , 384( x10 )    # guardamos rslt1[i] en valor de x10 + 384 (128 · 3)
        sub     x16 , x13 , x12     # realizamos operación vec3[i] - vec2[i]
        mul     x13 , x13 , x13     # realizamos operación vec3[i] * vec3[i] y guardamos en el regitro x13(? estamos modificando array original)
        sub     x15 , x13 , x11     # realizamos operación vec3[i] - vec1[i] [(vec3[i] * vec3[i]) - vec1[i]] de forma global
        sub     x16 , x13 , x16     # le restamos a (vec3[i]^2) el (vec3[i] - vec2[i])
        sd      x15 , 512( x10 )    # guardamos rstl2[i] en valor de x10 + 512 (128 · 4)
        sd      x16 , 640( x10 )    # guardamos rslt3[i] en valor de x10 + 640 (128 · 5)
        addi    x10 , x10, 8        # next word: 8 bytes ahead
        addi    x30 , x30, −1       # ??????
        bne     x30 , x0, loop      # x30 != x0 ? branch : None


# REGISTROS RSLT: 
#    rslt1 --> x14
#    rslt2 --> x15
#    rslt3 --> x16

## APARTADO 2: HAY QUE REORDENAR INSTRUCCIONES PARA REDUCIR LAS PARADAS
## FIJARSE EN INSTRUCCIONES LOAD Y STORE, QUE SUELEN SER FÁCILMENTE REORDENABLES

## APARTADO 3: HAY QUE DESENRROLLAR FOR EN 2 PASOS, ES DECIR, REALIZAR 2 ITERACIONES DEL FOR ORIGINAL EN UNA SOLA DEL NUEVO FOR (BUCLE)

# Primero lo hacemos en código C:
# CÓDIGO ORIGINAL:
for (i=0; i<len; i++) {
    rslt1[i] = vec1 [i] + vec2[i] + vec3[i];
    rslt2[i] = vec3 [i] ∗ vec3[i] − vec1[i];
    rslt3[i] = vec3 [i] ∗ vec3[i] − (vec3[i] − vec2[i]) ;
}


for (i=0; i<len/2; i+=2) {

    // vuelta 1 
    rslt1[i] = vec1 [i] + vec2[i] + vec3[i];
    rslt2[i] = vec3 [i] ∗ vec3[i] − vec1[i];
    rslt3[i] = vec3 [i] ∗ vec3[i] − (vec3[i] − vec2[i]);

    // vuelta 2
    rslt1[i + 1] = vec1 [i + 1] + vec2[i + 1] + vec3[i + 1];
    rslt2[i + 1] = vec3 [i + 1] ∗ vec3[i + 1] − vec1[i + 1];
    rslt3[i + 1] = vec3 [i + 1] ∗ vec3[i + 1] − (vec3[i + 1] − vec2[i + 1]);
}