有一家自称代理IP知识产权和芯片设计的公司,最近声称龙芯的LoongArch指令集抄袭了MIPS。理由是LoongArch中有8条(整数)除法相关的指令,在MIPS中都能找到功能对应的指令,不但相同功能的指令数量相同,而且助记符命名相似,以此来证明LoongArch抄袭了MIPS。
为了让这个论点站住脚,这家公司还特意与ARM和X86-64指令集进行了相同对比,ARM只有4条整数除法指令(msub是减法指令),X86-64只有两条整数除法指令。既能低调的表现出MIPS指令丰富,又能给LoongArch贴上了抄袭的标签,显得很有智慧的样子。
原文中说的“指令名称可以变更,但是二进制代码无法隐藏……”我认为很有道理,可为什么对比分析的表格中,却只列出来指令名称,并没有二进制代码呢?是色厉内荏还是虎头蛇尾?
看到这样的内容,我感到无与伦比的震惊——莫非我曾经学的汇编基础知识是假的?难道我一开始就记错了,我却把那些错误的知识奉为真理?——我惶恐不安、面若死灰地颤抖着双手翻开了两本已经泛黄的旧书。——不是我错了,我摇摇欲坠的信念再次坚定。
不放二进制编码对照,我猜是因为他们不知道怎么使用反汇编工具,不知道怎么查看到指令的二进制编码。甚至不知道各家的指令集手册中都有指令的二进制编码格式,根本连从手册上照抄下来都不会。而不是因为这些指令的二进制编码没有相同之处,毕竟都是0和1组成的,如果忽略0和1不同的排列组合,所有的编码都是一样的呢!
可能这家代理IP和指令集授权,以及代理芯片设计的公司,只会做“代理”业务吧!这家公司只要有任何一名员工学过一点儿汇编,无论是高中生,初中生还是小学生,只要看过一两本汇编教材,也不至于闹出这样的笑话来呀。
上面的图表中显示,英特尔x86-64的整教除法指令只有2条。作为大名鼎鼎的复杂指令集,相同功能的指令数量居然少于精简指令集,这是多么的不可思议。
实际上英特尔的除法指令也是8条,而某家公司误以为指令助记符与指令一一对应,就笃定x86-64只有两条除法指令,是根本不了解汇编指令和机器指令差异的表现。
x86-64的除法指令根据除数长度分为8位、16位、32位、64位这4种,每种除法指令都根据数据的符号类型分为有符号和无符号两种,因此是8条。虽然助记符只有div/idiv两个,但x86-64的每个通用寄存器都有5个不同的名字,分别表示8(两个)/16/32/64位,因此汇编时会根据寄存器的名字来生成对应位数的二进制指令。
x86-64没有单独的整除取余指令,因为div/idiv计算整除时,可以同时得到余数。只是它的除法指令寄存器规则比较隐晦,固定地使用两个寄存器来存放计算前的除数和计算后的商及余数。而像LoongArch这样的指令集,则不使用隐含的寄存器规则,而是允许在指令中使用任何通用寄存器,拥有更高的灵活性。
对于32位的CPU而言,再支持16位和8位的除法指令其实没有意义。Intel这么做是为了保持兼容性,在它最新款的CPU上还能运行原始的16位x86程序。
对于64位的CPU而言,如果所有应用程序也是64位的,也没有必要保留32位的除法指令,但为了兼容32位应用程序而不得不保留。LoongArch指令其分为32位和64位两个版本,64位版本的指令集兼容32位的应用程序,因此就需要支持32位的指令。MIPS是后来才有的64位版本,也需要兼容32位应用程序。因此它们的除法指令就需要32位和64位两个版本。
精简指令集为了避免像x86那样“不透明的”寄存器使用规则,在设计指令时很少使用隐含寄存器。又因为指令长度定长为32bit,能容纳4个寄存器(编号)的指令格式就比较宝贵,所以整除和余数通常都是拆分成不同的指令。常见的数学算式不会同时使用除法的商和余数来参与下一步计算,因些这样的设计实际上比x86的方案更加合理。最后参与计算的数据又分为有符号和无符号两种类型,那么最终的整数除法指令数量就是2×2×2=8(条),这不是谁抄袭谁的问题,而是小学生都能自然而然得出结论的问题。
表格中为了制造LoongArch和MIPS除法指令数量相同的“巧合” ,而故意忽略了一些指令。比如在ARM的单元中,把msub也列为了除法指令,那么MIPS也有musb,还有msubu,是不是也应该作为除法指令呢?太刻意了,太刻意了!
因为ARM指令其中只有整除指令而没有求余数的指令,事实上ARM早期的时候连除法指令都没有。没有除法指令,没有求余数指令,难道就不能做这种计算了吗?显然不是。
比如13÷4,我们可以用13减4,再减4,再减4,然后余下的1比4小,减了三次4得到的商就是3,余下的1就是余数。只不过这种计算是通过软件方式用减法指令去实现除法计算,往往需要算很多次减法才能得到一个除法结果。如果有除法指令而没有余数指令怎么求余数呢?先算整除,再用被除数减去除数和商的积,得到的就是余数。步骤不多因此用软件实现余数计算对性能影响不大,如果ARM加上求余数的指令,那么整除相关指令不多不少也是8条。
表中列出的msub指令虽然可以用来计算余数,但它并不是除法指令。msub的计算规则是 a=b-m*n,分明是减法和乘法的组合。加上这么一条,就显得ARM和LoongArch及MIPS不那么相似了,太刻意了,太刻意了。ARM因为没有余数指令,所以整数除法指令是4条,如果以后加上余数指令,那么就和LoongArch及MIPS一样。
从这家公司给的表格中就可以看到,每种架构的除法指令都包含div这个单词。同理所有的乘法指令也包含mul的字样,add是加法,sub是减法。不知道提出助记符相似就是抄袭这种观点的公司,是否为常用的单词都注册了著作权和商标?基本的语言文字是全人类的共同财富,某些公司却把我们大家的财富视为它的私产。
这要分两种情况。一是最基础的功能,比如加减乘除、位运算和逻辑运算、分支跳转、内存访问等等。没有任何一种指令集可以没有这些功能的指令,只要有这些指令,那么它们的功能就一定是相同的。
莫非某些公司认为因为MIPS计算200+50=250,所以其它的CPU就必须算出另外的结果?既然这家公司不可能为属于全人类的基础知识注册专利,那么各种架构的基础指令就不可能相互侵权。可是这家公司却堂而皇之的用除法指令举例,可能功能更复杂的指令他们看不懂吧。
可能存在侵权情况的是另一种情况——各种架构特有的指令。这也要一分为二,有的指令确实特别,但同样是属于基础运算而无法注册专利,只有包含创新型计算方法的指令才有注册专利的可能性。比如MIPS中有几个把数据按照一定规则重新组织的指令,在专利过期之前,龙芯的CPU就没有实现那几个指令。
欲加之罪,何患无辞。原文中用各种“巧合”来试图证明龙芯侵权,但该公司所称的“巧合”根本不是巧合。
好巧,中国和美国的中学课程都有“语文”、“数学”、“物理”、“化学”……实在“巧合”得不可思议。
好巧,无论x86-64、MIPS,还是LoongArch、ARM,都分为“基础指令集”、“向量指令集”、“虚拟化指令集”等等,龙芯的LoongArch还多了一个“二进制翻译扩展”指令集。
好巧,你也是两只眼睛一个鼻子啊?LoongArch和MIPS一点儿都不像,某公司为啥非要攀亲戚关系?
既然明知道龙芯还没有公开《卷二》和《卷三》,不知这家公司怎么就提前知道龙芯侵权了?是能掐会算还是信口雌黄?
龙芯公司为了保证不会侵权,才需要花费大量时间对国内国外数万项CPU及架构相关的专利进行对比分析。大家都知道,绝大多数的专利说明都写得云里雾里,笼统概括,需要极高的专业素养才能分析出会不会侵权。如果一天完成一项专利分析,三年才能分析一千多件,急什么。x86和MIPS都是它们各自领域的开创者,专利风险极小。ARM的诞生不比MIPS晚多少,虽然与MIPS非常相似,但也并未产生过冲突。各种知名的架构都已经发展了几十年,几十年间还有更多的不知名架构忽明忽灭,也不知道有多少专利尚未过期,都得仔仔细细地找出来对比分析。如果不仔细一点,说不定就碰上个地雷,一脚踩上去就甩不掉。
更何况,像某公司这种,龙芯还没有去踩,就主动地蹦着跳着往身上蹭的,可能也还没有全部冒出头来。某些公司活力无限,年轻爱幻想,最爱龙芯这样稳健的大叔啦!!!可惜吸引大叔的方法错了,一边把发臭的身体往大叔身上蹭,一边大叫非礼,这样会让大叔讨厌的啦……为了不让路人嘲笑,还是招个学过汇编的临时工吧,至少以后可以不那么粗陋,令人觉得多看你一眼就后颈发颤,胃里难受!!!