Segment registers support for i386

Rémy Saissy remy.saissy@gmail.com
Sun May 14 16:09:00 GMT 2006


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.


More information about the Gcc mailing list