2.3.6 Hankel x Hilbert

Multiplicação de uma matriz de Hankel por uma matriz de Hilbert

Wolfram Mathematica Matriz Hankel x Hilbert
Wolfram Mathematica Matriz Hankel x Hilbert

Mostra o código assembly gerado pelo compilador C para o programa que faz a multiplicação.

/**
 * @file    mat_mult_hank_hilb.c
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 * 
 * Este programa tem por finalidade multiplicar uma matriz de Hankel
 * por uma matriz de Hilbert.
 * 
 */

#include <stdio.h>

extern void asm_hankel(int ordem, int matriz[ordem][ordem]);
extern void asm_hilbert(int ordem, float matriz[ordem][ordem]);

void print(int ordem, float matriz[ordem][ordem]) {
    int linha, coluna;
    for (linha = 0; linha < ordem; linha++) {
        for (coluna = 0; coluna < ordem; coluna++) {
            printf("%8.4f", matriz[linha][coluna]);
        }
        printf("\n");
    }
    return;
}

void main () {
    int ordem = 10;
    int hankel [10][10];
    float hilbert [10][10];
    float resultado [10][10];
    int i, j, k;
    float soma_prod;
    // Inicializar as matrizes
    asm_hankel(ordem, hankel);
    asm_hilbert(ordem, hilbert);
    // Multiplicar as matrizes
    for (i = 0; i < ordem; i++) {
        for (j = 0; j < ordem; j++) {
            soma_prod = 0.;
            for (k = 0; k < ordem; k++) {
                soma_prod += hankel[i][k]*hilbert[k][j];
            }
            resultado[i][j] = soma_prod;
        }
    }
    // Mostrar o resultado da multiplicação das duas matrizes
    print(ordem, resultado);
}

Código assembly gerado pelo compilador C

Produzido pela opção -S, que faz o compilador parar após efetuar a etapa de compilação. É gerada uma saída na forma de um arquivo com código assembly para o arquivo de entrada, conforme mostrado abaixo:

	.arch armv6
	.eabi_attribute 28, 1
	.eabi_attribute 20, 1
	.eabi_attribute 21, 1
	.eabi_attribute 23, 3
	.eabi_attribute 24, 1
	.eabi_attribute 25, 1
	.eabi_attribute 26, 2
	.eabi_attribute 30, 6
	.eabi_attribute 34, 1
	.eabi_attribute 18, 4
	.file	"mat_mult_hank_hilb.c"
	.section	.rodata
	.align	2
.LC0:
	.ascii	"%8.4f\000"
	.text
	.align	2
	.global	print
	.syntax unified
	.arm
	.fpu vfp
	.type	print, %function
print:
	@ args = 0, pretend = 0, frame = 24
	@ frame_needed = 1, uses_anonymous_args = 0
	push	{r4, fp, lr}
	add	fp, sp, #8
	sub	sp, sp, #28
	str	r0, [fp, #-32]
	str	r1, [fp, #-36]
	ldr	r4, [fp, #-32]
	sub	r1, r4, #1
	str	r1, [fp, #-24]
	mov	r1, r4
	mov	r0, r1
	mov	r1, #0
	lsl	r3, r1, #5
	orr	r3, r3, r0, lsr #27
	lsl	r2, r0, #5
	mov	r3, #0
	str	r3, [fp, #-16]
	b	.L2
.L5:
	mov	r3, #0
	str	r3, [fp, #-20]
	b	.L3
.L4:
	mov	r2, r4
	ldr	r3, [fp, #-16]
	mul	r3, r3, r2
	lsl	r3, r3, #2
	ldr	r2, [fp, #-36]
	add	r2, r2, r3
	ldr	r3, [fp, #-20]
	lsl	r3, r3, #2
	add	r3, r2, r3
	vldr.32	s15, [r3]
	vcvt.f64.f32	d7, s15
	vmov	r2, r3, d7
	ldr	r0, .L7
	bl	printf
	ldr	r3, [fp, #-20]
	add	r3, r3, #1
	str	r3, [fp, #-20]
.L3:
	ldr	r2, [fp, #-20]
	ldr	r3, [fp, #-32]
	cmp	r2, r3
	blt	.L4
	mov	r0, #10
	bl	putchar
	ldr	r3, [fp, #-16]
	add	r3, r3, #1
	str	r3, [fp, #-16]
.L2:
	ldr	r2, [fp, #-16]
	ldr	r3, [fp, #-32]
	cmp	r2, r3
	blt	.L5
	nop
	sub	sp, fp, #8
	@ sp needed
	pop	{r4, fp, pc}
.L8:
	.align	2
.L7:
	.word	.LC0
	.size	print, .-print
	.align	2
	.global	main
	.syntax unified
	.arm
	.fpu vfp
	.type	main, %function
main:
	@ args = 0, pretend = 0, frame = 1224
	@ frame_needed = 1, uses_anonymous_args = 0
	push	{fp, lr}
	add	fp, sp, #4
	sub	sp, sp, #1216
	sub	sp, sp, #8
	mov	r3, #10
	str	r3, [fp, #-24]
	sub	r3, fp, #424
	mov	r1, r3
	ldr	r0, [fp, #-24]
	bl	asm_hankel
	sub	r3, fp, #824
	mov	r1, r3
	ldr	r0, [fp, #-24]
	bl	asm_hilbert
	mov	r3, #0
	str	r3, [fp, #-8]
	b	.L10
.L15:
	mov	r3, #0
	str	r3, [fp, #-12]
	b	.L11
.L14:
	mov	r3, #0
	str	r3, [fp, #-20]	@ float
	mov	r3, #0
	str	r3, [fp, #-16]
	b	.L12
.L13:
	ldr	r2, [fp, #-8]
	mov	r3, r2
	lsl	r3, r3, #2
	add	r3, r3, r2
	lsl	r3, r3, #1
	ldr	r2, [fp, #-16]
	add	r3, r3, r2
	lsl	r3, r3, #2
	sub	r2, fp, #4
	add	r3, r2, r3
	ldr	r3, [r3, #-420]
	vmov	s15, r3	@ int
	vcvt.f32.s32	s14, s15
	ldr	r2, [fp, #-16]
	mov	r3, r2
	lsl	r3, r3, #2
	add	r3, r3, r2
	lsl	r3, r3, #1
	ldr	r2, [fp, #-12]
	add	r3, r3, r2
	lsl	r3, r3, #2
	sub	r2, fp, #4
	add	r3, r2, r3
	sub	r3, r3, #820
	vldr.32	s15, [r3]
	vmul.f32	s15, s14, s15
	vldr.32	s14, [fp, #-20]
	vadd.f32	s15, s14, s15
	vstr.32	s15, [fp, #-20]
	ldr	r3, [fp, #-16]
	add	r3, r3, #1
	str	r3, [fp, #-16]
.L12:
	ldr	r2, [fp, #-16]
	ldr	r3, [fp, #-24]
	cmp	r2, r3
	blt	.L13
	sub	r3, fp, #4
	sub	r2, r3, #1216
	sub	r2, r2, #4
	ldr	r1, [fp, #-8]
	mov	r3, r1
	lsl	r3, r3, #2
	add	r3, r3, r1
	lsl	r3, r3, #1
	ldr	r1, [fp, #-12]
	add	r3, r3, r1
	lsl	r3, r3, #2
	add	r3, r2, r3
	ldr	r2, [fp, #-20]	@ float
	str	r2, [r3]	@ float
	ldr	r3, [fp, #-12]
	add	r3, r3, #1
	str	r3, [fp, #-12]
.L11:
	ldr	r2, [fp, #-12]
	ldr	r3, [fp, #-24]
	cmp	r2, r3
	blt	.L14
	ldr	r3, [fp, #-8]
	add	r3, r3, #1
	str	r3, [fp, #-8]
.L10:
	ldr	r2, [fp, #-8]
	ldr	r3, [fp, #-24]
	cmp	r2, r3
	blt	.L15
	sub	r3, fp, #1216
	sub	r3, r3, #4
	sub	r3, r3, #4
	mov	r1, r3
	ldr	r0, [fp, #-24]
	bl	print
	nop
	sub	sp, fp, #4
	@ sp needed
	pop	{fp, pc}
	.size	main, .-main
	.ident	"GCC: (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516"
	.section	.note.GNU-stack,"",%progbits

Makefile:

mat_mult_hank_hilb: mat_mult_hank_hilb.c asm_hankel.s asm_hilbert.s
	gcc -o mat_mult_hank_hilb mat_mult_hank_hilb.c asm_hankel.s asm_hilbert.s
asm: mat_mult_hank_hilb.c	# -S = compilar apenas gerando código assembly
	gcc -S -o mat_mult_hank_hilb.s mat_mult_hank_hilb.c
clean:
	rm mat_mult_hank_hilb mat_mult_hank_hilb.s

Construção e execução:

pi@raspberrypi:~/raspbered/assembly/mat_mult_hank_hilb $ make clean
rm mat_mult_hank_hilb mat_mult_hank_hilb.s

pi@raspberrypi:~/raspbered/assembly/mat_mult_hank_hilb $ make asm
gcc -S -o mat_mult_hank_hilb.s mat_mult_hank_hilb.c

pi@raspberrypi:~/raspbered/assembly/mat_mult_hank_hilb $ make
gcc -o mat_mult_hank_hilb mat_mult_hank_hilb.c asm_hankel.s asm_hilbert.s

pi@raspberrypi:~/raspbered/assembly/mat_mult_hank_hilb $ ./mat_mult_hank_hilb 
 10.0000  7.9801  6.7936  5.9596  5.3271  4.8255  4.4156  4.0731  3.7820  3.5311
 12.9290 10.0000  8.3968  7.3064  6.4953  5.8604  5.3464  4.9198  4.5592  4.2498
 15.8579 12.0199 10.0000  8.6532  7.6635  6.8953  6.2771  5.7665  5.3365  4.9686
 18.7869 14.0398 11.6032 10.0000  8.8318  7.9302  7.2078  6.6132  6.1137  5.6874
 21.7159 16.0596 13.2064 11.3468 10.0000  8.9651  8.1385  7.4599  6.8910  6.4061
 24.6448 18.0795 14.8096 12.6936 11.1682 10.0000  9.0693  8.3066  7.6682  7.1249
 27.5738 20.0994 16.4128 14.0404 12.3365 11.0349 10.0000  9.1533  8.4455  7.8437
 30.5028 22.1193 18.0161 15.3872 13.5047 12.0698 10.9307 10.0000  9.2227  8.5625
 33.4317 24.1391 19.6193 16.7340 14.6729 13.1047 11.8615 10.8467 10.0000  9.2812
 36.3607 26.1590 21.2225 18.0808 15.8411 14.1396 12.7922 11.6934 10.7773 10.0000