Hi All,

For the below code (test.c)

int foo()
{
  printf("Hello World");
}

On linux :
ccpc -mcpu=e6500 -mno-altivec -mabi=no-altivec -D_WRS_HARDWARE_FP
-mabi=elfv2 -mcmodel=med -mhard-float -S test.c

linux asm :
the constant string fetched like

 addis 3,2,.LC0@toc@ha
 addi 3,3,.LC0@toc@l

where offset  signed 32 bit used  relatively to  toc base  on linux as
expected  for the  medium code model .
and the relocation entry will be generated by gas  :
R_PPC64_TOC16_HA   and  R_PPC64_TOC16_LO

For Windows :

same command  and windows asm looks like

la 3,.LC0@toc(2)

where offset used  signed 16  bit used  relatively to  toc base  why it so ?.
and the relocation entry will be :
R_PPC64_TOC16  (signed 16 bit offset )

why this difference and when we greping the .md file and  we found
patterns (rs6000.md ) like

;; Largetoc support
(define_insn "*largetoc_high"
  [(set (match_operand:DI 0 "gpc_reg_operand" "=b*r")
        (high:DI
          (unspec [(match_operand:DI 1 "" "")
                   (match_operand:DI 2 "gpc_reg_operand" "b")]
                  UNSPEC_TOCREL)))]
   "TARGET_ELF && TARGET_CMODEL != CMODEL_SMALL"
   "addis %0,%2,%1@toc@ha")

(define_insn "*largetoc_high_aix<mode>"
  [(set (match_operand:P 0 "gpc_reg_operand" "=b*r")
        (high:P
          (unspec [(match_operand:P 1 "" "")
                   (match_operand:P 2 "gpc_reg_operand" "b")]
                  UNSPEC_TOCREL)))]
   "TARGET_XCOFF && TARGET_CMODEL != CMODEL_SMALL"
   "addis %0,%1@u(%2)")

the above patterns  answered the difference b/w windows and linux .

Questions to the expert  is that using the medium code model ,how we
can get the same linux semantics  on windows (without source code
changes) ?

or above distinguish patterns  for  a reason and which we are missing here  ?

Thank you and awaiting for any comments
~Umesh

Reply via email to