i86: add more patterns for QImode and SImode; add more shift/rotate patterns
authorDaniel Verkamp <daniel.verkamp@gmail.com>
Thu, 16 Aug 2007 17:28:09 +0000 (13:28 -0400)
committerDaniel Verkamp <daniel.verkamp@gmail.com>
Thu, 16 Aug 2007 17:28:09 +0000 (13:28 -0400)
gcc/config/i86/i86.md

index ee45477..809f9fb 100644 (file)
 ;; division
 ;;
 
-
 (define_insn "divmodhi4"
   [(parallel [(set (match_operand:HI 0 "register_operand" "=a,a")
     (div:HI (match_operand:HI 1 "register_operand" "0,0")
   "cwd\;idiv   %2"
   )
 
+(define_insn "divmodsi4"
+  [(parallel [(set (match_operand:SI 0 "register_operand" "=a,a")
+    (div:SI (match_operand:HI 1 "register_operand" "0,0")
+      (match_operand:HI 2 "nonimmediate_operand" "r,m")))
+    (set (match_operand:SI 3 "register_operand" "=&d,&d")
+      (mod:SI (match_dup 1) (match_dup 2)))
+        ])]
+  ""
+  "cdq\;idiv   %2"
+  )
+
 
 (define_insn "udivmodhi4"
   [(parallel [(set (match_operand:HI 0 "register_operand" "=a,a")
   "xor %%dx,%%dx\;div  %2"
   )
 
+(define_insn "udivmodsi4"
+  [(parallel [(set (match_operand:SI 0 "register_operand" "=a,a")
+    (udiv:SI (match_operand:SI 1 "register_operand" "0,0")
+      (match_operand:SI 2 "nonimmediate_operand" "r,m")))
+    (set (match_operand:SI 3 "register_operand" "=&d,&d")
+      (umod:SI (match_dup 1) (match_dup 2)))
+        ])]
+  ""
+  "xor %%edx,%%edx\;div        %2"
+  )
+
+;;
+;; bitwise operations
+;;
+
+(define_insn "negqi2"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm")
+       (not:QI (match_operand:QI 1 "general_operand" "0")))]
+  ""
+  "neg %0"
+  )
 
 (define_insn "neghi2"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=rm")
   "neg %0"
   )
 
+(define_insn "negsi2"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
+       (not:SI (match_operand:SI 1 "general_operand" "0")))]
+  ""
+  "neg %0"
+  )
+
+
+(define_insn "one_cmplqi2"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm")
+       (neg:QI (match_operand:QI 1 "general_operand" "0")))]
+  ""
+  "not %0"
+  )
+
 (define_insn "one_cmplhi2"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=rm")
        (neg:HI (match_operand:HI 1 "general_operand" "0")))]
   "not %0"
   )
 
+(define_insn "one_cmplsi2"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
+       (neg:SI (match_operand:SI 1 "general_operand" "0")))]
+  ""
+  "not %0"
+  )
+
+
+(define_insn "andqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,rm")
+       (and:QI (match_operand:QI 1 "general_operand" "0,0")
+                (match_operand:QI 2 "general_operand" "rm,ri")))]
+  ""
+  "and %0,%2"
+  )
+
 (define_insn "andhi3"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,rm")
        (and:HI (match_operand:HI 1 "general_operand" "0,0")
   "and %0,%2"
   )
 
+(define_insn "andsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm")
+       (and:SI (match_operand:SI 1 "general_operand" "0,0")
+                (match_operand:SI 2 "general_operand" "rm,ri")))]
+  ""
+  "and %0,%2"
+  )
+
+
+(define_insn "iorqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,rm")
+       (ior:QI (match_operand:QI 1 "general_operand" "0,0")
+                (match_operand:QI 2 "general_operand" "rm,ri")))]
+  ""
+  "or  %0,%2"
+  )
+
 (define_insn "iorhi3"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,rm")
        (ior:HI (match_operand:HI 1 "general_operand" "0,0")
   "or  %0,%2"
   )
 
+(define_insn "iorsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm")
+       (ior:SI (match_operand:SI 1 "general_operand" "0,0")
+                (match_operand:SI 2 "general_operand" "rm,ri")))]
+  ""
+  "or  %0,%2"
+  )
+
+
+(define_insn "xorqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,rm")
+       (xor:QI (match_operand:QI 1 "general_operand" "0,0")
+                (match_operand:QI 2 "general_operand" "rm,ri")))]
+  ""
+  "xor %0,%2"
+  )
+
 (define_insn "xorhi3"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,rm")
        (xor:HI (match_operand:HI 1 "general_operand" "0,0")
   "xor %0,%2"
   )
 
+(define_insn "xorsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm")
+       (xor:SI (match_operand:SI 1 "general_operand" "0,0")
+                (match_operand:SI 2 "general_operand" "rm,ri")))]
+  ""
+  "xor %0,%2"
+  )
+
+
+;;
+;; shifts and rotations
+;;
+
+(define_insn "ashlqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,rm")
+       (ashift:QI (match_operand:QI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "sal %0,%2"
+  )
+
 (define_insn "ashlhi3"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,rm")
        (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
   "sal %0,%2"
   )
 
+(define_insn "ashlsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
+       (ashift:SI (match_operand:SI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "sal %0,%2"
+  )
+
+
+(define_insn "ashrqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,rm")
+       (ashiftrt:QI (match_operand:QI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "sar %0,%2"
+  )
+
+(define_insn "ashrhi3"
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,rm")
+       (ashiftrt:HI (match_operand:HI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "sar %0,%2"
+  )
+
+(define_insn "ashrsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
+       (ashiftrt:SI (match_operand:SI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "sar %0,%2"
+  )
+
+
+(define_insn "lshrqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,rm")
+       (lshiftrt:QI (match_operand:QI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "shr %0,%2"
+  )
+
+(define_insn "lshrhi3"
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,rm")
+       (lshiftrt:HI (match_operand:HI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "shr %0,%2"
+  )
+
+(define_insn "lshrsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
+       (lshiftrt:SI (match_operand:SI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "shr %0,%2"
+  )
+
+
+(define_insn "rotlqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,rm")
+       (rotate:QI (match_operand:QI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "rol %0,%2"
+  )
+
+(define_insn "rotlhi3"
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,rm")
+       (rotate:HI (match_operand:HI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "rol %0,%2"
+  )
+
+(define_insn "rotlsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
+       (rotate:SI (match_operand:SI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "rol %0,%2"
+  )
+
+
+(define_insn "rotrqi3"
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=rm,rm")
+       (rotatert:QI (match_operand:QI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "ror %0,%2"
+  )
+
+(define_insn "rotrhi3"
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,rm")
+       (rotatert:HI (match_operand:HI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "ror %0,%2"
+  )
+
+(define_insn "rotrsi3"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
+       (rotatert:SI (match_operand:SI 1 "general_operand" "0,0")
+                  (match_operand:QI 2 "general_operand" "I,c")))]
+  ""
+  "ror %0,%2"
+  )
+
+;;
+;; comparison
+;;
+
+(define_insn "cmpqi"
+  [(set (cc0)
+       (compare (match_operand:QI 0 "general_operand" "r,rm")
+                (match_operand:QI 1 "general_operand" "rm,ri")))]
+  ""
+  "cmp %0,%1"
+  )
+
 (define_insn "cmphi"
   [(set (cc0)
        (compare (match_operand:HI 0 "general_operand" "r,rm")
   "cmp %0,%1"
   )
 
+(define_insn "cmpsi"
+  [(set (cc0)
+       (compare (match_operand:SI 0 "general_operand" "r,rm")
+                (match_operand:SI 1 "general_operand" "rm,ri")))]
+  ""
+  "cmp %0,%1"
+  )
+
+
 ;;
 ;; sign extension
 ;;