etc:common_activities:gcc_vectorization:autovect_ppc
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
etc:common_activities:gcc_vectorization:autovect_ppc [2008/02/03 00:04] – zps | etc:common_activities:gcc_vectorization:autovect_ppc [2008/02/04 04:31] (current) – jcmvbkbc | ||
---|---|---|---|
Line 48: | Line 48: | ||
.type foo, @function | .type foo, @function | ||
foo: | foo: | ||
- | # Переместить значение из Link Register(похоже что это | + | # Переместить значение из Link Register (адрес |
mflr 0 | mflr 0 | ||
Line 55: | Line 55: | ||
# MEM(EA, 4) <- (1)32:63 | # MEM(EA, 4) <- (1)32:63 | ||
# (1) <- EA | # (1) <- EA | ||
+ | # это -- организация кадра стека и помещение текущего указателя стека (r1) на дно кадра | ||
stwu 1,-224(1) | stwu 1,-224(1) | ||
Line 71: | Line 72: | ||
# The sum (RA|0) + SI is placed into register RT. | # The sum (RA|0) + SI is placed into register RT. | ||
# Поместить в 11 регистр сумму 11 регистра и битов 0:15 LC1 | # Поместить в 11 регистр сумму 11 регистра и битов 0:15 LC1 | ||
- | # Хы: в 11 регистре окажутся | + | # в 11 регистре окажется полный |
la 11, | la 11, | ||
# в 10 регистре сумма значение 1 регистра + 16 (число) | # в 10 регистре сумма значение 1 регистра + 16 (число) | ||
+ | # r10 = адрес b[0] | ||
addi 10,1,16 | addi 10,1,16 | ||
Line 86: | Line 88: | ||
# биты 32:63 регистра 0 будут помещены по адресу значение регистра 1 + 228 (в биты 0-31?) | # биты 32:63 регистра 0 будут помещены по адресу значение регистра 1 + 228 (в биты 0-31?) | ||
# сначала мы отняли 224 потом прибавили 228, в итоге в регичтре 0 лежит начальное для функции значение регситра 1 + 4 | # сначала мы отняли 224 потом прибавили 228, в итоге в регичтре 0 лежит начальное для функции значение регситра 1 + 4 | ||
+ | # это -- помещение адреса возврата (взятого из LR) на вершину текущего кадра стека. | ||
stw 0,228(1) | stw 0,228(1) | ||
| | ||
# прибавить к значению регистра 10 число 16 и положить результат в 8 | # прибавить к значению регистра 10 число 16 и положить результат в 8 | ||
# до этого в регистре 10 был регистр 1 увеличенный на 16 | # до этого в регистре 10 был регистр 1 увеличенный на 16 | ||
+ | # r8 = адрес b[4] | ||
addi 8,10,16 | addi 8,10,16 | ||
Line 96: | Line 100: | ||
# Let the effective address EA be the sum of the contents of register rA, or the value ' | # Let the effective address EA be the sum of the contents of register rA, or the value ' | ||
# Load the quadword in memory addressed by the EA into vD | # Load the quadword in memory addressed by the EA into vD | ||
- | # помещает в 11 регистр данные | + | # помещает в регистр |
+ | # это -- загрузка таблицы .LC1 в v11. .LC1 -- таблица переноса четных float | ||
lvx 11,0,11 | lvx 11,0,11 | ||
- | # в 11 регистр помещается сумма значения 1 регистра и 16 | + | # в 11 регистр помещается сумма значения 1 регистра и 16 |
+ | # r11 = адрес b[0] | ||
addi 11,1,16 | addi 11,1,16 | ||
| | ||
- | # полностью копирует 11 регистр | + | # это -- загрузка b[0: |
lvx 13,0,11 | lvx 13,0,11 | ||
- | | + | |
- | # в 11 регистр сумму значения 1 регистра и 80 | + | # в 11 регистр сумму значения 1 регистра и 80 -- адрес переменной с |
addi 11,1,80 | addi 11,1,80 | ||
- | # скопировали | + | # это -- загрузка с[0: |
lvx 10,0,11 | lvx 10,0,11 | ||
addi 11,1,96 | addi 11,1,96 | ||
+ | # c[4:7] в v1 | ||
lvx 1,0,11 | lvx 1,0,11 | ||
addi 11,1,112 | addi 11,1,112 | ||
+ | # c[8:11] в v8 | ||
lvx 8,0,11 | lvx 8,0,11 | ||
# Поместить в 9 регистр сумму 9 регистра и битов 0:15 LC0 | # Поместить в 9 регистр сумму 9 регистра и битов 0:15 LC0 | ||
- | # Хы: в 9 регистре окажутся | + | # в 9 регистре окажется полный |
la 9,.LC0@l(9) | la 9,.LC0@l(9) | ||
| | ||
addi 11,1,128 | addi 11,1,128 | ||
+ | # это -- загрузка таблицы .LC0 в v7 | ||
lvx 7,0,9 | lvx 7,0,9 | ||
+ | # b[4:7] в v6 | ||
lvx 6,0,8 | lvx 6,0,8 | ||
| | ||
+ | # r9 = адрес b[12] | ||
addi 9,8,32 | addi 9,8,32 | ||
| | ||
+ | # c[12:15] в v0 | ||
lvx 0,0,11 | lvx 0,0,11 | ||
+ | # r8 = адрес b[8] | ||
addi 8,8,16 | addi 8,8,16 | ||
+ | # b[12:5] в v4 | ||
lvx 4,0,9 | lvx 4,0,9 | ||
+ | # r9 = адрес a | ||
addi 9,1,144 | addi 9,1,144 | ||
+ | # b[8:11] в v12 | ||
lvx 12,0,8 | lvx 12,0,8 | ||
Line 159: | Line 173: | ||
# vA и vB -- исходные вектора по 16 8-битных элементов. после их конкатенции все элементы пронумерованы от 0x00 до 0x1F | # vA и vB -- исходные вектора по 16 8-битных элементов. после их конкатенции все элементы пронумерованы от 0x00 до 0x1F | ||
# в vC[i] написано число от 0x00 до 0x1F и означает какой из 32 элементов vA||vB положить в vD[i] | # в vC[i] написано число от 0x00 до 0x1F и означает какой из 32 элементов vA||vB положить в vD[i] | ||
- | vperm 3,8,0,11 | ||
+ | # это -- помещение c[8, | ||
+ | vperm 3,8,0,11 | ||
+ | # это -- помещение c[0,2,4,6] в v5 | ||
vperm 5,10,1,11 | vperm 5,10,1,11 | ||
+ | # это -- помещение b[0,2,4,6] в v9 | ||
vperm 9,13,6,11 | vperm 9,13,6,11 | ||
+ | |||
+ | # это -- помещение c[9, | ||
vperm 8,8,0,7 | vperm 8,8,0,7 | ||
+ | # это -- помещение c[1,3,5,7] в v10 | ||
vperm 10,10,1,7 | vperm 10,10,1,7 | ||
+ | # это -- помещение b[1,3,5,7] в v13 | ||
vperm 13,13,6,7 | vperm 13,13,6,7 | ||
Line 185: | Line 206: | ||
# low-order 5 bits of the corresponding word element in register vB. Bits shifted out to bit [0] of the word | # low-order 5 bits of the corresponding word element in register vB. Bits shifted out to bit [0] of the word | ||
# element are lost. Zeros are supplied to the vacated bits on the roght. The result is placed into the corresponding word element of register vD | # element are lost. Zeros are supplied to the vacated bits on the roght. The result is placed into the corresponding word element of register vD | ||
- | # Каждое слово в регистре сдвигается влево на какое-то число бит. | + | # Каждое слово в регистре сдвигается влево на 31 бит, получается 0x80000000 |
vslw 0,0,0 | vslw 0,0,0 | ||
Line 192: | Line 213: | ||
# vmaddfp | # vmaddfp | ||
# vD[i] = vA[i]*vC[i]+vB[i] | # vD[i] = vA[i]*vC[i]+vB[i] | ||
+ | |||
+ | # v13 = b[1, | ||
| | ||
+ | # v9 = b[0, | ||
| | ||
Line 199: | Line 223: | ||
# vsubfp | # vsubfp | ||
# vD[i] = vA[i]-vB[i] | # vD[i] = vA[i]-vB[i] | ||
+ | |||
+ | # v13 = b[1, | ||
| | ||
+ | |||
+ | # Store Vector Indexed | ||
+ | # stvx vS,rA,rB | ||
+ | # if rA=0 then b ← 0 | ||
+ | # else b ← (rA) | ||
+ | # EA ← (b + (rB)) & 0xFFFF_FFFF_FFFF_FFF0 | ||
+ | # MEM(EA,16) ← (vS) | ||
+ | # Let the effective address EA be the result of ANDing the sum of the contents of register rA, or the value ‘0’ if | ||
+ | # rA is equal to ‘0’, and the contents of register rB with 0xFFFF_FFFF_FFFF_FFF0. | ||
+ | # The contents of register vS are stored into the quadword addressed by EA. Figure 6-5 shows how a store | ||
+ | # instruction is performed for a vector register. | ||
+ | |||
+ | # a[0]=b[1]*c[1]-b[0]*c[0] | ||
+ | # a[1]=b[3]*c[3]-b[2]*c[2] | ||
+ | # a[2]=b[5]*c[5]-b[4]*c[4] | ||
+ | # a[3]=b[7]*c[7]-b[6]*c[6] | ||
+ | stvx 13,0,9 | ||
+ | |||
+ | # r9 -- адрес a[4] | ||
+ | addi 9,9,16 | ||
+ | |||
+ | |||
+ | # это -- помещение b[8, | ||
+ | vperm 11,12,4,11 | ||
+ | # это -- помещение b[9, | ||
+ | vperm 12,12,4,7 | ||
+ | |||
+ | # v11 = b[8, | ||
+ | | ||
+ | # v12 = b[9, | ||
+ | | ||
+ | # v12 = b[9, | ||
+ | | ||
+ | |||
+ | # a[4]=b[9]*c[9]-b[8]*c[8] | ||
+ | # a[5]=b[11]*c[11]-b[10]*c[10] | ||
+ | # a[6]=b[13]*c[13]-b[12]*c[12] | ||
+ | # a[7]=b[15]*c[15]-b[14]*c[14] | ||
+ | stvx 12,0,9 | ||
- | stvx 13,0,9 | + | # Vector Logical OR (0x1000 0484) |
- | addi 9,9,16 | + | # vor vD,vA,vB |
- | vperm 11,12,4,11 | + | vor 1,0,0 |
- | vperm 12,12,4,7 | + | |
- | vmaddfp 11,11,3,0 | + | # Вызов функции fbar |
- | vmaddfp 12,12,8,0 | + | |
- | | + | # загрузка адреса возврата с вершины кадра стека в r0 |
- | stvx 12,0,9 | + | lwz 0,228(1) |
- | vor 1,0,0 | + | # восстановление предыдущего кадра стека |
- | | + | addi 1,1,224 |
- | lwz 0,228(1) | + | # Move To Link Register |
- | addi 1,1,224 | + | mtlr 0 |
- | mtlr 0 | + | # возврат из функции |
- | blr | + | blr |
.size foo, .-foo | .size foo, .-foo | ||
.section | .section |
etc/common_activities/gcc_vectorization/autovect_ppc.1201986268.txt.gz · Last modified: 2008/02/03 00:04 by zps