This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Segment registers support for i386


Hi everybody,
I decided to split the modification in two parts:
- add an __asm__ () statement to control the value of
  the segment registers from an high level language;
  This __asm__ () statement is then used as follow:
   register short a __asm__ ("es");

   int main(int argc, char **argv)
    {
	short b;

	b = a;
	a = 0x2a;
	printf("old value: %x new value: %x\n", b, a);
	return (0);
    }

- add an __attribute__ ((__far__())) to allow pointers to
  choose their data segment.
  This __attribute__(()) statement is then used as follow:
	int	*gs_p __attribute__ ((__far__("gs"))) = 0x2a;

  int main(int argc, char **argv)
   {
	int	*fs_p __attribute__((__far__("fs"))) = 0x0;

	fs_p[1] = 10;
	gs_p[0] = fs_p[0];
	return (0);
   }

Presently I have a problem with the first part.
I have added the the entries for es,fs and gs at the end of
FIXED_REGISTERS under the value 1,1,1 and in
CALL_USED_REGISTERS with the value 1,1,1
I also add the entries at the end of REG_ALLOC_ORDER and in
both HI_REGISER_NAMES and ADDITIONAL_REGISTER_NAMES.
Because those registers are different, I have created a new
register class at the end of the reg_class enum and added
the relevant REG_CLASS_NAMES and REG_CLASS_CONTENTS entries.
At least, I added the 's' id in REG_CLASS_FROM_LETTER.

To manage the manipulation of the register class, I added entries in
the i386.md file.

;; get a value from a segment register.
(define_insn "store_seg"
 [(set (match_operand:SI 0 "nonimmediate_operand" "")
       (match_operand:SI 1 "general_operand" "s"))]
       ""
       "movl\t%1,%0")

;; set a value in a segment register.
(define_insn "load_seg"
 [(set (match_operand:SI 0 "general_operand" "=s")
       (match_operand:SI 1 "register_operand" ""))]
       ""
       "movl\t%1,%0")

I think I did everything needed to make it working but when I compile
gcc I get the following error:
../.././gcc/crtstuff.c:301: error: unable to generate reloads for:
(insn:HI 17 15 18 1 (set (reg:SI 0 ax [orig:62 p.25 ] [62])
       (mem/f/c/i:SI (symbol_ref:SI ("p.5512") [flags 0x2] <var_decl
0x3b01dc60 p>) [7 p+0 S4 A32])) 28 {store_seg} (nil)
   (nil))
../.././gcc/crtstuff.c:301: internal compiler error: in find_reloads,
at reload.c:3734
Please submit a full bug report,
[...]

This is the 4.1.0 version of the compiler.
If somebody can light me... Thanks.


-- RÃmy Saissy JabberID: remy.saissy@jabber.fr Web: http://remysaissy.free.fr "L'homme qui a le plus vÃcu n'est pas celui qui a comptà le plus d'annÃes, mais celui qui a le plus senti la vie." J.-J. Rousseau, Emile.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]