Untitled
unknown
c_cpp
2 years ago
3.2 kB
7
Indexable
. 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]);
}Editor is loading...