From 2b7794ad0be64f46c4ad99ca580a5eabe86a3d37 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Wed, 26 May 1993 15:39:50 -0700 Subject: [PATCH] (ashlsi3): Use shlo instead of shli. From-SVN: r4577 --- gcc/config/i960/i960.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gcc/config/i960/i960.md b/gcc/config/i960/i960.md index 191cee99032..dd528291043 100644 --- a/gcc/config/i960/i960.md +++ b/gcc/config/i960/i960.md @@ -2092,12 +2092,20 @@ ;; Arithmetic shift instructions. +;; The shli instruction generates an overflow fault if the sign changes. +;; In the case of overflow, it does not give the natural result, it instead +;; gives the last shift value before the overflow. We can not use this +;; instruction because gcc thinks that arithmetic left shift and logical +;; left shift are identical, and sometimes canonicalizes the logical left +;; shift to an arithmetic left shift. Therefore we must always use the +;; logical left shift instruction. + (define_insn "ashlsi3" [(set (match_operand:SI 0 "register_operand" "=d") (ashift:SI (match_operand:SI 1 "arith_operand" "dI") (match_operand:SI 2 "arith_operand" "dI")))] "" - "shli %2,%1,%0" + "shlo %2,%1,%0" [(set_attr "type" "alu2")]) (define_insn "ashrsi3" -- 2.30.2