1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker public class Main { 17*795d594fSAndroid Build Coastguard Worker Object field; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Object Main.testGetField() builder (after) 20*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 21*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet [<<This>>] field_name:Main.field 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: java.lang.Object Main.testGetField() disassembly (after) 24*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 25*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 26*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 27*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Ref:l\d+>> InstanceFieldGet [<<This>>] field_name:Main.field 28*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr <<RefReg:r([0-8]|10|11)>>, [r1, #8] 29*795d594fSAndroid Build Coastguard Worker /// CHECK: rsbs <<RefReg>>, #0 30*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Ref>>] 31*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 32*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 33*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: rsbs {{r\d+}}, #0 34*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: java.lang.Object Main.testGetField() disassembly (after) 37*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 38*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 39*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 40*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Ref:l\d+>> InstanceFieldGet [<<This>>] field_name:Main.field 41*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr w0, [x1, #8] 42*795d594fSAndroid Build Coastguard Worker /// CHECK: neg w0, w0 43*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Ref>>] 44*795d594fSAndroid Build Coastguard Worker /// CHECK: ret 45*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 46*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 47*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{w\d+}}, {{w\d+}} 48*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: java.lang.Object Main.testGetField() disassembly (after) 51*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 52*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 53*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 54*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Ref:l\d+>> InstanceFieldGet [<<This>>] field_name:Main.field 55*795d594fSAndroid Build Coastguard Worker /// CHECK: mov eax, [ecx + 8] 56*795d594fSAndroid Build Coastguard Worker /// CHECK: neg eax 57*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Ref>>] 58*795d594fSAndroid Build Coastguard Worker /// CHECK: ret 59*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 60*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 61*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{[a-z]+}} 62*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: java.lang.Object Main.testGetField() disassembly (after) 65*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 66*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 67*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 68*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Ref:l\d+>> InstanceFieldGet [<<This>>] field_name:Main.field 69*795d594fSAndroid Build Coastguard Worker /// CHECK: mov eax, [rsi + 8] 70*795d594fSAndroid Build Coastguard Worker /// CHECK: neg eax 71*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Ref>>] 72*795d594fSAndroid Build Coastguard Worker /// CHECK: ret 73*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 74*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 75*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{[a-z]+}} 76*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 77*795d594fSAndroid Build Coastguard Worker testGetField()78*795d594fSAndroid Build Coastguard Worker Object testGetField() { 79*795d594fSAndroid Build Coastguard Worker return field; 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testSetField(java.lang.Object) builder (after) 83*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 84*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:l\d+>> ParameterValue 85*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet [<<This>>,<<Arg>>] field_name:Main.field 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.testSetField(java.lang.Object) disassembly (after) 88*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 89*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 90*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 91*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:l\d+>> ParameterValue 92*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet [<<This>>,<<Arg>>] field_name:Main.field 93*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov <<Temp:r([0-8]|10|11)>>, r2 94*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: rsbs <<Temp>>, #0 95*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: str <<Temp>>, [r1, #8] 96*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 97*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: bx lr 98*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 99*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 100*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: rsbs {{r\d+}}, #0 101*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testSetField(java.lang.Object) disassembly (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 105*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 106*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 107*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:l\d+>> ParameterValue 108*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet [<<This>>,<<Arg>>] field_name:Main.field 109*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov <<Temp:w1[67]>>, w2 110*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: neg <<Temp>>, <<Temp>> 111*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: str <<Temp>>, [x1, #8] 112*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 113*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ret 114*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 115*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 116*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{w\d+}}, {{w\d+}} 117*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.testSetField(java.lang.Object) disassembly (after) 120*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 121*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 122*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 123*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:l\d+>> ParameterValue 124*795d594fSAndroid Build Coastguard Worker /// CHECK: ParallelMove 125*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov eax, ecx 126*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet [<<This>>,<<Arg>>] field_name:Main.field 127*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov <<Temp:e([acdb]x|bp|si|di)>>, edx 128*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: neg <<Temp>> 129*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov [eax + 8], <<Temp>> 130*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 131*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ret 132*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 133*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 134*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{[a-z]+}} 135*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.testSetField(java.lang.Object) disassembly (after) 138*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_HEAP_POISONING') == 'true' 139*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: os.environ.get('ART_READ_BARRIER_TYPE') != 'TABLELOOKUP' 140*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 141*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:l\d+>> ParameterValue 142*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet [<<This>>,<<Arg>>] field_name:Main.field 143*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov <<Temp:e([acdb]x|bp|si|di)>>, edx 144*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: neg <<Temp>> 145*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: mov [rsi + 8], <<Temp>> 146*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 147*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ret 148*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 149*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 150*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: neg {{[a-z]+}} 151*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 152*795d594fSAndroid Build Coastguard Worker testSetField(Object o)153*795d594fSAndroid Build Coastguard Worker void testSetField(Object o) { 154*795d594fSAndroid Build Coastguard Worker field = o; 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker main(String[] args)157*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 158*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 159*795d594fSAndroid Build Coastguard Worker Object o = m.testGetField(); 160*795d594fSAndroid Build Coastguard Worker m.testSetField(o); 161*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker } 164