1.4K Star 7.6K Fork 1.4K

GVP方舟编译器 / OpenArkCompiler

 / 详情

jbc2mpl: incorrect unsigned right shift '>>>' for negative byte/short

已完成
成员
创建于  
2020-09-23 08:49

Using the following code to test unsigned right shift '>>>' operation for byte and short type variables, the output result is not expected:

  1 public class Main {
  2     public static void main(String[] args) {
  3         byte b = -4;
  4         short s = -4;
  5         System.out.println("b=" + b + ", s=" + s);
  6         System.out.println("b=0x" + Integer.toHexString((int)b)
  7                            + ", s=0x" + Integer.toHexString((int)s));
  8         b >>>= 4;
  9         s >>>= 4;
 10         System.out.println("b=" + b + ", s=" + s);
 11         System.out.println("b=0x" + Integer.toHexString((int)b)
 12                            + ", s=0x" + Integer.toHexString((int)s));
 13     }
 14 }

The correct result should be:

b=-4, s=-4
b=0xfffffffc, s=0xfffffffc
b=-1, s=-1
b=0xffffffff, s=0xffffffff

But the output of the test code is:

b=-4, s=-4
b=0xfffffffc, s=0xfffffffc
b=268435455, s=268435455
b=0xfffffff, s=0xfffffff

The value 0xfffffff generated by the compiler is not correct. See Main.VtableImpl.mpl:

  #LINE Main.java : 10, INSTIDX : 90||005a:  getstatic
  regassign ptr %23 (regread ref %60)
LOC 1 10
  regassign ref %60 (iread ref <* <* <$Ljava_2Fio_2FPrintStream_3B>>> 0 (regread ptr %64))
  dassign %Reg0_R862 0 (regread ref %60)
  intrinsiccall MCCIncDecRef (regread ref %60, regread ptr %23)
  #LINE Main.java : 10, INSTIDX : 93||005d:  new
  regassign ptr %24 (regread ref %61)
  regassign ref %61 (gcmalloc ref <$Ljava_2Flang_2FStringBuilder_3B>)
  dassign %Reg1_R1169 0 (regread ref %61)
  intrinsiccall MCCDecRef (regread ptr %24)
  #LINE Main.java : 10, INSTIDX : 97||0061:  invokespecial
  icallassigned (regread ptr %65, regread ref %61) {}
  #LINE Main.java : 10, INSTIDX : 100||0064:  ldc
  callassigned &MCC_GetOrInsertLiteral (regread ptr %66) { regassign ptr %55}
  #LINE Main.java : 10, INSTIDX : 102||0066:  invokevirtual
  icallassigned (regread ptr %67, regread ref %61, regread ptr %55) { regassign ptr %25}
  regassign ptr %26 (regread ref %61)
  regassign ref %61 (regread ptr %25)
  dassign %Reg1_R1169 0 (regread ref %61)
  intrinsiccall MCCDecRef (regread ptr %26)
  #LINE Main.java : 10, INSTIDX : 105||0069:  iload_1
  #LINE Main.java : 10, INSTIDX : 106||006a:  invokevirtual
  assertnonnull (regread ref %61)
  icallassigned (regread ptr %68, regread ref %61, constval i32 0xfffffff) { regassign ptr %27}
  regassign ptr %28 (regread ref %61)
  regassign ref %61 (regread ptr %27)
  dassign %Reg1_R1169 0 (regread ref %61)
  intrinsiccall MCCDecRef (regread ptr %28)
  #LINE Main.java : 10, INSTIDX : 109||006d:  ldc
  callassigned &MCC_GetOrInsertLiteral (regread ptr %69) { regassign ptr %56}
  #LINE Main.java : 10, INSTIDX : 111||006f:  invokevirtual
  assertnonnull (regread ref %61)
  icallassigned (regread ptr %67, regread ref %61, regread ptr %56) { regassign ptr %29}
  regassign ptr %30 (regread ref %61)
  regassign ref %61 (regread ptr %29)
  dassign %Reg1_R1169 0 (regread ref %61)
  intrinsiccall MCCDecRef (regread ptr %30)
  #LINE Main.java : 10, INSTIDX : 114||0072:  iload_2
  #LINE Main.java : 10, INSTIDX : 115||0073:  invokevirtual
  assertnonnull (regread ref %61)
  icallassigned (regread ptr %68, regread ref %61, constval i32 0xfffffff) { regassign ptr %31}
  regassign ptr %32 (regread ref %61)
  regassign ref %61 (regread ptr %31)
  dassign %Reg1_R1169 0 (regread ref %61)
  intrinsiccall MCCDecRef (regread ptr %32)
  #LINE Main.java : 10, INSTIDX : 118||0076:  invokevirtual
  assertnonnull (regread ref %61)
  icallassigned (regread ptr %70, regread ref %61) { regassign ptr %33}
  regassign ptr %34 (regread ref %62)
  regassign ref %62 (regread ptr %33)
  dassign %Reg1_R50 0 (regread ref %62)
  intrinsiccall MCCDecRef (regread ptr %34)

评论 (0)

yanchen4791 创建了任务
BinaryFZ 任务状态待办的 修改为已完成
展开全部操作日志

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
C++
1
https://gitee.com/openarkcompiler/OpenArkCompiler.git
git@gitee.com:openarkcompiler/OpenArkCompiler.git
openarkcompiler
OpenArkCompiler
OpenArkCompiler

搜索帮助