importtvmimportreimportosimportctypesdeftest_popcount():target='llvm -target=armv7l-none-linux-gnueabihf -mcpu=cortex-a53 -mattr=+neon'defcheck_correct_assembly(type,elements,counts):n=tvm.convert(elements)A=tvm.placeholder(n,dtype=type,name='A')B=tvm.compute(A.shape,lambdai:tvm.popcount(A[i]),name='B')s=tvm.create_schedule(B.op)s[B].vectorize(s[B].op.axis[0])f=tvm.build(s,[A,B],target)# Verify we see the correct number of vpaddl and vcnt instructions in the assemblyassembly=f.get_source('asm')matches=re.findall("vpaddl",assembly)assert(len(matches)==counts)matches=re.findall("vcnt",assembly)assert(len(matches)==1)check_correct_assembly('uint16',8,1)check_correct_assembly('uint16',4,1)check_correct_assembly('uint32',4,2)check_correct_assembly('uint32',2,2)check_correct_assembly('uint64',2,3)if__name__=="__main__":test_popcount()