Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


etc:common_activities:gcc_vectorization:autovect_ppc

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
etc:common_activities:gcc_vectorization:autovect_ppc [2008/02/02 22:02] zpsetc: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(похоже что это адрес текущей инструкции в регистр 0+        # Переместить значение из Link Register (адрес возврата) в регистр 0
      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 регистре окажутся 0:31 биты из ячейки по адресу LC1+        # в 11 регистре окажется полный адрес переменной .LC1
      la 11,.LC1@l(11)      la 11,.LC1@l(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 '0' if rA is equal '0', and the contents of register rB         # Let the effective address EA be the sum of the contents of register rA, or the value '0' if rA is equal '0', and the contents of register rB
         # Load the quadword in memory addressed by the EA into vD         # Load the quadword in memory addressed by the EA into vD
-        # помещает в 11 регистр данные из 11 регистра (:+        # помещает в регистр v11 данные по адресу в r11 
 +        # это -- загрузка таблицы .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 регистр в 13+        # это -- загрузка b[0:3] в v13
      lvx 13,0,11      lvx 13,0,11
-         +        
-        # в 11 регистр сумму значения 1 регистра и 80+        # в 11 регистр сумму значения 1 регистра и 80 -- адрес переменной с
      addi 11,1,80      addi 11,1,80
            
-        # скопировали значение 11 регистра в 10 регистр +        # это -- загрузка с[0:3] в v10
      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 регистре окажутся 0:31 биты из ячейки по адресу LC0+        # в 9 регистре окажется полный адрес переменной .LC0
      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,10,12,14] в v3
 +     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,11,13,15] в v8
      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
  
 +        # Vector Splat Immediate Signed Word
 +        # vspltisw  vD, SIMM // SIMM ( 11-15) this Immediate field is used to specify a (5 bit) signed integer
 +        # do i=0 to 127 by 32
 +        #    (vD)[i:i+31] <- SignExtend(SIMM,32)
 +        # 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      vspltisw 0,-1
-        vslw 0,0,0 +         
-        vmaddfp 13,13,10,+        # Vector Shift Left Integer Word 
-        vmaddfp 9,9,5,0 +        # wslw vD, vA, vB 
-        vsubfp 13,13,9 +        # do i=0 to 127 by 32 
-        stvx 13,0,9 +        #   sh <- (vB)[i+27:i+31} 
-        addi 9,9,16 +        #   (vd)[i:i+1] <- (vA)[i:i+31] <<ui sh 
-        vperm 11,12,4,11 +        # end 
-        vperm 12,12,4,7 +        # Each element a word. Each word element in register vA is shifted left by the number of bits specifed in the 
-        vmaddfp 11,11,3,0 +        # low-order 5 bits of the corresponding word element in register vB. Bits shifted out to bit [0] of the word  
-        vmaddfp 12,12,8,0 +        # 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 
-        vsubfp 12,12,11 +        # Каждое слово в регистре сдвигается влево на 31 бит, получается 0x80000000 
-        stvx 12,0,9 +  
-        vor 1,0,0 +     vslw 0,0,0 
-        bl fbar + 
-        lwz 0,228(1) +        # Vector Multiply Add Floating Point 
-        addi 1,1,224 +        # vmaddfp   vD, vA, vC, vB 
-        mtlr 0 +        # vD[i] = vA[i]*vC[i]+vB[i]  
-        blr+ 
 +        # v13 = b[1,3,5,7]*c[1,3,5,7]+0x8000000 
 +     vmaddfp 13,13,10,
 +        # v9 = b[0,2,4,6]*c[0,2,4,5]+0x8000000 
 +     vmaddfp 9,9,5,0 
 + 
 + 
 +        # Vector Substract Floating Point 
 +        # vsubfp   vD, vA, vB 
 +        # vD[i] = vA[i]-vB[i]  
 + 
 +        # v13 = b[1,3,5,7]*c[1,3,5,7]-b[0,2,4,6]*c[0,2,4,5] 
 +     vsubfp 13,13,9 
 +      
 +        # 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,10,12,14] в v11 
 +     vperm 11,12,4,11 
 +        # это -- помещение b[9,11,13,15] в v12 
 +     vperm 12,12,4,7 
 + 
 +        # v11 = b[8,10,12,14]*c[8,10,12,14]+0x8000000 
 +     vmaddfp 11,11,3,0 
 +        # v12 = b[9,11,13,15]*c[9,11,13,15]+0x8000000 
 +     vmaddfp 12,12,8,0 
 +        # v12 = b[9,11,13,15]*c[9,11,13,15]-b[8,10,12,14]*c[8,10,12,14] 
 +     vsubfp 12,12,11 
 + 
 +        # 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 
 + 
 +       # 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        .rodata.cst16,"aM",@progbits,16         .section        .rodata.cst16,"aM",@progbits,16
etc/common_activities/gcc_vectorization/autovect_ppc.1201978956.txt.gz · Last modified: 2008/02/02 22:02 by zps