On 18 Nov 22:00, Uros Bizjak wrote:
> Hello!
>
> > Here is a patch to add size relocation and instruction to obtain object's
> > size in i386 target.
>
> +(define_insn "move_size_reloc_<mode>"
> + [(set (match_operand:SWI48 0 "register_operand" "=r")
> + (match_operand:<MODE> 1 "size_relocation" "Z"))]
> + ""
> +{
> + return "mov{<imodesuffix>}\t{%1, %0|%0, %1}";
>
> Please don't change x86_64_immediate_operand just to use "Z"
> constraint The predicate is used in a couple of other places that for
> sure don't accept your change.
>
> Better write this insn in an explicit way (see for example
> tls_initial_exec_64_sun). Something like:
>
> (define_insn "move_size_reloc_<mode>"
> [(set (match_operand:SWI48 0 "register_operand" "=r")
> (unspec:SWI48
> [(match_operand 1 "symbolic_operand" "..." )]
> UNSPEC_SIZEOF))]
> ""
> "mov{<imodesuffix>}\t{%a1@SIZE, %0|%0, %a1@SIZE}")
>
> You will probably need to define new operand 1 predicate and constraint.
>
> Uros.
Hi, Uros! Thanks for comments! Here is what I got trying to follow your
suggestion. Does it look better?
Thanks,
Ilya
--
2013-11-19 Ilya Enkovich <[email protected]>
* config/i386/i386.md (UNSPEC_SIZEOF): New.
(move_size_reloc_<mode>): New.
* gcc/config/i386/constraints.md (TS): New.
* config/i386/predicates.md (symbol_operand): New.
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
index 7289ae4..1697065 100644
--- a/gcc/config/i386/constraints.md
+++ b/gcc/config/i386/constraints.md
@@ -241,6 +241,7 @@
;; s - address with no segment register
;; i - address with no index and no rip
;; b - address with no base and no rip
+;; S - symbol reference
(define_address_constraint "Tv"
"VSIB address operand"
@@ -257,3 +258,7 @@
(define_address_constraint "Tb"
"MPX address operand without base"
(match_operand 0 "address_mpx_no_base_operand"))
+
+(define_address_constraint "TS"
+ "Symbol reference"
+ (match_operand 0 "symbol_operand"))
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e23b3b6..dc7d81a 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -79,6 +79,7 @@
UNSPEC_PLTOFF
UNSPEC_MACHOPIC_OFFSET
UNSPEC_PCREL
+ UNSPEC_SIZEOF
;; Prologue support
UNSPEC_STACK_ALLOC
@@ -18446,6 +18447,14 @@
"bndstx\t{%2, %3|%3, %2}"
[(set_attr "type" "mpxst")])
+(define_insn "move_size_reloc_<mode>"
+ [(set (match_operand:SWI48 0 "register_operand" "=r")
+ (unspec:<MODE>
+ [(match_operand:<MODE> 1 "symbol_operand" "TS")]
+ UNSPEC_SIZEOF))]
+ ""
+ "mov{<imodesuffix>}\t{$%p1@SIZE, %0|%0, $%p1@SIZE}")
+
(include "mmx.md")
(include "sse.md")
(include "sync.md")
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 66ac52f..5c758ab 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -119,6 +119,10 @@
(match_test "TARGET_64BIT")
(match_test "REGNO (op) > BX_REG")))
+;; Return true if VALUE is symbol reference
+(define_predicate "symbol_operand"
+ (match_code "symbol_ref"))
+
;; Return true if VALUE can be stored in a sign extended immediate field.
(define_predicate "x86_64_immediate_operand"
(match_code "const_int,symbol_ref,label_ref,const")