https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103275
--- Comment #11 from H.J. Lu <hjl.tools at gmail dot com> --- (In reply to Hongtao.liu from comment #10) > I'm working on a patch which adds a new memory constraint "Bk" which will > exclude TLS UNSPECs for mask register alternative. > > The UNSPEC i'm excluding is like below, any other UNSPEC needs to be added? > > bool > ix86_notls_memory (rtx mem) > { > gcc_assert (MEM_P (mem)); > > rtx addr = XEXP (mem, 0); > subrtx_var_iterator::array_type array; > FOR_EACH_SUBRTX_VAR (iter, array, addr, ALL) > { > rtx op = *iter; > if (GET_CODE (op) == UNSPEC) > switch (XINT (op, 1)) > { > case UNSPEC_GOTTPOFF: > case UNSPEC_GOTNTPOFF: > case UNSPEC_TP: > case UNSPEC_TLS_GD: > case UNSPEC_TLS_LD_BASE: > case UNSPEC_TLSDESC: > case UNSPEC_TLS_IE_SUN: This doesn't look right. For TARGET_64BIT, only kmovq foo@gottpoff(%rip), %k0 kmovq foo@tlsld(%rip), %k0 should be disallowed. For !TARGET_64BIT, only kmovd foo@gotntpoff(%eax), %k0 kmovd foo@tpoff(%eax), %k0 should be disallowed. > return false; > default: > break; > } > /* Should iter.skip_subrtxes (); > if there's no inner UNSPEC in addr???. */ > } > > return true; > }