Untitled
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]); }