From: Richard Henderson Date: Tue, 2 Jun 1998 15:37:34 +0000 (-0700) Subject: alpha.md (divsi3, [...]): Enable, and work around an OSF/1 library bug wrt sign-exten... X-Git-Tag: prereleases/egcs-1.1-prerelease~974 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d46f7484c3735ba98adf1024ea2b96a1c3d40554;p=thirdparty%2Fgcc.git alpha.md (divsi3, [...]): Enable, and work around an OSF/1 library bug wrt sign-extension of inputs. * alpha.md (divsi3, udivsi3, modsi3, umodsi3): Enable, and work around an OSF/1 library bug wrt sign-extension of inputs. From-SVN: r20183 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 762dd92bbe64..2766e29d7d68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 2 14:02:38 1998 Richard Henderson + + * alpha.md (divsi3, udivsi3, modsi3, umodsi3): Enable, and work + around an OSF/1 library bug wrt sign-extension of inputs. + Tue Jun 2 13:02:44 1998 Richard Henderson * vax/netbsd.h (DWARF2_UNWIND_INFO): Must be undef, not defined 0. diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index 3538b48a60c7..57e2c445050b 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -804,61 +804,66 @@ ;; The divide and remainder operations always take their inputs from ;; r24 and r25, put their output in r27, and clobber r23 and r28. -;; ??? comment out the divsi routines since the library functions -;; don't seem to do the right thing with the high 32-bits of a -;; register nonzero. - -;(define_expand "divsi3" -; [(set (reg:SI 24) (match_operand:SI 1 "input_operand" "")) -; (set (reg:SI 25) (match_operand:SI 2 "input_operand" "")) -; (parallel [(set (reg:SI 27) -; (div:SI (reg:SI 24) -; (reg:SI 25))) -; (clobber (reg:DI 23)) -; (clobber (reg:DI 28))]) -; (set (match_operand:SI 0 "general_operand" "") -; (reg:SI 27))] -; "!TARGET_OPEN_VMS" -; "") - -;(define_expand "udivsi3" -; [(set (reg:SI 24) (match_operand:SI 1 "input_operand" "")) -; (set (reg:SI 25) (match_operand:SI 2 "input_operand" "")) -; (parallel [(set (reg:SI 27) -; (udiv:SI (reg:SI 24) -; (reg:SI 25))) -; (clobber (reg:DI 23)) -; (clobber (reg:DI 28))]) -; (set (match_operand:SI 0 "general_operand" "") -; (reg:SI 27))] -; "!TARGET_OPEN_VMS" -; "") - -;(define_expand "modsi3" -; [(set (reg:SI 24) (match_operand:SI 1 "input_operand" "")) -; (set (reg:SI 25) (match_operand:SI 2 "input_operand" "")) -; (parallel [(set (reg:SI 27) -; (mod:SI (reg:SI 24) -; (reg:SI 25))) -; (clobber (reg:DI 23)) -; (clobber (reg:DI 28))]) -; (set (match_operand:SI 0 "general_operand" "") -; (reg:SI 27))] -; "!TARGET_OPEN_VMS" -; "") - -;(define_expand "umodsi3" -; [(set (reg:SI 24) (match_operand:SI 1 "input_operand" "")) -; (set (reg:SI 25) (match_operand:SI 2 "input_operand" "")) -; (parallel [(set (reg:SI 27) -; (umod:SI (reg:SI 24) -; (reg:SI 25))) -; (clobber (reg:DI 23)) -; (clobber (reg:DI 28))]) -; (set (match_operand:SI 0 "general_operand" "") -; (reg:SI 27))] -; "!TARGET_OPEN_VMS" -; "") +;; ??? Force sign-extension here because some versions of OSF/1 don't +;; do the right thing if the inputs are not properly sign-extended. +;; But Linux, for instance, does not have this problem. Is it worth +;; the complication here to eliminate the sign extension? + +(define_expand "divsi3" + [(set (reg:DI 24) + (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) + (set (reg:DI 25) + (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) + (parallel [(set (reg:DI 27) + (sign_extend:DI (div:SI (reg:DI 24) (reg:DI 25)))) + (clobber (reg:DI 23)) + (clobber (reg:DI 28))]) + (set (match_operand:SI 0 "general_operand" "") + (subreg:SI (reg:DI 27) 0))] + "!TARGET_OPEN_VMS" + "") + +(define_expand "udivsi3" + [(set (reg:DI 24) + (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) + (set (reg:DI 25) + (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) + (parallel [(set (reg:DI 27) + (sign_extend:DI (udiv:SI (reg:DI 24) (reg:DI 25)))) + (clobber (reg:DI 23)) + (clobber (reg:DI 28))]) + (set (match_operand:SI 0 "general_operand" "") + (subreg:SI (reg:DI 27) 0))] + "!TARGET_OPEN_VMS" + "") + +(define_expand "modsi3" + [(set (reg:DI 24) + (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) + (set (reg:DI 25) + (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) + (parallel [(set (reg:DI 27) + (sign_extend:DI (mod:SI (reg:DI 24) (reg:DI 25)))) + (clobber (reg:DI 23)) + (clobber (reg:DI 28))]) + (set (match_operand:SI 0 "general_operand" "") + (subreg:SI (reg:DI 27) 0))] + "!TARGET_OPEN_VMS" + "") + +(define_expand "umodsi3" + [(set (reg:DI 24) + (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) + (set (reg:DI 25) + (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) + (parallel [(set (reg:DI 27) + (sign_extend:DI (umod:SI (reg:DI 24) (reg:DI 25)))) + (clobber (reg:DI 23)) + (clobber (reg:DI 28))]) + (set (match_operand:SI 0 "general_operand" "") + (subreg:SI (reg:DI 27) 0))] + "!TARGET_OPEN_VMS" + "") (define_expand "divdi3" [(set (reg:DI 24) (match_operand:DI 1 "input_operand" "")) @@ -912,15 +917,15 @@ "!TARGET_OPEN_VMS" "") -;(define_insn "" -; [(set (reg:SI 27) -; (match_operator:SI 1 "divmod_operator" -; [(reg:SI 24) (reg:SI 25)])) -; (clobber (reg:DI 23)) -; (clobber (reg:DI 28))] -; "!TARGET_OPEN_VMS" -; "%E1 $24,$25,$27" -; [(set_attr "type" "jsr")]) +(define_insn "" + [(set (reg:DI 27) + (sign_extend:DI (match_operator:SI 1 "divmod_operator" + [(reg:DI 24) (reg:DI 25)]))) + (clobber (reg:DI 23)) + (clobber (reg:DI 28))] + "!TARGET_OPEN_VMS" + "%E1 $24,$25,$27" + [(set_attr "type" "jsr")]) (define_insn "" [(set (reg:DI 27)