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/03 00:04] 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
  
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   vD, vA, vC, vB         # vmaddfp   vD, vA, vC, vB
         # vD[i] = vA[i]*vC[i]+vB[i]          # vD[i] = vA[i]*vC[i]+vB[i] 
 +
 +        # v13 = b[1,3,5,7]*c[1,3,5,7]+0x8000000
      vmaddfp 13,13,10,0      vmaddfp 13,13,10,0
 +        # v9 = b[0,2,4,6]*c[0,2,4,5]+0x8000000
      vmaddfp 9,9,5,0      vmaddfp 9,9,5,0
  
Line 199: Line 223:
         # vsubfp   vD, vA, vB         # vsubfp   vD, vA, vB
         # vD[i] = vA[i]-vB[i]          # 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      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
  
-        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 +     bl fbar 
-        vsubfp 12,12,11 +       # загрузка адреса возврата с вершины кадра стека в r0 
-        stvx 12,0,9 +     lwz 0,228(1) 
-        vor 1,0,0 +       # восстановление предыдущего кадра стека 
-        bl fbar +     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        .rodata.cst16,"aM",@progbits,16         .section        .rodata.cst16,"aM",@progbits,16
etc/common_activities/gcc_vectorization/autovect_ppc.1201986268.txt.gz · Last modified: 2008/02/03 00:04 by zps