diff options
-rw-r--r-- | src/lj_cparse.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index ddb2e1c9..5a4df556 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
@@ -851,18 +851,23 @@ static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl) | |||
851 | if (!(info & CTF_BOOL)) { | 851 | if (!(info & CTF_BOOL)) { |
852 | CTSize msize = ctype_msizeP(decl->attr); | 852 | CTSize msize = ctype_msizeP(decl->attr); |
853 | CTSize vsize = ctype_vsizeP(decl->attr); | 853 | CTSize vsize = ctype_vsizeP(decl->attr); |
854 | if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) | 854 | if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) { |
855 | CTSize malign = lj_fls(msize); | ||
856 | if (malign > 4) malign = 4; /* Limit alignment. */ | ||
857 | CTF_INSERT(info, ALIGN, malign); | ||
855 | size = msize; /* Override size via mode. */ | 858 | size = msize; /* Override size via mode. */ |
859 | } | ||
856 | if (vsize) { /* Vector size set? */ | 860 | if (vsize) { /* Vector size set? */ |
857 | CTSize esize = lj_fls(size); | 861 | CTSize esize = lj_fls(size); |
858 | if (vsize >= esize) { | 862 | if (vsize >= esize) { |
859 | /* Intern the element type first. */ | 863 | /* Intern the element type first. */ |
860 | id = lj_ctype_intern(cp->cts, info, size); | 864 | id = lj_ctype_intern(cp->cts, info, size); |
861 | /* Then create a vector (array) with vsize alignment. */ | 865 | /* Then create a vector (array) with vsize alignment. */ |
866 | size = (1u << vsize); | ||
867 | if (vsize > 4) vsize = 4; /* Limit alignment. */ | ||
862 | if (ctype_align(info) > vsize) vsize = ctype_align(info); | 868 | if (ctype_align(info) > vsize) vsize = ctype_align(info); |
863 | info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR + | 869 | info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR + |
864 | CTALIGN(vsize)); | 870 | CTALIGN(vsize)); |
865 | size = (1u << vsize); | ||
866 | } | 871 | } |
867 | } | 872 | } |
868 | } | 873 | } |