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