/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class Main { public static boolean doThrow = false; public void $noinline$foo(int in_w1, int in_w2, int in_w3, int in_w4, int in_w5, int in_w6, int in_w7, int on_stack_int, long on_stack_long, float in_s0, float in_s1, float in_s2, float in_s3, float in_s4, float in_s5, float in_s6, float in_s7, float on_stack_float, double on_stack_double) { if (doThrow) throw new Error(); } // We expect a parallel move that moves four times the zero constant to stack locations. /// CHECK-START-ARM64: void Main.bar() register (after) /// CHECK: ParallelMove {{.*#0->[0-9x]+\(sp\).*#0->[0-9x]+\(sp\).*#0->[0-9x]+\(sp\).*#0->[0-9x]+\(sp\).*}} // Those four moves should generate four 'store' instructions using directly the zero register. /// CHECK-START-ARM64: void Main.bar() disassembly (after) /// CHECK-DAG: {{(str|stur)}} wzr, [sp, #{{[0-9]+}}] /// CHECK-DAG: {{(str|stur)}} xzr, [sp, #{{[0-9]+}}] /// CHECK-DAG: {{(str|stur)}} wzr, [sp, #{{[0-9]+}}] /// CHECK-DAG: {{(str|stur)}} xzr, [sp, #{{[0-9]+}}] public void bar() { $noinline$foo(1, 2, 3, 4, 5, 6, 7, // Integral values in registers. 0, 0L, // Integral values on the stack. 1, 2, 3, 4, 5, 6, 7, 8, // Floating-point values in registers. 0.0f, 0.0); // Floating-point values on the stack. } /// CHECK-START-ARM64: void Main.store_zero_to_static_byte_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: strb wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static byte static_byte_field; public void store_zero_to_static_byte_field() { static_byte_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_static_char_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static char static_char_field; public void store_zero_to_static_char_field() { static_char_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_static_short_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static short static_short_field; public void store_zero_to_static_short_field() { static_short_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_static_int_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static int static_int_field; public void store_zero_to_static_int_field() { static_int_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_static_long_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static long static_long_field; public void store_zero_to_static_long_field() { static_long_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_static_float_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static float static_float_field; public void store_zero_to_static_float_field() { static_float_field = 0.0f; } /// CHECK-START-ARM64: void Main.store_zero_to_static_double_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] public static double static_double_field; public void store_zero_to_static_double_field() { static_double_field = 0.0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_byte_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrb wzr, [<>] public static volatile byte volatile_static_byte_field; public void store_zero_to_volatile_static_byte_field() { volatile_static_byte_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_char_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrh wzr, [<>] public static volatile char volatile_static_char_field; public void store_zero_to_volatile_static_char_field() { volatile_static_char_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_short_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrh wzr, [<>] public static volatile short volatile_static_short_field; public void store_zero_to_volatile_static_short_field() { volatile_static_short_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_int_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr wzr, [<>] public static volatile int volatile_static_int_field; public void store_zero_to_volatile_static_int_field() { volatile_static_int_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_long_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr xzr, [<>] public static volatile long volatile_static_long_field; public void store_zero_to_volatile_static_long_field() { volatile_static_long_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_float_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr wzr, [<>] public static volatile float volatile_static_float_field; public void store_zero_to_volatile_static_float_field() { volatile_static_float_field = 0.0f; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_static_double_field() disassembly (after) /// CHECK: StaticFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr xzr, [<>] public static volatile double volatile_static_double_field; public void store_zero_to_volatile_static_double_field() { volatile_static_double_field = 0.0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_byte_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: strb wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public byte instance_byte_field; public void store_zero_to_instance_byte_field() { instance_byte_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_char_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public char instance_char_field; public void store_zero_to_instance_char_field() { instance_char_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_short_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public short instance_short_field; public void store_zero_to_instance_short_field() { instance_short_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_int_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public int instance_int_field; public void store_zero_to_instance_int_field() { instance_int_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_long_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] public long instance_long_field; public void store_zero_to_instance_long_field() { instance_long_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_float_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] public float instance_float_field; public void store_zero_to_instance_float_field() { instance_float_field = 0.0f; } /// CHECK-START-ARM64: void Main.store_zero_to_instance_double_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] public double instance_double_field; public void store_zero_to_instance_double_field() { instance_double_field = 0.0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_byte_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrb wzr, [<>] public volatile byte volatile_instance_byte_field; public void store_zero_to_volatile_instance_byte_field() { volatile_instance_byte_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_char_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrh wzr, [<>] public volatile char volatile_instance_char_field; public void store_zero_to_volatile_instance_char_field() { volatile_instance_char_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_short_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlrh wzr, [<>] public volatile short volatile_instance_short_field; public void store_zero_to_volatile_instance_short_field() { volatile_instance_short_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_int_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr wzr, [<>] public volatile int volatile_instance_int_field; public void store_zero_to_volatile_instance_int_field() { volatile_instance_int_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_long_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr xzr, [<>] public volatile long volatile_instance_long_field; public void store_zero_to_volatile_instance_long_field() { volatile_instance_long_field = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_float_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr wzr, [<>] public volatile float volatile_instance_float_field; public void store_zero_to_volatile_instance_float_field() { volatile_instance_float_field = 0.0f; } /// CHECK-START-ARM64: void Main.store_zero_to_volatile_instance_double_field() disassembly (after) /// CHECK: InstanceFieldSet /// CHECK-NEXT: add <>, x{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} /// CHECK-NEXT: stlr xzr, [<>] public volatile double volatile_instance_double_field; public void store_zero_to_volatile_instance_double_field() { volatile_instance_double_field = 0.0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_byte() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: strb wzr, [x{{[0-9]+}}, #{{[0-9]+}}] byte array_byte[]; public void store_zero_to_array_byte() { array_byte[0] = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_char() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] char array_char[]; public void store_zero_to_array_char() { array_char[0] = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_short() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: strh wzr, [x{{[0-9]+}}, #{{[0-9]+}}] short array_short[]; public void store_zero_to_array_short() { array_short[0] = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_int() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] int array_int[]; public void store_zero_to_array_int() { array_int[0] = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_long() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] long array_long[]; public void store_zero_to_array_long() { array_long[0] = 0; } /// CHECK-START-ARM64: void Main.store_zero_to_array_float() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: str wzr, [x{{[0-9]+}}, #{{[0-9]+}}] float array_float[]; public void store_zero_to_array_float() { array_float[0] = 0.0f; } /// CHECK-START-ARM64: void Main.store_zero_to_array_double() disassembly (after) /// CHECK: ArraySet /// CHECK-NEXT: str xzr, [x{{[0-9]+}}, #{{[0-9]+}}] double array_double[]; public void store_zero_to_array_double() { array_double[0] = 0.0; } public static void main(String args[]) { Main obj = new Main(); obj.array_byte = new byte[1]; obj.array_char = new char[1]; obj.array_short = new short[1]; obj.array_int = new int[1]; obj.array_long = new long[1]; obj.array_float = new float[1]; obj.array_double = new double[1]; obj.bar(); obj.store_zero_to_static_byte_field(); obj.store_zero_to_static_char_field(); obj.store_zero_to_static_short_field(); obj.store_zero_to_static_int_field(); obj.store_zero_to_static_long_field(); obj.store_zero_to_static_float_field(); obj.store_zero_to_static_double_field(); obj.store_zero_to_volatile_static_byte_field(); obj.store_zero_to_volatile_static_char_field(); obj.store_zero_to_volatile_static_short_field(); obj.store_zero_to_volatile_static_int_field(); obj.store_zero_to_volatile_static_long_field(); obj.store_zero_to_volatile_static_float_field(); obj.store_zero_to_volatile_static_double_field(); obj.store_zero_to_instance_byte_field(); obj.store_zero_to_instance_char_field(); obj.store_zero_to_instance_short_field(); obj.store_zero_to_instance_int_field(); obj.store_zero_to_instance_long_field(); obj.store_zero_to_instance_float_field(); obj.store_zero_to_instance_double_field(); obj.store_zero_to_volatile_instance_byte_field(); obj.store_zero_to_volatile_instance_char_field(); obj.store_zero_to_volatile_instance_short_field(); obj.store_zero_to_volatile_instance_int_field(); obj.store_zero_to_volatile_instance_long_field(); obj.store_zero_to_volatile_instance_float_field(); obj.store_zero_to_volatile_instance_double_field(); obj.store_zero_to_array_byte(); obj.store_zero_to_array_char(); obj.store_zero_to_array_short(); obj.store_zero_to_array_int(); obj.store_zero_to_array_long(); obj.store_zero_to_array_float(); obj.store_zero_to_array_double(); } }