158158;; Same as above but to be used by mov conditional
159159(define_mode_attr mcctab [ (QI "") (HI "") (SI "") (DI "l")] )
160160
161+ ;; Give the number of bits-1 in the mode
162+ (define_mode_attr sizen [ (QI "7") (HI "15") (SI "31") (DI "63")] )
163+
161164;; -------------------------------------------------------------------
162165;; Code Attributes
163166;; -------------------------------------------------------------------
@@ -937,10 +940,10 @@ umod, umodl, unknown, xbfu, xor, xorl"
937940;; ""
938941;; )
939942
940- (define_insn "* arc64_zero_extend _ <mode >_ to_si "
941- [ (set (match_operand: SI 0 "register_operand" "=q,r,q,r")
942- (zero_extend: SI
943- (match_operand: SHORT 1 "nonimmediate_operand" "q,r,Uldms,m")))]
943+ (define_insn "* zero_extend <mode >si2 "
944+ [ (set (match_operand: SI 0 "register_operand" "=q,r, q,r")
945+ (zero_extend: SI
946+ (match_operand: SHORT 1 "nonimmediate_operand" "q,r,Uldms,m")))]
944947 ""
945948 "@
946949 ext<exttab >_ s\\ t%0,%1
@@ -950,60 +953,41 @@ umod, umodl, unknown, xbfu, xor, xorl"
950953 [ (set_attr "type" "sex,sex,ld,ld")
951954 (set_attr "length" "2,4,2,* ")] )
952955
953- (define_insn "* arc64_zero_extend_si_to_di"
954- [ (set (match_operand: DI 0 "register_operand" "=r,q,r")
955- (zero_extend: DI
956- (match_operand: SI 1 "nonimmediate_operand" "r,Uldms,m")))
957- ]
956+ (define_insn "* zero_extend<mode >di2"
957+ [ (set (match_operand: DI 0 "register_operand" "=r, q,r")
958+ (zero_extend: DI
959+ (match_operand: EXT 1 "nonimmediate_operand" "r,Uldms,m")))]
958960 ""
959961 "@
960- bmskl\\ t%0,%1,31
961- ld_s\\ t%0,%1
962- ld%U1\\ t%0,%1"
963- [ (set_attr "type" "and,ld,ld")
964- (set_attr "length" "4,2,* ")]
965- )
966-
967- (define_insn "* arc64_zero_extend_qi_to_di"
968- [ (set (match_operand: DI 0 "register_operand" "=r, q,r")
969- (zero_extend: DI
970- (match_operand: QI 1 "nonimmediate_operand" "r,Uldms,m")))
971- ]
972- ""
973- "@
974- bmskl\\ t%0,%1,7
975- ldb_s\\ t%0,%1
976- ldb%U1\\ t%0,%1"
962+ bmskl\\ t%0,%1,<sizen >
963+ ld<sfxtab >_ s\\ t%0,%1
964+ ld<sfxtab >%U1\\ t%0,%1"
977965 [ (set_attr "type" "and,ld,ld")
978966 (set_attr "length" "4,2,* ")]
979967)
980968
981- (define_insn "* arc64_zero_extend_hi_to_di"
982- [ (set (match_operand: DI 0 "register_operand" "=r,q,r")
983- (zero_extend: DI
984- (match_operand: HI 1 "nonimmediate_operand" "r,Uldms,m")))
985- ]
986- ""
987- "@
988- bmskl\\ t%0,%1,15
989- ldh_s\\ t%0,%1
990- ldh%U1\\ t%0,%1"
991- [ (set_attr "type" "and,ld,ld")
992- (set_attr "length" "4,2,* ")]
993- )
969+ ;; conditional execution for the above two patterns
970+ (define_insn "* zero_extend< SHORT:mode > < GPI:mode > 2_ce"
971+ [ (cond_exec
972+ (match_operator 2 "ordered_comparison_operator"
973+ [ (match_operand 3 "cc_register" "") (const_int 0)] )
974+ (set (match_operand: GPI 0"register_operand" "=r")
975+ (zero_extend: GPI (match_operand: SHORT 1 "register_operand" "0"))))]
976+ ""
977+ "bmsk< GPI:mcctab > .%m2\\ t%0,%1,< SHORT:sizen > "
978+ [ (set_attr "type" "and")
979+ (set_attr "length" "4")] )
994980
995- (define_insn "* arc64_sign_extend _ <mode >_ to_di "
981+ (define_insn "* sign_extend <mode >di2 "
996982 [ (set (match_operand: DI 0 "register_operand" "=r,r")
997983 (sign_extend: DI
998- (match_operand: EXT 1 "nonimmediate_operand" "r,m")))
999- ]
984+ (match_operand: EXT 1 "nonimmediate_operand" "r,m")))]
1000985 ""
1001986 "@
1002987 sex<exttab >l\\ t%0,%1
1003988 ld<sfxtab >.x%U1\\ t%0,%1"
1004- [ (set_attr "type" "sex,ld")
1005- (set_attr "length" "4,* ")]
1006- )
989+ [ (set_attr "type" "sex,ld")
990+ (set_attr "length" "4,* ")] )
1007991
1008992(define_insn "* sign_extend<mode >si2"
1009993 [ (set (match_operand: SI 0 "register_operand" "=q,r,r")
0 commit comments