This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Segment registers support for i386
- From: "RÃmy Saissy" <remy dot saissy at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Date: Mon, 15 May 2006 00:09:00 +0800
- Subject: 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.