]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000: Make all multiply instructions one type
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 23 May 2014 16:36:14 +0000 (18:36 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 23 May 2014 16:36:14 +0000 (18:36 +0200)
This uses the attributes "size" and "dot" to specify the differences:

imul3 -> mul size=8
imul2 -> mul size=16
imul -> mul size=32
lmul -> mul size=64
imul_compare -> mul size=32 dot=yes
lmul_compare -> mul size=64 dot=yes

From-SVN: r210867

27 files changed:
gcc/ChangeLog
gcc/config/rs6000/40x.md
gcc/config/rs6000/440.md
gcc/config/rs6000/476.md
gcc/config/rs6000/601.md
gcc/config/rs6000/603.md
gcc/config/rs6000/6xx.md
gcc/config/rs6000/7450.md
gcc/config/rs6000/7xx.md
gcc/config/rs6000/8540.md
gcc/config/rs6000/a2.md
gcc/config/rs6000/cell.md
gcc/config/rs6000/e300c2c3.md
gcc/config/rs6000/e500mc.md
gcc/config/rs6000/e500mc64.md
gcc/config/rs6000/e5500.md
gcc/config/rs6000/e6500.md
gcc/config/rs6000/mpc.md
gcc/config/rs6000/power4.md
gcc/config/rs6000/power5.md
gcc/config/rs6000/power6.md
gcc/config/rs6000/power7.md
gcc/config/rs6000/power8.md
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md
gcc/config/rs6000/rs64.md
gcc/config/rs6000/titan.md

index ab244b00b3a05753a49f268da256d1be3eb82eb0..89c4f21431acbcd55d98895f6eb803ac5ae03e28 100644 (file)
@@ -1,3 +1,52 @@
+2014-05-23  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000.md (type): Add "mul".  Delete "imul",
+       "imul2", "imul3", "lmul", "imul_compare", "lmul_compare".
+       (size): New attribute.
+       (dot): New attribute.
+       (cell_micro): Adjust.
+       (mulsi3, *mulsi3_internal1, *mulsi3_internal2, mulsidi3,
+       umulsidi3, smulsi3_highpart, umulsi3_highpart, muldi3,
+       *muldi3_internal1, *muldi3_internal2, smuldi3_highpart,
+       umuldi3_highpart): Adjust.
+       * config/rs6000/rs6000.c (rs6000_adjust_cost, is_cracked_insn,
+       rs6000_adjust_priority, is_nonpipeline_insn,
+       insn_must_be_first_in_group, insn_must_be_last_in_group): Adjust.
+
+       * config/rs6000/40x.md (ppc403-imul, ppc405-imul, ppc405-imul2,
+       ppc405-imul3): Adjust.
+       * config/rs6000/440.md (ppc440-imul, ppc440-imul2): Adjust.
+       * config/rs6000/476.md (ppc476-imul): Adjust.
+       * config/rs6000/601.md (ppc601-imul): Adjust.
+       * config/rs6000/603.md (ppc603-imul, ppc603-imul2): Adjust.
+       * config/rs6000/6xx.md (ppc604-imul, ppc604e-imul, ppc620-imul,
+       ppc620-imul2, ppc620-imul3, ppc620-lmul): Adjust.
+       * config/rs6000/7450.md (ppc7450-imul, ppc7450-imul2): Adjust.
+       * config/rs6000/7xx.md (ppc750-imul, ppc750-imul2, ppc750-imul3):
+       Adjust.
+       * config/rs6000/8540.md (ppc8540_multiply): Adjust.
+       * config/rs6000/a2.md (ppca2-imul, ppca2-lmul): Adjust.
+       * config/rs6000/cell.md (cell-lmul, cell-lmul-cmp, cell-imul23,
+       cell-imul): Adjust.
+       * config/rs6000/e300c2c3.md (ppce300c3_multiply): Adjust.
+       * config/rs6000/e500mc.md (e500mc_multiply): Adjust.
+       * config/rs6000/e500mc64.md (e500mc64_multiply): Adjust.
+       * config/rs6000/e5500.md (e5500_multiply, e5500_multiply_i): Adjust.
+       * config/rs6000/e6500.md (e6500_multiply, e6500_multiply_i): Adjust.
+       * config/rs6000/mpc.md (mpccore-imul): Adjust.
+       * config/rs6000/power4.md (power4-lmul-cmp, power4-imul-cmp,
+       power4-lmul, power4-imul, power4-imul3): Adjust.
+       * config/rs6000/power5.md (power5-lmul-cmp, power5-imul-cmp,
+       power5-lmul, power5-imul, power5-imul3): Adjust.
+       * config/rs6000/power6.md (power6-lmul-cmp, power6-imul-cmp,
+       power6-lmul, power6-imul, power6-imul3): Adjust.
+       * config/rs6000/power7.md (power7-mul, power7-mul-compare): Adjust.
+       * config/rs6000/power8.md (power8-mul, power8-mul-compare): Adjust.
+
+       * config/rs6000/rs64.md (rs64a-imul, rs64a-imul2, rs64a-imul3,
+       rs64a-lmul): Adjust.
+       * config/rs6000/titan.md (titan_imul): Adjust.
+
 2014-05-23  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.md (type): Add new value "halfmul".
index 5510767ab073f2b2489296842703f3bfd311098e..7ec2801144635fbe25b02ad5e4f4adc404b7ffb1 100644 (file)
   "iu_40x,nothing,bpu_40x")
 
 (define_insn_reservation "ppc403-imul" 4
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppc403"))
   "iu_40x*4")
 
 (define_insn_reservation "ppc405-imul" 5
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc405"))
   "iu_40x*4")
 
 (define_insn_reservation "ppc405-imul2" 3
-  (and (eq_attr "type" "imul2")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "16")
        (eq_attr "cpu" "ppc405"))
   "iu_40x*2")
 
 (define_insn_reservation "ppc405-imul3" 2
-  (and (eq_attr "type" "imul3,halfmul")
+  (and (ior (eq_attr "type" "halfmul")
+           (and (eq_attr "type" "mul")
+                (eq_attr "size" "8")))
        (eq_attr "cpu" "ppc405"))
   "iu_40x")
 
index df3a3b5ecf11efeb9c57b036826a271457582029..55d115580bfc37505c87cbbd4b6f878d4567cc73 100644 (file)
    ppc440_i_pipe|ppc440_j_pipe,ppc440_i_pipe|ppc440_j_pipe")
 
 (define_insn_reservation "ppc440-imul" 3
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc440"))
   "ppc440_issue,ppc440_i_pipe")
 
 (define_insn_reservation "ppc440-imul2" 2
-  (and (eq_attr "type" "imul2,imul3,halfmul")
+  (and (ior (eq_attr "type" "halfmul")
+           (and (eq_attr "type" "mul")
+                (eq_attr "size" "8,16")))
        (eq_attr "cpu" "ppc440"))
   "ppc440_issue,ppc440_i_pipe")
 
index acfe063f1ebe651a47c273355852227e5e793529..7b00632165074cc82be64cc99d97a0ac641ba96b 100644 (file)
@@ -82,7 +82,7 @@
    ppc476_i_pipe")
 
 (define_insn_reservation "ppc476-imul" 4
-  (and (eq_attr "type" "imul,imul_compare,imul2,imul3,halfmul")
+  (and (eq_attr "type" "mul,halfmul")
        (eq_attr "cpu" "ppc476"))
   "ppc476_issue,\
    ppc476_i_pipe")
index 94ba06cebcda0788c84309525f30eb4e49c77562..c1a00438859d61ce18040688b5c5001045331ddb 100644 (file)
@@ -61,7 +61,7 @@
   "iu_ppc601,iu_ppc601,iu_ppc601")
 
 (define_insn_reservation "ppc601-imul" 5
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppc601"))
   "iu_ppc601*5")
 
index 2c778cd2768f94cef34cd63b86e85cdf81aae431..7e411264fd518e7b43e5cdfcbec2ff98af3cfd31 100644 (file)
 
 ; This takes 2 or 3 cycles
 (define_insn_reservation "ppc603-imul" 3
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc603"))
   "iu_603*2")
 
 (define_insn_reservation "ppc603-imul2" 2
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "ppc603"))
   "iu_603*2")
 
index 88895a1cc929a48291f396a659c38ba0b9b7d9f9..429e8628fc6e98f72ca72a13f41c4f13fb6f107b 100644 (file)
   "iu1_6xx|iu2_6xx,iu1_6xx|iu2_6xx,iu1_6xx|iu2_6xx")
 
 (define_insn_reservation "ppc604-imul" 4
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppc604"))
   "mciu_6xx*2")
 
 (define_insn_reservation "ppc604e-imul" 2
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppc604e"))
   "mciu_6xx")
 
 (define_insn_reservation "ppc620-imul" 5
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc620,ppc630"))
   "mciu_6xx*3")
 
 (define_insn_reservation "ppc620-imul2" 4
-  (and (eq_attr "type" "imul2")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "16")
        (eq_attr "cpu" "ppc620,ppc630"))
   "mciu_6xx*3")
 
 (define_insn_reservation "ppc620-imul3" 3
-  (and (eq_attr "type" "imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8")
        (eq_attr "cpu" "ppc620,ppc630"))
   "mciu_6xx*3")
 
 (define_insn_reservation "ppc620-lmul" 7
-  (and (eq_attr "type" "lmul,lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "ppc620,ppc630"))
   "mciu_6xx*5")
 
index cae8c49f8887cc42e3c5e0aeb14888613ebe5548..b7b5efd0898f1190f775e79691d49bd4c0c11d67 100644 (file)
    iu1_7450|iu2_7450|iu3_7450,iu1_7450|iu2_7450|iu3_7450")
 
 (define_insn_reservation "ppc7450-imul" 4
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc7450"))
   "ppc7450_du,mciu_7450*2")
 
 (define_insn_reservation "ppc7450-imul2" 3
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "ppc7450"))
   "ppc7450_du,mciu_7450")
 
index 65934dd8baec3e6d233a99d54518816bf5916533..059d006f2545bf783fff0abd89627056ab8b978f 100644 (file)
   "ppc750_du,iu1_7xx|iu2_7xx,iu1_7xx|iu2_7xx,iu1_7xx|iu2_7xx")
 
 (define_insn_reservation "ppc750-imul" 4
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppc750,ppc7400"))
   "ppc750_du,iu1_7xx*4")
 
 (define_insn_reservation "ppc750-imul2" 3
-  (and (eq_attr "type" "imul2")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "16")
        (eq_attr "cpu" "ppc750,ppc7400"))
   "ppc750_du,iu1_7xx*2")
 
 (define_insn_reservation "ppc750-imul3" 2
-  (and (eq_attr "type" "imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8")
        (eq_attr "cpu" "ppc750,ppc7400"))
   "ppc750_du,iu1_7xx")
 
index 76cca3fbf31feade63c91afd21485dd6b9c2e96e..da3f92b0a23eba06ee62b23bb16ee2e35d10fa28 100644 (file)
 
 ;; Multiply
 (define_insn_reservation "ppc8540_multiply" 4
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppc8540,ppc8548"))
   "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0,ppc8540_mu_stage1,\
    ppc8540_mu_stage2,ppc8540_mu_stage3+ppc8540_retire")
index 02a98546dfe8e76daae40ae88d15187a3ab64c4f..7cab4d38931dd73c053c81c4dcd97351c0cc29dc 100644 (file)
 
 ;; D.4.8
 (define_insn_reservation "ppca2-imul" 1
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16,32")
        (eq_attr "cpu" "ppca2"))
   "nothing")
 
 ;; FIXME: latency and multiplier reservation for 64-bit multiply?
 (define_insn_reservation "ppca2-lmul" 6
-  (and (eq_attr "type" "lmul,lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "ppca2"))
   "mult*3")
 
index d13dcb6b7cd80a8da3e915a3d46dbc817b07df0a..8c3c7413da342130658b77a5a7172e5600e0b4d2 100644 (file)
 
 ;; mulld
 (define_insn_reservation "cell-lmul" 15
-  (and (eq_attr "type" "lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "cell"))
   "slot1,nonpipeline,nonpipeline*13")
 
 ;; mulld. is microcoded
 (define_insn_reservation "cell-lmul-cmp" 22
-  (and (eq_attr "type" "lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "cell"))
   "slot0+slot1,nonpipeline,nonpipeline*20")
 
 ;; mulli, 6 cycles
 (define_insn_reservation "cell-imul23" 6
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "cell"))
   "slot1,nonpipeline,nonpipeline*4")
 
 ;; mullw, 9
 (define_insn_reservation "cell-imul" 9
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "cell"))
   "slot1,nonpipeline,nonpipeline*7")
  
index 7a54dba16e2bb6e087063820b06cbe1fb71a0526..aba0d206e7ce226cba65f535eef2dc3a1a15b9fc 100644 (file)
 
 ;; Multiply is non-pipelined but can be executed in any IU
 (define_insn_reservation "ppce300c3_multiply" 2
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3")))
   "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0, \
    ppce300c3_iu_stage0+ppce300c3_retire")
index 7c14c631c9268747ca2406de451b6dd7907ed18c..051394eaeeb96cf92e394ac3a064243daa0ae36d 100644 (file)
@@ -91,7 +91,7 @@
 
 ;; Multiply.
 (define_insn_reservation "e500mc_multiply" 4
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppce500mc"))
   "e500mc_decode,e500mc_issue+e500mc_mu_stage0,e500mc_mu_stage1,\
    e500mc_mu_stage2,e500mc_mu_stage3+e500mc_retire")
index 6418339d241518b5866987bb97adb961f4ce165c..3fcd94ee6f9b3413fa1e0305009bbaadc1df617e 100644 (file)
@@ -99,7 +99,7 @@
 
 ;; Multiply.
 (define_insn_reservation "e500mc64_multiply" 4
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "ppce500mc64"))
   "e500mc64_decode,e500mc64_issue+e500mc64_mu_stage0,e500mc64_mu_stage1,\
    e500mc64_mu_stage2,e500mc64_mu_stage3+e500mc64_retire")
index 51645266cb91d82d46484246274f7e795d1ff1d6..b04d0a3b75aa56e8baf24bbcfd318aa92697a1e6 100644 (file)
 
 ;; CFX - Multiply.
 (define_insn_reservation "e5500_multiply" 4
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppce5500"))
   "e5500_decode,e5500_cfx_stage0,e5500_cfx_stage1")
 
 (define_insn_reservation "e5500_multiply_i" 5
-  (and (eq_attr "type" "imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
+       (ior (eq_attr "dot" "yes")
+           (eq_attr "size" "8,16"))
        (eq_attr "cpu" "ppce5500"))
   "e5500_decode,e5500_cfx_stage0,\
    e5500_cfx_stage0+e5500_cfx_stage1,e5500_cfx_stage1")
index b2d8426acb7c034adc1b67de289ba9cc04ee56ee..18a372b73afbd3c6b6b4c95579560290e616270c 100644 (file)
 
 ;; CFX - Multiply.
 (define_insn_reservation "e6500_multiply" 4
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "ppce6500"))
   "e6500_decode,e6500_cfx_stage0,e6500_cfx_stage1")
 
 (define_insn_reservation "e6500_multiply_i" 5
-  (and (eq_attr "type" "imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
+       (ior (eq_attr "dot" "yes")
+           (eq_attr "size" "8,16"))
        (eq_attr "cpu" "ppce6500"))
   "e6500_decode,e6500_cfx_stage0,\
    e6500_cfx_stage0+e6500_cfx_stage1,e6500_cfx_stage1")
index bce5f85c562e8631afe5eccba7b773e34fabb541..317d064b0adcc21cf4ea67466f2e859e30642415 100644 (file)
@@ -57,7 +57,7 @@
   "iu_mpc,iu_mpc,iu_mpc")
 
 (define_insn_reservation "mpccore-imul" 2
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "mpccore"))
   "mciu_mpc")
 
index bafb4297f2a2e3ab704e796bba3f393092a0c935..2f508510b09bc031dbeaeaf63d4b7a83774d3a4d 100644 (file)
 (define_bypass 4 "power4-compare" "power4-branch,power4-crlogical,power4-delayedcr,power4-mfcr,power4-mfcrf")
 
 (define_insn_reservation "power4-lmul-cmp" 7
-  (and (eq_attr "type" "lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power4"))
   "(du1_power4+du2_power4|du2_power4+du3_power4|du3_power4+du4_power4),\
    ((iu1_power4*6,iu2_power4)\
 (define_bypass 10 "power4-lmul-cmp" "power4-branch,power4-crlogical,power4-delayedcr,power4-mfcr,power4-mfcrf")
 
 (define_insn_reservation "power4-imul-cmp" 5
-  (and (eq_attr "type" "imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power4"))
   "(du1_power4+du2_power4|du2_power4+du3_power4|du3_power4+du4_power4),\
    ((iu1_power4*4,iu2_power4)\
 (define_bypass 8 "power4-imul-cmp" "power4-branch,power4-crlogical,power4-delayedcr,power4-mfcr,power4-mfcrf")
 
 (define_insn_reservation "power4-lmul" 7
-  (and (eq_attr "type" "lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power4"))
   "(du1_power4|du2_power4|du3_power4|du4_power4),\
    (iu1_power4*6|iu2_power4*6)")
 
 (define_insn_reservation "power4-imul" 5
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power4"))
   "(du1_power4|du2_power4|du3_power4|du4_power4),\
    (iu1_power4*4|iu2_power4*4)")
 
 (define_insn_reservation "power4-imul3" 4
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "power4"))
   "(du1_power4|du2_power4|du3_power4|du4_power4),\
    (iu1_power4*3|iu2_power4*3)")
index 747fda3fdd520bc92365ee14600fec59e78dfc0d..3b855d3ec688c72eb8db70fa99e00ed1869b0437 100644 (file)
 (define_bypass 4 "power5-compare" "power5-branch,power5-crlogical,power5-delayedcr,power5-mfcr,power5-mfcrf")
 
 (define_insn_reservation "power5-lmul-cmp" 7
-  (and (eq_attr "type" "lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power5"))
   "du1_power5+du2_power5,iu1_power5*6,iu2_power5")
 
 (define_bypass 10 "power5-lmul-cmp" "power5-branch,power5-crlogical,power5-delayedcr,power5-mfcr,power5-mfcrf")
 
 (define_insn_reservation "power5-imul-cmp" 5
-  (and (eq_attr "type" "imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power5"))
   "du1_power5+du2_power5,iu1_power5*4,iu2_power5")
 
 (define_bypass 8 "power5-imul-cmp" "power5-branch,power5-crlogical,power5-delayedcr,power5-mfcr,power5-mfcrf")
 
 (define_insn_reservation "power5-lmul" 7
-  (and (eq_attr "type" "lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power5"))
   "(du1_power5|du2_power5|du3_power5|du4_power5),(iu1_power5*6|iu2_power5*6)")
 
 (define_insn_reservation "power5-imul" 5
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power5"))
   "(du1_power5|du2_power5|du3_power5|du4_power5),(iu1_power5*4|iu2_power5*4)")
 
 (define_insn_reservation "power5-imul3" 4
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "power5"))
   "(du1_power5|du2_power5|du3_power5|du4_power5),(iu1_power5*3|iu2_power5*3)")
 
index 29476686eb162f3fcb5d723f1cef3bf32e6a7a0b..bed2f9f6f111df4b8ef8d2ec8d709a7e813ec22a 100644 (file)
   "FXU_power6")
 
 (define_insn_reservation "power6-lmul-cmp" 16
-  (and (eq_attr "type" "lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power6"))
   "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
   |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
 
 (define_insn_reservation "power6-imul-cmp" 16
-  (and (eq_attr "type" "imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power6"))
   "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
   |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
 
 (define_insn_reservation "power6-lmul" 16
-  (and (eq_attr "type" "lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "power6"))
   "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
   |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
 
 (define_insn_reservation "power6-imul" 16
-  (and (eq_attr "type" "imul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "power6"))
   "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
   |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
 
 (define_insn_reservation "power6-imul3" 16
-  (and (eq_attr "type" "imul2,imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8,16")
        (eq_attr "cpu" "power6"))
   "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
   |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
index 35ac88ef0844f5d0a584422921094f49ec333946..be92bd5691c596770579af7c69500b610495cf6a 100644 (file)
 (define_bypass 3 "power7-cmp,power7-compare" "power7-crlogical,power7-delayedcr")
 
 (define_insn_reservation "power7-mul" 4
-  (and (eq_attr "type" "imul,imul2,imul3,lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
        (eq_attr "cpu" "power7"))
   "DU_power7,FXU_power7")
 
 (define_insn_reservation "power7-mul-compare" 5
-  (and (eq_attr "type" "imul_compare,lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
        (eq_attr "cpu" "power7"))
   "DU2F_power7,FXU_power7,nothing*3,FXU_power7")
 
index 7af5eab02bd3edb3a12a1b8342d7058e1edcdcd4..024b97235d869e9148aaf606d9ce6ff86971cf9a 100644 (file)
                 "power8-crlogical,power8-mfcr,power8-mfcrf,power8-branch")
 
 (define_insn_reservation "power8-mul" 4
-  (and (eq_attr "type" "imul,imul2,imul3,lmul")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "no")
        (eq_attr "cpu" "power8"))
   "DU_any_power8,FXU_power8")
 
 (define_insn_reservation "power8-mul-compare" 4
-  (and (eq_attr "type" "imul_compare,lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "dot" "yes")
        (eq_attr "cpu" "power8"))
   "DU_cracked_power8,FXU_power8")
 
index d8098a73e0a36572829e05c3124ab3664590f473..ba8479822c5a0fde226ec25043c9c38d05d91049 100644 (file)
@@ -26189,12 +26189,15 @@ rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
                 case TYPE_CMP:
                 case TYPE_COMPARE:
                 case TYPE_DELAYED_COMPARE:
-                case TYPE_IMUL_COMPARE:
-                case TYPE_LMUL_COMPARE:
                 case TYPE_FPCOMPARE:
                 case TYPE_CR_LOGICAL:
                 case TYPE_DELAYED_CR:
                  return cost + 2;
+                case TYPE_MUL:
+                 if (get_attr_dot (dep_insn) == DOT_YES)
+                   return cost + 2;
+                 else
+                   break;
                default:
                  break;
                }
@@ -26253,12 +26256,7 @@ rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
                         return 3;
                       break;
                     }
-                  case TYPE_IMUL:
-                  case TYPE_IMUL2:
-                  case TYPE_IMUL3:
-                  case TYPE_LMUL:
-                  case TYPE_IMUL_COMPARE:
-                  case TYPE_LMUL_COMPARE:
+                  case TYPE_MUL:
                     {
                       if (! store_data_bypass_p (dep_insn, insn))
                         return 17;
@@ -26329,12 +26327,7 @@ rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
                         return 3;
                       break;
                     }
-                  case TYPE_IMUL:
-                  case TYPE_IMUL2:
-                  case TYPE_IMUL3:
-                  case TYPE_LMUL:
-                  case TYPE_IMUL_COMPARE:
-                  case TYPE_LMUL_COMPARE:
+                  case TYPE_MUL:
                     {
                       if (set_to_load_agen (dep_insn, insn))
                         return 17;
@@ -26499,7 +26492,8 @@ is_cracked_insn (rtx insn)
              && get_attr_update (insn) == UPDATE_YES)
          || type == TYPE_DELAYED_CR
          || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
-         || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
+         || (type == TYPE_MUL
+             && get_attr_dot (insn) == DOT_YES)
          || type == TYPE_IDIV || type == TYPE_LDIV
          || type == TYPE_INSERT_WORD)
        return true;
@@ -26655,7 +26649,7 @@ rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
       default:
        break;
 
-      case TYPE_IMUL:
+      case TYPE_MUL:
       case TYPE_IDIV:
        fprintf (stderr, "priority was %#x (%d) before adjustment\n",
                 priority, priority);
@@ -26709,10 +26703,7 @@ is_nonpipeline_insn (rtx insn)
     return false;
 
   type = get_attr_type (insn);
-  if (type == TYPE_IMUL
-      || type == TYPE_IMUL2
-      || type == TYPE_IMUL3
-      || type == TYPE_LMUL
+  if (type == TYPE_MUL
       || type == TYPE_IDIV
       || type == TYPE_LDIV
       || type == TYPE_SDIV
@@ -27335,15 +27326,10 @@ insn_must_be_first_in_group (rtx insn)
         case TYPE_SHIFT:
         case TYPE_VAR_SHIFT_ROTATE:
         case TYPE_TRAP:
-        case TYPE_IMUL:
-        case TYPE_IMUL2:
-        case TYPE_IMUL3:
-        case TYPE_LMUL:
+        case TYPE_MUL:
         case TYPE_IDIV:
         case TYPE_INSERT_WORD:
         case TYPE_DELAYED_COMPARE:
-        case TYPE_IMUL_COMPARE:
-        case TYPE_LMUL_COMPARE:
         case TYPE_FPCOMPARE:
         case TYPE_MFCR:
         case TYPE_MTCR:
@@ -27386,6 +27372,11 @@ insn_must_be_first_in_group (rtx insn)
         case TYPE_MFJMPR:
         case TYPE_MTJMPR:
           return true;
+        case TYPE_MUL:
+          if (get_attr_dot (insn) == DOT_YES)
+            return true;
+          else
+            break;
         case TYPE_LOAD:
           if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
               || get_attr_update (insn) == UPDATE_YES)
@@ -27416,8 +27407,6 @@ insn_must_be_first_in_group (rtx insn)
         case TYPE_COMPARE:
         case TYPE_DELAYED_COMPARE:
         case TYPE_VAR_DELAYED_COMPARE:
-        case TYPE_IMUL_COMPARE:
-        case TYPE_LMUL_COMPARE:
         case TYPE_SYNC:
         case TYPE_ISYNC:
         case TYPE_LOAD_L:
@@ -27481,14 +27470,9 @@ insn_must_be_last_in_group (rtx insn)
       case TYPE_SHIFT:
       case TYPE_VAR_SHIFT_ROTATE:
       case TYPE_TRAP:
-      case TYPE_IMUL:
-      case TYPE_IMUL2:
-      case TYPE_IMUL3:
-      case TYPE_LMUL:
+      case TYPE_MUL:
       case TYPE_IDIV:
       case TYPE_DELAYED_COMPARE:
-      case TYPE_IMUL_COMPARE:
-      case TYPE_LMUL_COMPARE:
       case TYPE_FPCOMPARE:
       case TYPE_MFCR:
       case TYPE_MTCR:
index 408d20ad3158fdf8db159e67adacb907f64255ae..5993537e280bc8271a7c4b1150ff0def55d99cbf 100644 (file)
 (define_attr "type"
   "integer,two,three,
    shift,var_shift_rotate,insert_word,insert_dword,
-   imul,imul2,imul3,lmul,halfmul,idiv,ldiv,
+   mul,halfmul,idiv,ldiv,
    exts,cntlz,popcnt,isel,
    load,store,fpload,fpstore,vecload,vecstore,
    cmp,
    branch,jmpreg,mfjmpr,mtjmpr,trap,isync,sync,load_l,store_c,
    compare,fast_compare,delayed_compare,var_delayed_compare,
-   imul_compare,lmul_compare,
    cr_logical,delayed_cr,mfcr,mfcrf,mtcr,
    fpcompare,fp,fpsimple,dmul,sdiv,ddiv,ssqrt,dsqrt,
    brinc,
    htm"
   (const_string "integer"))
 
+;; What data size does this instruction work on?
+;; This is used for mul.
+(define_attr "size" "8,16,32,64" (const_string "32"))
+
+;; Is this instruction record form ("dot", signed compare to 0, writing CR0)?
+;; This is used for mul.
+(define_attr "dot" "no,yes" (const_string "no"))
+
 ;; Does this instruction sign-extend its result?
 ;; This is used for load insns.
 (define_attr "sign_extend" "no,yes" (const_string "no"))
 ;; If this instruction is microcoded on the CELL processor
 ; The default for load extended, the recorded instructions and rotate/shifts by a variable is always microcoded
 (define_attr "cell_micro" "not,conditional,always"
-  (if_then_else (ior (eq_attr "type" "compare,delayed_compare,imul_compare,lmul_compare,var_shift_rotate,var_delayed_compare")
+  (if_then_else (ior (eq_attr "type" "compare,delayed_compare,var_shift_rotate,var_delayed_compare")
+                    (and (eq_attr "type" "mul")
+                         (eq_attr "dot" "yes"))
                     (and (eq_attr "type" "load")
                          (eq_attr "sign_extend" "yes")))
                (const_string "always")
   "@
    mullw %0,%1,%2
    mulli %0,%1,%2"
-   [(set (attr "type")
+   [(set_attr "type" "mul")
+    (set (attr "size")
       (cond [(match_operand:SI 2 "s8bit_cint_operand" "")
-               (const_string "imul3")
+               (const_string "8")
              (match_operand:SI 2 "short_cint_operand" "")
-               (const_string "imul2")]
-       (const_string "imul")))])
+               (const_string "16")]
+       (const_string "32")))])
 
 (define_insn "*mulsi3_internal1"
   [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
   "@
    mullw. %3,%1,%2
    #"
-  [(set_attr "type" "imul_compare")
+  [(set_attr "type" "mul")
+   (set_attr "dot" "yes")
    (set_attr "length" "4,8")])
 
 (define_split
   "@
    mullw. %0,%1,%2
    #"
-  [(set_attr "type" "imul_compare")
+  [(set_attr "type" "mul")
+   (set_attr "dot" "yes")
    (set_attr "length" "4,8")])
 
 (define_split
     ? \"mulhw %0,%1,%2\;mullw %L0,%1,%2\"
     : \"mulhw %L0,%1,%2\;mullw %0,%1,%2\";
 }
-  [(set_attr "type" "imul")
+  [(set_attr "type" "mul")
    (set_attr "length" "8")])
 
 (define_split
     ? \"mulhwu %0,%1,%2\;mullw %L0,%1,%2\"
     : \"mulhwu %L0,%1,%2\;mullw %0,%1,%2\";
 }"
-  [(set_attr "type" "imul")
+  [(set_attr "type" "mul")
    (set_attr "length" "8")])
 
 (define_split
                      (const_int 32))))]
   ""
   "mulhw %0,%1,%2"
-  [(set_attr "type" "imul")])
+  [(set_attr "type" "mul")])
 
 (define_insn "umulsi3_highpart"
   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                      (const_int 32))))]
   ""
   "mulhwu %0,%1,%2"
-  [(set_attr "type" "imul")])
+  [(set_attr "type" "mul")])
 
 ;; Shift by a variable amount is too complex to be worth open-coding.  We
 ;; just handle shifts by constants.
   "@
    mulld %0,%1,%2
    mulli %0,%1,%2"
-   [(set (attr "type")
+   [(set_attr "type" "mul")
+    (set (attr "size")
       (cond [(match_operand:SI 2 "s8bit_cint_operand" "")
-               (const_string "imul3")
+               (const_string "8")
             (match_operand:SI 2 "short_cint_operand" "")
-               (const_string "imul2")]
-       (const_string "lmul")))])
+               (const_string "16")]
+       (const_string "64")))])
 
 (define_insn "*muldi3_internal1"
   [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
   "@
    mulld. %3,%1,%2
    #"
-  [(set_attr "type" "lmul_compare")
+  [(set_attr "type" "mul")
+   (set_attr "size" "64")
+   (set_attr "dot" "yes")
    (set_attr "length" "4,8")])
 
 (define_split
   "@
    mulld. %0,%1,%2
    #"
-  [(set_attr "type" "lmul_compare")
+  [(set_attr "type" "mul")
+   (set_attr "size" "64")
+   (set_attr "dot" "yes")
    (set_attr "length" "4,8")])
 
 (define_split
                      (const_int 64))))]
   "TARGET_POWERPC64"
   "mulhd %0,%1,%2"
-  [(set_attr "type" "lmul")])
+  [(set_attr "type" "mul")
+   (set_attr "size" "64")])
 
 (define_insn "umuldi3_highpart"
   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                      (const_int 64))))]
   "TARGET_POWERPC64"
   "mulhdu %0,%1,%2"
-  [(set_attr "type" "lmul")])
+  [(set_attr "type" "mul")
+   (set_attr "size" "64")])
 
 (define_expand "mulditi3"
   [(set (match_operand:TI 0 "gpc_reg_operand")
index 977ed658f44daffcffaf979451ebb4ec18e2870b..76113e873afc0e63b2cbd5f321f51da27ca3e6b8 100644 (file)
   "iu_rs64,iu_rs64,iu_rs64")
 
 (define_insn_reservation "rs64a-imul" 20
-  (and (eq_attr "type" "imul,imul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "32")
        (eq_attr "cpu" "rs64a"))
   "mciu_rs64*13")
 
 (define_insn_reservation "rs64a-imul2" 12
-  (and (eq_attr "type" "imul2")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "16")
        (eq_attr "cpu" "rs64a"))
   "mciu_rs64*5")
 
 (define_insn_reservation "rs64a-imul3" 8
-  (and (eq_attr "type" "imul3")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "8")
        (eq_attr "cpu" "rs64a"))
   "mciu_rs64*2")
 
 (define_insn_reservation "rs64a-lmul" 34
-  (and (eq_attr "type" "lmul,lmul_compare")
+  (and (eq_attr "type" "mul")
+       (eq_attr "size" "64")
        (eq_attr "cpu" "rs64a"))
   "mciu_rs64*34")
 
index 6bb4792ab404121231f325e6a31d1d39e1efc1ae..21186a3a206cbc5534158f476b0da282e0c5fc18 100644 (file)
@@ -39,7 +39,7 @@
   "titan_issue,titan_fxu_sh")
 
 (define_insn_reservation "titan_imul" 5
-  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
+  (and (eq_attr "type" "mul")
        (eq_attr "cpu" "titan"))       
   "titan_issue,titan_fxu_sh,nothing*5,titan_fxu_wb")