Hello! A sse function that gets its parameters via xmm regs and returns its result in xmm reg is defined as:
__m128 func_sse (__m128 x, __m128 y) { __m128 xmm; xmm = _mm_add_ss (x, y); return xmm; } The RTL code that is used to call this function is produced as: (call_insn/u:HI 30 29 31 0 (set (reg:V4SF 21 xmm0) (call (mem:QI (symbol_ref:SI ("func_sse") [flags 0x3] <function_decl 0x403cd948 func_sse>) [0 S1 A8]) (const_int 0 [0x0]))) 529 {*call_value_0} (insn_list:REG_DEP_TRUE 28 (insn_list:REG_DEP_TRUE 29 (nil))) (insn_list:REG_RETVAL 28 (expr_list:REG_DEAD (reg:V4SF 22 xmm1 [ xmm1 ]) (expr_list:REG_EH_REGION (const_int -1 [0xffffffff]) (nil)))) (expr_list:REG_DEP_TRUE (use (reg:V4SF 21 xmm0 [ xmm0 ])) (expr_list:REG_DEP_TRUE (use (reg:V4SF 22 xmm1 [ xmm1 ])) (nil)))) To implement a LCM pass to switch FPU between MMX and x87 mode (the example above is a call to SSE function, currently the call to MMX function is wrong, see PR21981), the type of registers, used to pass parameters is needed for MODE_NEEDED macro to insert correct mode for the call - that is FPU_MODE_MMX if there are MMX registers used and FPU_MODE_X87 otherwise: if (entity == I387_FPU_MODE) { if (CALL_P (insn)) { if ("mmx registers are used") <<< here we should check for MMX regs return FPU_MODE_MMX; else return FPU_MODE_X87; } mode = get_attr_unit (insn); return (mode == UNIT_I387) ? FPU_MODE_X87 : (mode == UNIT_MMX) ? FPU_MODE_MMX : FPU_MODE_ANY; } Secondly, if return value is placed in MMX regsister, MODE_AFTER after call insn should set mode state to FPU_MODE_MMX, otherwise to FPU_MODE_X87. To properly implement this switching scheme, I would like to ask, what is the proper way to check if MMX register is used as a parameter passing register in the call, and how to check if MMX register is used to hold return value. This information is needed to properly calculate MODE_NEEDED and MODE_AFTER values for function call in LCM pass. In the function itself, we can handle entry and exit mode using MODE_ENTRY and MODE_EXIT macros. Entry mode would be set to FPU_MODE_MMX if MMX registers are used for parameter passing and exit mode would be set to FPU_MODE_MMX if MMX reg is used to hold return value. Otherwise, they would both be set to FPU_MODE_X87. I would like to obtain the same information in function itself to properly set MODE_ENTRY and MODE_EXIT in LCM pass. Is there an recommended approach on how to get this information? Thanks in advance, Uros.