etc:common_activities:gcc_vectorization:autovect_ppc
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
etc:common_activities:gcc_vectorization:autovect_ppc [2008/02/02 20:59] – создано 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 | + | |
# Store Word with Update (сохранить значение регистра 1(биты 32...63), в адрес памяти(EA) = < | # Store Word with Update (сохранить значение регистра 1(биты 32...63), в адрес памяти(EA) = < | ||
# EA <- (1) - 224 | # EA <- (1) - 224 | ||
# MEM(EA, 4) <- (1)32:63 | # MEM(EA, 4) <- (1)32:63 | ||
# (1) <- EA | # (1) <- EA | ||
- | stwu 1,-224(1) | + | |
+ | stwu 1,-224(1) | ||
# Load Immediate Shifted(непосредственная загрузка) | # Load Immediate Shifted(непосредственная загрузка) | ||
# Она загружает величину (биты 16-31 адреса LC1) | # Она загружает величину (биты 16-31 адреса LC1) | ||
# сдвигает число на 16 бит налево и затем сохраняет результат в регистре 11 | # сдвигает число на 16 бит налево и затем сохраняет результат в регистре 11 | ||
# Биты 16-31 регистра 11 содержат биты 16-31 адреса. | # Биты 16-31 регистра 11 содержат биты 16-31 адреса. | ||
- | | + | lis 11, |
- | lis 9,.LC0@ha | + | |
+ | lis 9,.LC0@ha | ||
# Load Address | # Load Address | ||
# la RT,SI(RS) (equivalent to: addi RT,RA,SI) | # la RT,SI(RS) (equivalent to: addi RT,RA,SI) | ||
Line 67: | 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, | + | |
- | # в 10 регистре сумма 1 и 16 | + | |
- | addi 10,1,16 | + | # в 10 регистре сумма |
+ | | ||
+ | addi 10,1,16 | ||
# Store Word | # Store Word | ||
# stw RS,D(RA) | # stw RS,D(RA) | ||
Line 79: | Line 87: | ||
# Let the effective address (EA) be the sum (RA|0)+ D. (RS)32:63 are stored into the word in storage addressed by EA. | # Let the effective address (EA) be the sum (RA|0)+ D. (RS)32:63 are stored into the word in storage addressed by EA. | ||
# биты 32:63 регистра 0 будут помещены по адресу значение регистра 1 + 228 (в биты 0-31?) | # биты 32:63 регистра 0 будут помещены по адресу значение регистра 1 + 228 (в биты 0-31?) | ||
- | stw 0,228(1) | + | |
- | addi 8,10,16 | + | # это -- помещение адреса возврата (взятого из LR) на вершину текущего кадра стека. |
- | lvx 11,0,11 | + | stw 0,228(1) |
- | addi 11,1,16 | + | |
- | lvx 13,0,11 | + | # прибавить к значению регистра 10 число 16 и положить результат в 8 |
- | addi 11,1,80 | + | # до этого в регистре 10 был регистр 1 увеличенный на 16 |
- | lvx 10,0,11 | + | # r8 = адрес b[4] |
- | addi 11,1,96 | + | addi 8,10,16 |
- | lvx 1,0,11 | + | |
- | addi 11,1,112 | + | # Load Vector Indexed |
- | lvx 8,0,11 | + | |
- | la 9, | + | # Let the effective address EA be the sum of the contents of register rA, or the value ' |
- | addi 11,1,128 | + | # Load the quadword in memory addressed by the EA into vD |
- | lvx 7,0,9 | + | # помещает в регистр v11 данные по адресу в r11 |
- | lvx 6,0,8 | + | # это -- загрузка таблицы .LC1 в v11. .LC1 -- таблица переноса четных float |
- | addi 9,8,32 | + | lvx 11,0,11 |
- | lvx 0,0,11 | + | |
- | addi 8,8,16 | + | |
- | lvx 4,0,9 | + | # r11 = адрес b[0] |
- | addi 9,1,144 | + | addi 11,1,16 |
- | lvx 12,0,8 | + | |
- | mr 3,9 | + | # это -- загрузка b[0:3] в v13 |
- | vperm 3,8,0,11 | + | lvx 13,0,11 |
- | vperm 5,10,1,11 | + | |
- | vperm 9,13,6,11 | + | |
- | vperm 8,8,0,7 | + | addi 11,1,80 |
- | vperm 10,10,1,7 | + | |
- | vperm 13,13,6,7 | + | |
- | vspltisw 0,-1 | + | lvx 10,0,11 |
- | vslw 0,0,0 | + | |
- | vmaddfp 13, | + | addi 11,1,96 |
- | vmaddfp 9,9,5,0 | + | |
- | vsubfp 13,13,9 | + | lvx 1,0,11 |
- | stvx 13,0,9 | + | |
- | addi 9,9,16 | + | addi 11,1,112 |
- | vperm 11, | + | |
- | vperm 12,12,4,7 | + | lvx 8,0,11 |
- | vmaddfp 11,11,3,0 | + | |
- | vmaddfp 12,12,8,0 | + | |
- | vsubfp 12,12,11 | + | # в 9 регистре окажется полный адрес переменной .LC0 |
- | stvx 12,0,9 | + | la 9, |
- | vor 1,0,0 | + | |
- | bl fbar | + | addi 11,1,128 |
- | lwz 0,228(1) | + | |
- | addi 1,1,224 | + | |
- | mtlr 0 | + | lvx 7,0,9 |
- | blr | + | |
+ | | ||
+ | lvx 6,0,8 | ||
+ | | ||
+ | | ||
+ | addi 9,8,32 | ||
+ | | ||
+ | | ||
+ | lvx 0,0,11 | ||
+ | |||
+ | | ||
+ | addi 8,8,16 | ||
+ | |||
+ | | ||
+ | lvx 4,0,9 | ||
+ | |||
+ | | ||
+ | addi 9,1,144 | ||
+ | |||
+ | | ||
+ | lvx 12,0,8 | ||
+ | |||
+ | | ||
+ | # or RA, RS, RB | ||
+ | # RA <- (RS) | (RB) | ||
+ | mr 3,9 | ||
+ | |||
+ | | ||
+ | # vperm vD, vA, vB, vC | ||
+ | # temp[0:255] <- (vA) || (vB) // || --- конкатенация | ||
+ | # do i=0 to 127 by 8 | ||
+ | # b <- (vC)[i+3: | ||
+ | # | ||
+ | # end | ||
+ | # Let the source vector be the concatenation of the contents of register vA followed by the contents of register vB. | ||
+ | # For each integer i in the range 0-15, the contents of the byte element in the source vector specisied in bits [3-7] | ||
+ | # of byte element i in vC are placed into byte element i of register vD. | ||
+ | # судя из картинки в документации работает так: | ||
+ | # vA и vB -- исходные вектора по 16 8-битных элементов. после их конкатенции все элементы пронумерованы от 0x00 до 0x1F | ||
+ | # в vC[i] написано число от 0x00 до 0x1F и означает какой из 32 элементов vA||vB положить в vD[i] | ||
+ | |||
+ | # это -- помещение c[8, | ||
+ | vperm 3,8,0,11 | ||
+ | | ||
+ | vperm 5,10,1,11 | ||
+ | | ||
+ | vperm 9,13,6,11 | ||
+ | |||
+ | | ||
+ | vperm 8,8,0,7 | ||
+ | | ||
+ | vperm 10,10,1,7 | ||
+ | | ||
+ | vperm 13,13,6,7 | ||
+ | |||
+ | | ||
+ | # vspltisw | ||
+ | # do i=0 to 127 by 32 | ||
+ | # (vD)[i: | ||
+ | # end | ||
+ | # Each element of wspltisq is a word. The value of the SIMM field, sign-extended to 32 bits, is replicated into each element of register vD | ||
+ | # регистр ноль будет забит числами -1 | ||
+ | vspltisw 0,-1 | ||
+ | | ||
+ | # Vector Shift Left Integer Word | ||
+ | # wslw vD, vA, vB | ||
+ | # do i=0 to 127 by 32 | ||
+ | # sh <- (vB)[i+27: | ||
+ | # | ||
+ | # end | ||
+ | # Each element a word. Each word element in register vA is shifted left by the number of bits specifed in the | ||
+ | # 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 | ||
+ | # Каждое слово в регистре сдвигается влево на 31 бит, получается 0x80000000 | ||
+ | |||
+ | vslw 0,0,0 | ||
+ | |||
+ | | ||
+ | # vmaddfp | ||
+ | # vD[i] = vA[i]*vC[i]+vB[i] | ||
+ | |||
+ | # v13 = b[1, | ||
+ | vmaddfp 13, | ||
+ | | ||
+ | vmaddfp 9,9,5,0 | ||
+ | |||
+ | |||
+ | | ||
+ | # vsubfp | ||
+ | # vD[i] = vA[i]-vB[i] | ||
+ | |||
+ | # v13 = b[1, | ||
+ | vsubfp 13,13,9 | ||
+ | |||
+ | | ||
+ | # 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 | ||
+ | |||
+ | | ||
+ | addi 9,9,16 | ||
+ | |||
+ | |||
+ | | ||
+ | vperm 11, | ||
+ | | ||
+ | vperm 12,12,4,7 | ||
+ | |||
+ | | ||
+ | vmaddfp 11,11,3,0 | ||
+ | | ||
+ | vmaddfp 12,12,8,0 | ||
+ | | ||
+ | vsubfp 12,12,11 | ||
+ | |||
+ | | ||
+ | # 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 | ||
+ | |||
+ | # Vector Logical OR (0x1000 0484) | ||
+ | # vor vD,vA,vB | ||
+ | vor 1,0,0 | ||
+ | |||
+ | # Вызов функции fbar | ||
+ | bl fbar | ||
+ | # загрузка адреса возврата с вершины кадра стека в r0 | ||
+ | lwz 0,228(1) | ||
+ | # восстановление предыдущего кадра стека | ||
+ | addi 1,1,224 | ||
+ | # Move To Link Register | ||
+ | mtlr 0 | ||
+ | # возврат из функции | ||
+ | blr | ||
.size foo, .-foo | .size foo, .-foo | ||
.section | .section |
etc/common_activities/gcc_vectorization/autovect_ppc.1201975184.txt.gz · Last modified: 2008/02/02 20:59 by zps