On 06/26/2018 05:52 AM, Alex Bennée wrote:
>> +#define DO_LDFF1(PART, FN, TYPEE, TYPEM, H) \
>> +static void do_sve_ldff1##PART(CPUARMState *env, void *vd, void *vg, \
>> + target_ulong addr, intptr_t oprsz, \
>> + bool first, uintptr_t ra) \
>> +{ \
>> + intptr_t i = 0; \
>> + do { \
>> + uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
>> + do { \
>> + TYPEM m = 0; \
>> + if (pg & 1) { \
>> + if (!first && \
>> + page_check_range(addr, sizeof(TYPEM), PAGE_READ)) { \
>> + record_fault(env, i, oprsz); \
>> + return; \
>> + } \
>> + m = FN(env, addr, ra); \
>> + first = false; \
>> + } \
>> + *(TYPEE *)(vd + H(i)) = m; \
>> + i += sizeof(TYPEE), pg >>= sizeof(TYPEE); \
>> + addr += sizeof(TYPEM); \
>> + } while (i & 15); \
>> + } while (i < oprsz); \
>> +}
>> \
> So I noticed that the disassembly of these two functions is mostly
> parameter pushing and popping. Is there a case to be made to use the
> __flatten__ approach and see how the compiler unrolls it all?Em... for the most part the functions being called are not inlinable, being defined in accel/tcg/. r~
