龙芯爱好者的日常!
返回

恳请某芯片IP代理公司招聘一个学过汇编的临时工

2021-12-01 1551 0

  有一家自称代理IP知识产权和芯片设计的公司,最近声称龙芯的LoongArch指令集抄袭了MIPS。理由是LoongArch中有8条(整数)除法相关的指令,在MIPS中都能找到功能对应的指令,不但相同功能的指令数量相同,而且助记符命名相似,以此来证明LoongArch抄袭了MIPS。

  为了让这个论点站住脚,这家公司还特意与ARM和X86-64指令集进行了相同对比,ARM只有4条整数除法指令(msub是减法指令),X86-64只有两条整数除法指令。既能低调的表现出MIPS指令丰富,又能给LoongArch贴上了抄袭的标签,显得很有智慧的样子。

  原文中说的“指令名称可以变更,但是二进制代码无法隐藏……”我认为很有道理,可为什么对比分析的表格中,却只列出来指令名称,并没有二进制代码呢?是色厉内荏还是虎头蛇尾?


恳请某芯片IP代理公司招聘一个学过汇编的临时工



  看到这样的内容,我感到无与伦比的震惊——莫非我曾经学的汇编基础知识是假的?难道我一开始就记错了,我却把那些错误的知识奉为真理?——我惶恐不安、面若死灰的颤抖着双手翻开了两本已经泛黄的旧书。——不是我错了,我摇摇欲坠的信念再次坚定。

  可能这家代理IP和指令集授权,以及代理芯片设计的公司,只会做“代理”业务吧!这家公司只要有任何一名员工学过一点儿汇编,无论是高中生,初中生还是小学生,只要看过一两本汇编教材,也不至于闹出这样的笑话来呀。

1. x86-64数除法指令也是8条,指令助记符的数量不等于指令数量

  上面的图表中显示,英特尔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这样的指令集,则不使用隐含的寄存器规则,而是允许在指令中使用任何通用寄存器,拥有更高的灵活性。

2. LoongArch和MIPS为什么都是8条除法指令?

  对于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那样“不透明的”寄存器使用规则,在设计指令时很少使用隐含寄存器,因此整除和余数通常都是拆分成不同的指令。最后数据又分为有符号和无符号两种,那么最终的指令数量就是2×2×2=8,这不是谁抄袭谁的问题,而是小学生都能自然而然得出结论的问题。

  表格中为了制造LoongArch和MIPS除法指令数量相同的“巧合” ,而故意忽略了一些指令。比如在ARM的单元中,把msub也列为了除法指令,那么MIPS也有msub,还有msubu,是不是也应该作为除法指令呢?太刻意了,太刻意了!

3. ARM的整数除法相关指令为什么不是8条?

  因为ARM指令集中只有整除指令而没有求余数的指令,事实上ARM早期的时候连除法指令都没有。没有除法指令,没有求余数指令,难道就不能做这种计算了吗?显然不是。

  比如13÷4,我们可以用10减4,再减4,再减4,然后余下的1比4小,减了三次4得到的商就是3,余下的1就是余数。只不过这种计算是通过软件方式用减法指令去实现除法计算,往往需要算很多次减法才能得到一个除法结果。如果有除法指令而没有余数指令怎么求余数呢?先算整除,再用被除数减去除数和商的积,得到的就是余数。步骤不多因此用软件实现余数计算对性能影响不大,如果ARM加上求余数的指令,那么整除相关指令不多不少也是8条。

  表中列出的msub指令虽然可以用来计算余数,但它并不是除法指令。msub的计算规则是 a=b-m*n,分明是减法和乘法的组合。加上这么一条,就显得ARM和LoongArch及MIPS不那么相似了,太刻意了,太刻意了。ARM因为没有余数指令,所以整数除法指令是4条,如果以后加上余数指令,那么就和LoongArch及MIPS一样。

4. 指令助记符相似可以作为指令集相似的判定标准吗?

  从这家公司给的表格中就可以看到,每种架构的除法指令都包含div这个单词。同理所有的乘法指令也包含mul的字样,add是加法,sub是减法。不知道提出助记符相似就是抄袭这种观点的公司,是否为常用的单词都注册了著作权和商标?基本的语言文字是全人类的共同财富,某些公司却把我们大家的财富视为它的私产。

5. 指令功能相同可以作为侵权的证据吗?

  这要分两种情况。一是最基础的功能,比如加减乘除、位运算和逻辑运算、分支跳转、内存访问等等。没有任何一种指令集可以没有这些功能的指令,只要有这些指令,那么它们的功能就一定是相同的。

  莫非某些公司认为因为MIPS计算200+50=250,所以其它的CPU就必须算出另外的结果?既然这家公司不可能为属于全人类的基础知识注册专利,那么各种架构的基础指令就不可能相互侵权。可是这家公司却堂而皇之的用除法指令举例,可能功能更复杂的指令他们看不懂吧。

  可能存在侵权情况的是另一种情况——各种架构特有的指令。这也要一分为二,有的指令确实特别,但同样是属于基础运算而无法注册专利,只有包含创新型计算方法的指令才有注册专利的可能性。比如MIPS中有几个把数据按照一定规则重新组织的指令,在专利过期之前,龙芯的CPU就没有实现那几个指令。

6. 龙芯没有公开LoongArch架构手册卷2和卷3,是否可以作为侵权的依据?

  欲加之罪,何患无辞。原文中用各种“巧合”来试图证明龙芯侵权,但该公司所称的“巧合”根本不是巧合。

  好巧,中国和美国的中学课程都有“语文”、“数学”、“物理”、“化学”……实在“巧合”得不可思议。

  好巧,无论x86-64、MIPS,还是LoongArch、ARM,都分为“基础指令集”、“向量指令集”、“虚拟化指令集”等等,龙芯的LoongArch还多了一个“二进制翻译扩展”指令集。

  好巧,你也是两只眼睛一个鼻子啊?LoongArch和MIPS一点儿都不像,某公司为啥非要攀亲戚关系?

  既然明知道龙芯还没有公开《卷二》和《卷三》,不知这家公司怎么就提前知道龙芯侵权了?是能掐会算还是信口雌黄?

  龙芯公司为了保证不会侵权,才需要花费大量时间对国内国外数万项CPU及架构相关的专利进行对比分析。大家都知道,绝大多数的专利说明都写得云里雾里,笼统概括,需要极高的专业素养才能分析出会不会侵权。如果一天完成一项专利分析,三年才能分析一千多件,急什么。x86和MIPS都是它们各自领域的开创者,专利风险极小。ARM的诞生不比MIPS晚多少,可以说它抄了一半的MIPS,与MIPS非常相似,因此在MIPS势微时买走了它一半的专利以避险。各种知名的架构都已经发展了几十年,几十年间还有更多的不知名架构忽明忽灭,也不知道有多少专利尚未过期,都得仔仔细细地找出来对比分析。如果不仔细一点,说不定就踫上个地雷,一脚踩上去就甩不掉。

  更何况,像某公司这种,龙芯还没有去踩,就主动地蹦着跳着往身上蹭的,可能也还没有全部冒出头来。某些公司活力无限,年轻爱幻想,最爱龙芯这样稳健的大叔啦!!!可惜吸引大叔的方法错了,一边把发臭的身体往大叔身上蹭,一边大叫非礼,这样会让大叔讨厌的啦……为了不让路人嘲笑,还是招个学过汇编的临时工吧,至少以后可以不那么粗陋,令人觉得多看你一眼就后颈发颤,胃里难受!!!


顶部