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
Last revisionBoth sides next revision
etc:common_activities:gcc_vectorization:autovect_ppc [2008/02/03 00:15] zpsetc:common_activities:gcc_vectorization:autovect_ppc [2008/02/04 04:31] 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
            
Line 211: Line 237:
         # The contents of register vS are stored into the quadword addressed by EA. Figure 6-5 shows how a store         # 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.         # 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      stvx 13,0,9
  
 +        # r9 -- адрес a[4]
      addi 9,9,16      addi 9,9,16
 +
 +
 +        # это -- помещение b[8,10,12,14] в v11
      vperm 11,12,4,11      vperm 11,12,4,11
 +        # это -- помещение b[9,11,13,15] в v12
      vperm 12,12,4,7      vperm 12,12,4,7
 +
 +        # v11 = b[8,10,12,14]*c[8,10,12,14]+0x8000000
      vmaddfp 11,11,3,0      vmaddfp 11,11,3,0
 +        # v12 = b[9,11,13,15]*c[9,11,13,15]+0x8000000
      vmaddfp 12,12,8,0      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      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 12,0,9
  
Line 227: Line 272:
        # Вызов функции fbar        # Вызов функции fbar
      bl fbar      bl fbar
 +       # загрузка адреса возврата с вершины кадра стека
      lwz 0,228(1)      lwz 0,228(1)
 +       # восстановление предыдущего кадра стека
      addi 1,1,224      addi 1,1,224
        # Move To Link Register        # Move To Link Register
      mtlr 0      mtlr 0
-       # В документации не нашел, но думается что это типа return (: тем более что мы только что записали адрес следующей команды+       # возврат из функции
      blr      blr
         .size   foo, .-foo         .size   foo, .-foo
etc/common_activities/gcc_vectorization/autovect_ppc.txt · Last modified: 2008/02/04 04:31 by jcmvbkbc