From efc601240c12628df7ec467ac07a322306f80b71 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Wed, 29 Aug 2018 02:20:44 +0000 Subject: Rewrite pic.md to improve medany and pic code size. gcc/ * config/riscv/pic.md: Rewrite. * config/riscv/riscv.c (riscv_address_insns): Return cost of 3 for invalid address. * config/riscv/riscv.md (ZERO_EXTEND_LOAD): Delete. (SOFTF, default_load, softload, softstore): New. From-SVN: r263943 --- gcc/config/riscv/pic.md | 113 ++++++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 42 deletions(-) (limited to 'gcc/config/riscv/pic.md') diff --git a/gcc/config/riscv/pic.md b/gcc/config/riscv/pic.md index a4a9732656c..942502058e0 100644 --- a/gcc/config/riscv/pic.md +++ b/gcc/config/riscv/pic.md @@ -22,71 +22,100 @@ ;; Simplify PIC loads to static variables. ;; These should go away once we figure out how to emit auipc discretely. -(define_insn "*local_pic_load_s" +(define_insn "*local_pic_load" [(set (match_operand:ANYI 0 "register_operand" "=r") - (sign_extend:ANYI (mem:ANYI (match_operand 1 "absolute_symbolic_operand" ""))))] + (mem:ANYI (match_operand 1 "absolute_symbolic_operand" "")))] + "USE_LOAD_ADDRESS_MACRO (operands[1])" + "\t%0,%1" + [(set (attr "length") (const_int 8))]) + +(define_insn "*local_pic_load_s" + [(set (match_operand:SUPERQI 0 "register_operand" "=r") + (sign_extend:SUPERQI (mem:SUBX (match_operand 1 "absolute_symbolic_operand" ""))))] "USE_LOAD_ADDRESS_MACRO (operands[1])" - "\t%0,%1" + "\t%0,%1" [(set (attr "length") (const_int 8))]) (define_insn "*local_pic_load_u" - [(set (match_operand:ZERO_EXTEND_LOAD 0 "register_operand" "=r") - (zero_extend:ZERO_EXTEND_LOAD (mem:ZERO_EXTEND_LOAD (match_operand 1 "absolute_symbolic_operand" ""))))] + [(set (match_operand:SUPERQI 0 "register_operand" "=r") + (zero_extend:SUPERQI (mem:SUBX (match_operand 1 "absolute_symbolic_operand" ""))))] "USE_LOAD_ADDRESS_MACRO (operands[1])" - "u\t%0,%1" + "u\t%0,%1" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_load" - [(set (match_operand:ANYF 0 "register_operand" "=f") +;; We can support ANYF loads into X register if there is no double support +;; or if the target is 64-bit. + +(define_insn "*local_pic_load" + [(set (match_operand:ANYF 0 "register_operand" "=f,*r") (mem:ANYF (match_operand 1 "absolute_symbolic_operand" ""))) - (clobber (match_scratch:DI 2 "=r"))] - "TARGET_HARD_FLOAT && TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[1])" - "\t%0,%1,%2" + (clobber (match_scratch:P 2 "=r,X"))] + "TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[1]) + && (!TARGET_DOUBLE_FLOAT || TARGET_64BIT)" + "@ + \t%0,%1,%2 + \t%0,%1" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_load" +;; ??? For a 32-bit target with double float, a DF load into a X reg isn't +;; supported. ld is not valid in that case. Punt for now. Maybe add a split +;; for this later. + +(define_insn "*local_pic_load_32d" [(set (match_operand:ANYF 0 "register_operand" "=f") (mem:ANYF (match_operand 1 "absolute_symbolic_operand" ""))) - (clobber (match_scratch:SI 2 "=r"))] - "TARGET_HARD_FLOAT && !TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[1])" - "\t%0,%1,%2" + (clobber (match_scratch:P 2 "=r"))] + "TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[1]) + && (TARGET_DOUBLE_FLOAT && !TARGET_64BIT)" + "\t%0,%1,%2" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_loadu" - [(set (match_operand:SUPERQI 0 "register_operand" "=r") - (zero_extend:SUPERQI (mem:SUBX (match_operand 1 "absolute_symbolic_operand" ""))))] - "USE_LOAD_ADDRESS_MACRO (operands[1])" - "u\t%0,%1" +(define_insn "*local_pic_load_sf" + [(set (match_operand:SOFTF 0 "register_operand" "=r") + (mem:SOFTF (match_operand 1 "absolute_symbolic_operand" "")))] + "!TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[1])" + "\t%0,%1" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_storedi" - [(set (mem:ANYI (match_operand 0 "absolute_symbolic_operand" "")) - (match_operand:ANYI 1 "reg_or_0_operand" "rJ")) - (clobber (match_scratch:DI 2 "=&r"))] - "TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[0])" - "\t%z1,%0,%2" - [(set (attr "length") (const_int 8))]) +;; Simplify PIC stores to static variables. +;; These should go away once we figure out how to emit auipc discretely. -(define_insn "*local_pic_storesi" +(define_insn "*local_pic_store" [(set (mem:ANYI (match_operand 0 "absolute_symbolic_operand" "")) (match_operand:ANYI 1 "reg_or_0_operand" "rJ")) - (clobber (match_scratch:SI 2 "=&r"))] - "!TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[0])" - "\t%z1,%0,%2" + (clobber (match_scratch:P 2 "=&r"))] + "USE_LOAD_ADDRESS_MACRO (operands[0])" + "\t%z1,%0,%2" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_storedi" +(define_insn "*local_pic_store" [(set (mem:ANYF (match_operand 0 "absolute_symbolic_operand" "")) - (match_operand:ANYF 1 "register_operand" "f")) - (clobber (match_scratch:DI 2 "=r"))] - "TARGET_HARD_FLOAT && TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[0])" - "\t%1,%0,%2" + (match_operand:ANYF 1 "register_operand" "f,*r")) + (clobber (match_scratch:P 2 "=r,&r"))] + "TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[0]) + && (!TARGET_DOUBLE_FLOAT || TARGET_64BIT)" + "@ + \t%1,%0,%2 + \t%1,%0,%2" [(set (attr "length") (const_int 8))]) -(define_insn "*local_pic_storesi" - [(set (mem:ANYF (match_operand 0 "absolute_symbolic_operand" "")) - (match_operand:ANYF 1 "register_operand" "f")) - (clobber (match_scratch:SI 2 "=r"))] - "TARGET_HARD_FLOAT && !TARGET_64BIT && USE_LOAD_ADDRESS_MACRO (operands[0])" - "\t%1,%0,%2" +;; ??? For a 32-bit target with double float, a DF store from a X reg isn't +;; supported. sd is not valid in that case. Punt for now. Maybe add a split +;; for this later. + +(define_insn "*local_pic_store_32d" + [(set (match_operand:ANYF 0 "register_operand" "=f") + (mem:ANYF (match_operand 1 "absolute_symbolic_operand" ""))) + (clobber (match_scratch:P 2 "=r"))] + "TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[1]) + && (TARGET_DOUBLE_FLOAT && !TARGET_64BIT)" + "\t%1,%0,%2" + [(set (attr "length") (const_int 8))]) + +(define_insn "*local_pic_store_sf" + [(set (mem:SOFTF (match_operand 0 "absolute_symbolic_operand" "")) + (match_operand:SOFTF 1 "register_operand" "r")) + (clobber (match_scratch:P 2 "=&r"))] + "!TARGET_HARD_FLOAT && USE_LOAD_ADDRESS_MACRO (operands[0])" + "\t%1,%0,%2" [(set (attr "length") (const_int 8))]) -- cgit v1.2.1