public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Help with another constraint
@ 2007-12-09 13:07 Balaji V. Iyer
  2007-12-09 14:28 ` Rask Ingemann Lambertsen
  0 siblings, 1 reply; 14+ messages in thread
From: Balaji V. Iyer @ 2007-12-09 13:07 UTC (permalink / raw)
  To: gcc, openrisc

Hello Everyone,
    I am trying to partition register files in GCC port of Opencores
(OPENRISC 1000). It is currently failing the following constraint in
negdi2
 
(insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
                (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
        (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2} (nil)
    (nil))
../../gcc-4.0.2/gcc/libgcc2.c:72: internal compiler error: in
final_scan_insn, at final.c:2439
Please submit a full bug report,

 
REGISTER R2 is the frame pointer!!
 
I think this is because of the way I am handling the frame
pointer...This is how I do it in the or32.h file



#define FRAME_POINTER_REGNUM 2
#define FRAME_POINTER_REQUIRED 0
 
#define INITIAL_FRAME_POINTER_OFFSET(DEPTH)
\
{ int regno;
\
  int offset = 0;
\
  for( regno=0; regno < FIRST_PSEUDO_REGISTER;  regno++ )
\
    if( regs_ever_live[regno] && !call_used_regs[regno] )
\
      offset += 4;
\
  (DEPTH) = (!current_function_is_leaf || regs_ever_live[LINK_REGNUM] ?
4 : 0)  +       \
                (frame_pointer_needed ? 4 : 0)
+       \
                offset
+       \
                OR32_ALIGN(current_function_outgoing_args_size,4)
+       \
                OR32_ALIGN(get_frame_size(),4);
\
}

 
#define FIX_FRAME_POINTER_ADDRESS(ADDR,DEPTH) \
{ int offset = -1;
\
  rtx regs = stack_pointer_rtx;
\
  if (ADDR == frame_pointer_rtx)
\
    offset = 0;
\
  else if (GET_CODE (ADDR) == PLUS && XEXP (ADDR, 1) ==
frame_pointer_rtx \
           && GET_CODE (XEXP (ADDR, 0)) == CONST_INT)
\
    offset = INTVAL (XEXP (ADDR, 0));
\
  else if (GET_CODE (ADDR) == PLUS && XEXP (ADDR, 0) ==
frame_pointer_rtx \
           && GET_CODE (XEXP (ADDR, 1)) == CONST_INT)
\
    offset = INTVAL (XEXP (ADDR, 1));
\
  else if (GET_CODE (ADDR) == PLUS && XEXP (ADDR, 0) ==
frame_pointer_rtx) \
    { rtx other_reg = XEXP (ADDR, 1);
\
      offset = 0;
\
      regs = gen_rtx (PLUS, Pmode, stack_pointer_rtx, other_reg); }
\
  else if (GET_CODE (ADDR) == PLUS && XEXP (ADDR, 1) ==
frame_pointer_rtx) \
    { rtx other_reg = XEXP (ADDR, 0);
\
      offset = 0;
\
      regs = gen_rtx (PLUS, Pmode, stack_pointer_rtx, other_reg); }
\
  if (offset >= 0)
\
    { int regno;
\
      extern char call_used_regs[];
\
      offset += 4; /* I don't know why??? */
\
      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
\
        if (regs_ever_live[regno] && ! call_used_regs[regno])
\
          offset += 4;
\
      ADDR = plus_constant (regs, offset + (DEPTH)); } }
 

 
 
 
 
What am I doing wrong??
 
 
ANy help is highly highly appreciated!
 
Yours Sincerely,
 
Balaji V. Iyer.
 
 
 
 
-- 
 
Balaji V. Iyer
PhD Student, 
Center for Efficient, Scalable and Reliable Computing,
Department of Electrical and Computer Engineering,
North Carolina State University.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Help with another constraint
  2007-12-09 13:07 Help with another constraint Balaji V. Iyer
@ 2007-12-09 14:28 ` Rask Ingemann Lambertsen
  2007-12-09 22:06   ` Balaji V. Iyer
  0 siblings, 1 reply; 14+ messages in thread
From: Rask Ingemann Lambertsen @ 2007-12-09 14:28 UTC (permalink / raw)
  To: Balaji V. Iyer; +Cc: gcc, openrisc

On Sun, Dec 09, 2007 at 03:55:36AM -0500, Balaji V. Iyer wrote:
> Hello Everyone,
>     I am trying to partition register files in GCC port of Opencores
> (OPENRISC 1000). It is currently failing the following constraint in
> negdi2
>  
> (insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
		       ^^^
>                 (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
>         (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2} (nil)
>     (nil))
> ../../gcc-4.0.2/gcc/libgcc2.c:72: internal compiler error: in
> final_scan_insn, at final.c:2439
> Please submit a full bug report,

+(define_insn "negsi2"
+  [(set (match_operand:SI 0 "register_operand" "=r")
			      ^^^^^^^^^^^^^^^^
+       (neg:SI (match_operand:SI 1 "register_operand" "r")))]
+  ""
+  "l.sub   \t%0,r0,%1"
+  [(set_attr "type" "add")
+   (set_attr "length" "1")])

   How did that happen? Look at the dump files. Btw, what is the error
message above the insn dump?

-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-09 14:28 ` Rask Ingemann Lambertsen
@ 2007-12-09 22:06   ` Balaji V. Iyer
  2007-12-10 17:31     ` 'Rask Ingemann Lambertsen'
  0 siblings, 1 reply; 14+ messages in thread
From: Balaji V. Iyer @ 2007-12-09 22:06 UTC (permalink / raw)
  To: 'Rask Ingemann Lambertsen'; +Cc: gcc, openrisc

Hello Rask,
	I am not understanding your response, can you clarify it for me?

As per the question  about the error message above?

../../gcc-4.0.2/gcc/libgcc2.c -o libgcc/./_negdi2.o
../../gcc-4.0.2/gcc/libgcc2.c: In function '__negdi2':
../../gcc-4.0.2/gcc/libgcc2.c:72: error: insn does not satisfy its
constraints:
(insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
                (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
        (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2} (nil)
    (nil))
../../gcc-4.0.2/gcc/libgcc2.c:72: internal compiler error: in
final_scan_insn, at final.c:2439
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc/./_negdi2.o] Error 1
make[2]: Leaving directory 



-Balaji V. Iyer.


-- 
 
Balaji V. Iyer
PhD Student, 
Center for Efficient, Scalable and Reliable Computing,
Department of Electrical and Computer Engineering,
North Carolina State University.


-----Original Message-----
From: Rask Ingemann Lambertsen [mailto:rask@sygehus.dk] 
Sent: Sunday, December 09, 2007 8:08 AM
To: Balaji V. Iyer
Cc: gcc@gcc.gnu.org; openrisc@opencores.org
Subject: Re: Help with another constraint

On Sun, Dec 09, 2007 at 03:55:36AM -0500, Balaji V. Iyer wrote:
> Hello Everyone,
>     I am trying to partition register files in GCC port of Opencores 
> (OPENRISC 1000). It is currently failing the following constraint in
> negdi2
>  
> (insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
		       ^^^
>                 (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
>         (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2}
(nil)
>     (nil))
> ../../gcc-4.0.2/gcc/libgcc2.c:72: internal compiler error: in 
> final_scan_insn, at final.c:2439 Please submit a full bug report,

+(define_insn "negsi2"
+  [(set (match_operand:SI 0 "register_operand" "=r")
			      ^^^^^^^^^^^^^^^^
+       (neg:SI (match_operand:SI 1 "register_operand" "r")))]  ""
+  "l.sub   \t%0,r0,%1"
+  [(set_attr "type" "add")
+   (set_attr "length" "1")])

   How did that happen? Look at the dump files. Btw, what is the error
message above the insn dump?

--
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a
year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Help with another constraint
  2007-12-09 22:06   ` Balaji V. Iyer
@ 2007-12-10 17:31     ` 'Rask Ingemann Lambertsen'
  2007-12-12  5:13       ` Balaji V. Iyer
  0 siblings, 1 reply; 14+ messages in thread
From: 'Rask Ingemann Lambertsen' @ 2007-12-10 17:31 UTC (permalink / raw)
  To: Balaji V. Iyer; +Cc: gcc, openrisc

On Sun, Dec 09, 2007 at 11:35:32AM -0500, Balaji V. Iyer wrote:
> Hello Rask,
> 	I am not understanding your response, can you clarify it for me?
> 
> As per the question  about the error message above?
> 
> ../../gcc-4.0.2/gcc/libgcc2.c -o libgcc/./_negdi2.o
> ../../gcc-4.0.2/gcc/libgcc2.c: In function '__negdi2':
> ../../gcc-4.0.2/gcc/libgcc2.c:72: error: insn does not satisfy its
> constraints:

   I think this is misleading you. It seems likely that the problem is with
the predicate and not the constraint.

> (insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
                       ^^^

   This has to be a register, doesn't it? If so, use -fdump-rtl-all and look
at the dump files to see where it goes wrong.

>                 (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
>         (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2} (nil)
>     (nil))

   Please also post your negsi2 pattern.

-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-10 17:31     ` 'Rask Ingemann Lambertsen'
@ 2007-12-12  5:13       ` Balaji V. Iyer
  2007-12-12 12:53         ` Revital1 Eres
  2007-12-12 15:21         ` 'Rask Ingemann Lambertsen'
  0 siblings, 2 replies; 14+ messages in thread
From: Balaji V. Iyer @ 2007-12-12  5:13 UTC (permalink / raw)
  To: 'Rask Ingemann Lambertsen'; +Cc: gcc, openrisc

Hello Everyone,
    I got past that negdi2 and some errors..now I am trying to compile
some linux module, and it says I am not able to find this constraint:

init/main.c: In function 'start_kernel':
init/main.c:441: error: insn does not satisfy its constraints:
(insn 112 110 478 12 (set (mem:QI (reg/v/f:SI 16 r16 [orig:72 line.183 ]
[72]) [0 S1 A8])
        (const_int 0 [0x0])) 16 {movqi} (nil)
    (nil))
init/main.c:441: internal compiler error: in
reload_cse_simplify_operands, at postreload.c:391
Please submit a full bug report,

Here is what I have for movqi:

(define_insn "movqi"
  [(set (match_operand:QI 0 "nonimmediate_operand" "=p,q,m,m,p,q,p,q")
        (match_operand:QI 1 "general_operand"       "m,m,p,q,p,q,I,I"))]
  ""
  "*
  switch(which_alternative)
   {
     case 0:
     case 1:
       return \"l.lbz   \\t%0,%1\";
     case 2:
     case 3:
       return \"l.sb    \\t%0,%1\";
     case 4:
     case 5:
       return \"l.ori   \\t%0,%1,0\\t # move reg to reg\";
     case 6:
     case 7:
       return \"l.addi  \\t%0,r0,%1\\t # move immediate\";
     default:
       return \"invalid alternative\";
   }
  "

To give a quick explanation: 
p = register numbers between 0-31 (inclusive)
q = register numbers between 32-63 (inclusive)

I = constant int value: ((VALUE) >=-32768 && (VALUE) <=32767)

So, what am I missing?

Any help is highly appreciated!
 

Thanking You,

Yours Sincerely,

Balaji V. Iyer.


-- 
 
Balaji V. Iyer
PhD Student, 
Center for Efficient, Scalable and Reliable Computing,
Department of Electrical and Computer Engineering,
North Carolina State University.


-----Original Message-----
From: 'Rask Ingemann Lambertsen' [mailto:rask@sygehus.dk] 
Sent: Monday, December 10, 2007 12:16 PM
To: Balaji V. Iyer
Cc: gcc@gcc.gnu.org; openrisc@opencores.org
Subject: Re: Help with another constraint

On Sun, Dec 09, 2007 at 11:35:32AM -0500, Balaji V. Iyer wrote:
> Hello Rask,
> 	I am not understanding your response, can you clarify it for me?
> 
> As per the question  about the error message above?
> 
> ../../gcc-4.0.2/gcc/libgcc2.c -o libgcc/./_negdi2.o
> ../../gcc-4.0.2/gcc/libgcc2.c: In function '__negdi2':
> ../../gcc-4.0.2/gcc/libgcc2.c:72: error: insn does not satisfy its
> constraints:

   I think this is misleading you. It seems likely that the problem is
with the predicate and not the constraint.

> (insn 15 13 16 (set (mem:SI (plus:SI (reg/f:SI 2 r2)
                       ^^^

   This has to be a register, doesn't it? If so, use -fdump-rtl-all and
look at the dump files to see where it goes wrong.

>                 (const_int -28 [0xffffffe4])) [0 D.1256+0 S4 A32])
>         (neg:SI (reg:SI 3 r3 [orig:80 D.1255 ] [80]))) 38 {negsi2}
(nil)
>     (nil))

   Please also post your negsi2 pattern.

--
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a
year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-12  5:13       ` Balaji V. Iyer
@ 2007-12-12 12:53         ` Revital1 Eres
  2007-12-12 13:01           ` Balaji V. Iyer
  2007-12-12 14:35           ` Dave Korn
  2007-12-12 15:21         ` 'Rask Ingemann Lambertsen'
  1 sibling, 2 replies; 14+ messages in thread
From: Revital1 Eres @ 2007-12-12 12:53 UTC (permalink / raw)
  To: Balaji V. Iyer; +Cc: gcc, openrisc, 'Rask Ingemann Lambertsen'

Hello,

I think you should add the pair of constraints m and I respectively to
the description of the instruction in your md file (and a relevant
case 8 to handle such instruction), i.e.:

 (define_insn "movqi"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=p,q,m,m,p,q,p,q")
-        (match_operand:QI 1 "general_operand"       "m,m,p,q,p,q,I,I"))]
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=p,q,m,m,p,q,p,q,m")
+        (match_operand:QI 1 "general_operand"       "m,m,p,q,p,q,I,I,I"))]
   ""
   "*
   switch(which_alternative)
@@ -17,6 +17,8 @@
      case 6:
      case 7:
        return \"l.addi  \\t%0,r0,%1\\t # move immediate\";,
+     case 8:
+       return ...;
      default:
        return \"invalid alternative\";
    }

It seems that the pair m and I is missing (which indicate the memory =
constant instruction).  You could look for which_alternative variable
in GCC internals for more details on this.

Revital


^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-12 12:53         ` Revital1 Eres
@ 2007-12-12 13:01           ` Balaji V. Iyer
  2007-12-12 14:35           ` Dave Korn
  1 sibling, 0 replies; 14+ messages in thread
From: Balaji V. Iyer @ 2007-12-12 13:01 UTC (permalink / raw)
  To: 'Revital1 Eres'; +Cc: gcc, openrisc

Hi Revital1,
	 Thank you very much for your help. The ISA I am using
(OpenRISC) does not provide an alternative for moving a constant into
memory. The only way of doing this is to move the constant into a
register (which i am doing) and then move that register value into
memory. So what can I do in that case?

Thanks,

Baljai V. Iyer.


-- 
 
Balaji V. Iyer
PhD Student, 
Center for Efficient, Scalable and Reliable Computing,
Department of Electrical and Computer Engineering,
North Carolina State University.


-----Original Message-----
From: Revital1 Eres [mailto:ERES@il.ibm.com] 
Sent: Wednesday, December 12, 2007 7:14 AM
To: Balaji V. Iyer
Cc: gcc@gcc.gnu.org; openrisc@opencores.org; 'Rask Ingemann Lambertsen'
Subject: RE: Help with another constraint

Hello,

I think you should add the pair of constraints m and I respectively to
the description of the instruction in your md file (and a relevant case
8 to handle such instruction), i.e.:

 (define_insn "movqi"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=p,q,m,m,p,q,p,q")
-        (match_operand:QI 1 "general_operand"
"m,m,p,q,p,q,I,I"))]
+  [(set (match_operand:QI 0 "nonimmediate_operand"
"=p,q,m,m,p,q,p,q,m")
+        (match_operand:QI 1 "general_operand"
"m,m,p,q,p,q,I,I,I"))]
   ""
   "*
   switch(which_alternative)
@@ -17,6 +17,8 @@
      case 6:
      case 7:
        return \"l.addi  \\t%0,r0,%1\\t # move immediate\";,
+     case 8:
+       return ...;
      default:
        return \"invalid alternative\";
    }

It seems that the pair m and I is missing (which indicate the memory =
constant instruction).  You could look for which_alternative variable in
GCC internals for more details on this.

Revital



^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-12 12:53         ` Revital1 Eres
  2007-12-12 13:01           ` Balaji V. Iyer
@ 2007-12-12 14:35           ` Dave Korn
  2007-12-12 17:50             ` Rask Ingemann Lambertsen
  2007-12-16 14:24             ` Hans-Peter Nilsson
  1 sibling, 2 replies; 14+ messages in thread
From: Dave Korn @ 2007-12-12 14:35 UTC (permalink / raw)
  To: 'Revital1 Eres', 'Balaji V. Iyer'
  Cc: gcc, openrisc, 'Rask Ingemann Lambertsen'

On 12 December 2007 12:14, Revital1 Eres wrote:

> It seems that the pair m and I is missing (which indicate the memory =
> constant instruction).  

  So doesn't the question then become "Why isn't reload reloading the constant
into a register"?


    cheers,
      DaveK
-- 
Can't think of a witty .sigline today....

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Help with another constraint
  2007-12-12  5:13       ` Balaji V. Iyer
  2007-12-12 12:53         ` Revital1 Eres
@ 2007-12-12 15:21         ` 'Rask Ingemann Lambertsen'
  2007-12-17 18:38           ` Rask Ingemann Lambertsen
  1 sibling, 1 reply; 14+ messages in thread
From: 'Rask Ingemann Lambertsen' @ 2007-12-12 15:21 UTC (permalink / raw)
  To: Balaji V. Iyer; +Cc: gcc, openrisc

On Wed, Dec 12, 2007 at 12:06:04AM -0500, Balaji V. Iyer wrote:
> Hello Everyone,
>     I got past that negdi2 and some errors..now I am trying to compile
> some linux module, and it says I am not able to find this constraint:
> 
> init/main.c: In function 'start_kernel':
> init/main.c:441: error: insn does not satisfy its constraints:
> (insn 112 110 478 12 (set (mem:QI (reg/v/f:SI 16 r16 [orig:72 line.183 ]
> [72]) [0 S1 A8])
>         (const_int 0 [0x0])) 16 {movqi} (nil)
>     (nil))
> init/main.c:441: internal compiler error: in
> reload_cse_simplify_operands, at postreload.c:391
> Please submit a full bug report,
> 
> Here is what I have for movqi:

   The movxx patterns are special and you'll need to hold the compiler's
hands a little. Since your target can't move immediates directly to memory,
you have to ask for a secondary reload to an intermediate register. Use the
target hook TARGET_SECONDARY_RELOAD.

   When you've got the secondary reloads working, you can likely improve
code quality:

1) Use a movqi expander to expand the instructions correctly to begin with.
For example, if operand 0 is in memory and operand 1 is an immediate, use

	operands[1] = force_reg (QImode, operands[1]);

Rename the "movqi" insn to "*movqi".

> (define_insn "movqi"
>   [(set (match_operand:QI 0 "nonimmediate_operand" "=p,q,m,m,p,q,p,q")
>         (match_operand:QI 1 "general_operand"       "m,m,p,q,p,q,I,I"))]
>   ""
    ^^
2) Reject operand combinations that aren't supported, such as operand 0
being in memory and operand 1 being an immediate.

   You can look at other RISC targets (e.g. ARM, PA-RISC, MIPS, SPARC, Alpha
or RS6000) for examples.

>   "*

   New ports should not use the old-style "* ... " C-blocks. Use { ... } as
documented. Then you'll also avoid the \" and \\ sequences.

>   switch(which_alternative)
>    {
>      case 0:
>      case 1:
>        return \"l.lbz   \\t%0,%1\";
>      case 2:
>      case 3:
>        return \"l.sb    \\t%0,%1\";
>      case 4:
>      case 5:
>        return \"l.ori   \\t%0,%1,0\\t # move reg to reg\";
>      case 6:
>      case 7:
>        return \"l.addi  \\t%0,r0,%1\\t # move immediate\";
>      default:
>        return \"invalid alternative\";
>    }

   Presumably you've temporarily coded it this way for debugging purposes.
If not, use the normal way:

   "@
    l.lbz ...
    l.sb ...
    ..."

> To give a quick explanation: 
> p = register numbers between 0-31 (inclusive)
> q = register numbers between 32-63 (inclusive)

   You use them in pairs a lot. Define a register class which consists of
registers 0-64 and use that in your constraints.
 
-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Help with another constraint
  2007-12-12 14:35           ` Dave Korn
@ 2007-12-12 17:50             ` Rask Ingemann Lambertsen
  2007-12-16 14:24             ` Hans-Peter Nilsson
  1 sibling, 0 replies; 14+ messages in thread
From: Rask Ingemann Lambertsen @ 2007-12-12 17:50 UTC (permalink / raw)
  To: Dave Korn
  Cc: 'Revital1 Eres', 'Balaji V. Iyer', gcc, openrisc

On Wed, Dec 12, 2007 at 01:01:00PM -0000, Dave Korn wrote:
> On 12 December 2007 12:14, Revital1 Eres wrote:
> 
> > It seems that the pair m and I is missing (which indicate the memory =
> > constant instruction).  
> 
>   So doesn't the question then become "Why isn't reload reloading the constant
> into a register"?

   One possibility is that reload is not run on insns produced by reload
itself. Other usual suspects are post-reload splitters and peepholes.

-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-12 14:35           ` Dave Korn
  2007-12-12 17:50             ` Rask Ingemann Lambertsen
@ 2007-12-16 14:24             ` Hans-Peter Nilsson
  2007-12-16 17:18               ` Hans-Peter Nilsson
  1 sibling, 1 reply; 14+ messages in thread
From: Hans-Peter Nilsson @ 2007-12-16 14:24 UTC (permalink / raw)
  To: Dave Korn
  Cc: 'Revital1 Eres', 'Balaji V. Iyer',
	gcc, openrisc, 'Rask Ingemann Lambertsen'

On Wed, 12 Dec 2007, Dave Korn wrote:

> On 12 December 2007 12:14, Revital1 Eres wrote:
>
> > It seems that the pair m and I is missing (which indicate the memory =
> > constant instruction).
>
>   So doesn't the question then become "Why isn't reload reloading the constant
> into a register"?

Yes.  And the answer AFAIK is "because it doesn't see a way to
move a constant into a register; it understands "r", not "p" and
"q".

So bviyer, add an "r" alternative.  See also the "*" and "#"
qualifiers.  No need for bogus 0 -to- memory alternatives.

brgds, H-P

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-16 14:24             ` Hans-Peter Nilsson
@ 2007-12-16 17:18               ` Hans-Peter Nilsson
  0 siblings, 0 replies; 14+ messages in thread
From: Hans-Peter Nilsson @ 2007-12-16 17:18 UTC (permalink / raw)
  To: 'Balaji V. Iyer'; +Cc: gcc, openrisc

On Sun, 16 Dec 2007, Hans-Peter Nilsson wrote:
> On Wed, 12 Dec 2007, Dave Korn wrote:
>
> > On 12 December 2007 12:14, Revital1 Eres wrote:
> >
> > > It seems that the pair m and I is missing (which indicate the memory =
> > > constant instruction).
> >
> >   So doesn't the question then become "Why isn't reload reloading the constant
> > into a register"?
>
> Yes.  And the answer AFAIK is "because it doesn't see a way to
> move a constant into a register; it understands "r", not "p" and
> "q".

I think I have to correct myself; register allocation and reload
*should* understand p and q as register constraints, given e.g.
a correct REG_CLASS_FROM_LETTER definition and correct regclass
macros.  The latter were not disclosed and are usually a source
of hard-to-find errors.

Besides, if you can't directly move between p and q (as your
constraints indicate) then as Rask says, you also need to tell
GCC through the secondary-reload mechanisms.

I can't help but thinking the best suggetion is for bviyer to
let gdb answer the question by stepping through cc1 instead of
relying on indirect debugging.  That's what people do. ;)

brgds, H-P

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Help with another constraint
  2007-12-12 15:21         ` 'Rask Ingemann Lambertsen'
@ 2007-12-17 18:38           ` Rask Ingemann Lambertsen
  2007-12-17 20:31             ` Balaji V. Iyer
  0 siblings, 1 reply; 14+ messages in thread
From: Rask Ingemann Lambertsen @ 2007-12-17 18:38 UTC (permalink / raw)
  To: Balaji V. Iyer; +Cc: gcc, openrisc

On Wed, Dec 12, 2007 at 03:35:09PM +0100, 'Rask Ingemann Lambertsen' wrote:
> 
>    The movxx patterns are special and you'll need to hold the compiler's
> hands a little. Since your target can't move immediates directly to memory,
> you have to ask for a secondary reload to an intermediate register. Use the
> target hook TARGET_SECONDARY_RELOAD.

   Actually, how do you do that? I can't see any place in the documentation
that says how TARGET_SECONDARY_RELOAD can be used for that purpose.

-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: Help with another constraint
  2007-12-17 18:38           ` Rask Ingemann Lambertsen
@ 2007-12-17 20:31             ` Balaji V. Iyer
  0 siblings, 0 replies; 14+ messages in thread
From: Balaji V. Iyer @ 2007-12-17 20:31 UTC (permalink / raw)
  To: 'Rask Ingemann Lambertsen'; +Cc: gcc

Hi Rask,
	First, Thank you very much for all help you have provided me. It
really help me finish my project.

This is what I did:

I capture all the moves regardless of the operand and then to move an
immediate into a regiser, I force a register:

here is the code for this:


      if (!no_new_pseudos)
        { 
          /* taking care of moving constant integers */
          if (GET_CODE (operands[1]) == CONST_INT)
            {
              rtx reg = gen_reg_rtx (SImode);

              emit_insn (gen_movsi (reg, operands[1]));
              operands[1] = gen_lowpart (QImode, reg);
            }
           /* moving memory operands */
          if (GET_CODE (operands[1]) == MEM)
            {
              rtx reg = gen_reg_rtx (SImode);

              emit_insn (gen_rtx_SET (SImode, reg,
                                  gen_rtx_ZERO_EXTEND (SImode,
                                                       operands[1])));

              operands[1] = gen_lowpart (QImode, reg);
            }
           /* moving register operands */
          if (GET_CODE (operands[0]) != REG)
            operands[1] = force_reg (QImode, operands[1]);
        }

I hope this helps.

-Balaji V. Iyer.

-- 
 
Balaji V. Iyer
PhD Student, 
Center for Efficient, Scalable and Reliable Computing,
Department of Electrical and Computer Engineering,
North Carolina State University.


-----Original Message-----
From: Rask Ingemann Lambertsen [mailto:rask@sygehus.dk] 
Sent: Monday, December 17, 2007 1:33 PM
To: Balaji V. Iyer
Cc: gcc@gcc.gnu.org; openrisc@opencores.org
Subject: Re: Help with another constraint

On Wed, Dec 12, 2007 at 03:35:09PM +0100, 'Rask Ingemann Lambertsen'
wrote:
> 
>    The movxx patterns are special and you'll need to hold the 
> compiler's hands a little. Since your target can't move immediates 
> directly to memory, you have to ask for a secondary reload to an 
> intermediate register. Use the target hook TARGET_SECONDARY_RELOAD.

   Actually, how do you do that? I can't see any place in the
documentation that says how TARGET_SECONDARY_RELOAD can be used for that
purpose.

--
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a
year

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2007-12-17 18:38 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-12-09 13:07 Help with another constraint Balaji V. Iyer
2007-12-09 14:28 ` Rask Ingemann Lambertsen
2007-12-09 22:06   ` Balaji V. Iyer
2007-12-10 17:31     ` 'Rask Ingemann Lambertsen'
2007-12-12  5:13       ` Balaji V. Iyer
2007-12-12 12:53         ` Revital1 Eres
2007-12-12 13:01           ` Balaji V. Iyer
2007-12-12 14:35           ` Dave Korn
2007-12-12 17:50             ` Rask Ingemann Lambertsen
2007-12-16 14:24             ` Hans-Peter Nilsson
2007-12-16 17:18               ` Hans-Peter Nilsson
2007-12-12 15:21         ` 'Rask Ingemann Lambertsen'
2007-12-17 18:38           ` Rask Ingemann Lambertsen
2007-12-17 20:31             ` Balaji V. Iyer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).