may be you can grep for all occurences of "mtype == MTYPE_C4" in wgen
and see if there is still other places needed fixing.
Yes, since the C8, c10 are now first class citizens, mmiload is not
appropriate (only for user defined types)
Sun

On Wed, Sep 8, 2010 at 7:25 AM, Min Zhao <mzhao...@gmail.com> wrote:
> Hi,
>
> Could a gatekeeper please review my fix for bug 593?
> https://bugs.open64.net/show_bug.cgi?id=593
> Here is the example for the failing case:
>
> 1. _Complex long double cd = 234.0L + 0x0.abcp-70L + 567.0Li +0x0defp-70Li;
>
> 2. void complexlongdouble_i_fv (int n, ...) {
>
> 3. __builtin_va_list ap;
>
> 4.__builtin_va_start (ap, n);
>
> 5. if (__builtin_va_arg (ap, _Complex long double) != cd)
>
> 6. abort ();
>
> 7.__builtin_va_end (ap); }
>
>
>
> The IR that wgen generated for the condition at line 5 is as:
>
>      U8LDA 0 <2,2,ap> T<69,anon_ptr.,8>
>
>     U8U8ILOAD 8 T<9,.predef_U8,8> T<67,anon_ptr.,8>
>
>    MMILOAD -32 T<23,.predef_C10,16> T<98,anon_ptr.,8>
>
>    C10C10LDID 0 <1,77,cd> T<23,.predef_C10,16>
>
>   I4C10NE
>
>
>
> This is not right. The correct IR should be like:
>      ...
>
>       U8U8LDID 0 <2,4,_temp_.va_arg5> T<98,anon_ptr.,8>
>
>    C10C10ILOAD 0 T<23,.predef_C10,16> T<98,anon_ptr.,8>
>
>    C10C10LDID 0 <1,77,cd> T<23,.predef_C10,16>
>
>   I4C10NE
>
> (where: _temp_.va_arg5 saves ap)
>
> The problem turns out that (in wgen_expr.cxx) the GS_VA_ARG_EXPR handling
> only considers MTYPE_C4, not MTYPE_C8 or MTYPE_C10. My fix is to include
> them.
>
>
> Thanks,
>
> Min
>
>
> Since my patch is simple, I just show it here, instead of attachment:
>
>
>
> Index: wgen_expr.cxx
>
> ===================================================================
>
> --- wgen_expr.cxx       (revision 3335)
>
> +++ wgen_expr.cxx       (working copy)
>
> @@ -9901,10 +9901,12 @@
>
>             wn = WN_CreateIload(OPR_ILOAD, Widen_Mtype (mtype), mtype, 0,
>
>                                 ty_idx, Make_Pointer_Type(ty_idx), wn);
>
>           }
>
> -         else if (mtype == MTYPE_C4) {
>
> -           wn = WGEN_x8664_va_arg(ap_wn, MTYPE_float(mtype), ty_idx,
> FALSE);
>
> -           wn = WN_CreateIload(OPR_ILOAD, MTYPE_C4, MTYPE_C4, 0, ty_idx,
>
> -                               Make_Pointer_Type(ty_idx), wn);
>
> +      else if (MTYPE_is_complex(mtype)) {
>
> +        Is_True((mtype == MTYPE_C4 || mtype == MTYPE_C8 || mtype ==
> MTYPE_C10),
>
> +            ("WGEN_Expand_Expr: unexpected complex type"));
>
> +        wn = WGEN_x8664_va_arg(ap_wn, MTYPE_float(mtype), ty_idx, FALSE);
>
> +        wn = WN_CreateIload(OPR_ILOAD, mtype, mtype, 0, ty_idx,
>
> +                Make_Pointer_Type(ty_idx), wn);
>
>           }
>
>           else {
>
>             enum X86_64_PARM_CLASS classes[MAX_CLASSES];
>
> ------------------------------------------------------------------------------
> This SF.net Dev2Dev email is sponsored by:
>
> Show off your parallel programming skills.
> Enter the Intel(R) Threading Challenge 2010.
> http://p.sf.net/sfu/intel-thread-sfd
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>

------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to