1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker assertIntEquals(int expected, int result)19*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int result) { 20*795d594fSAndroid Build Coastguard Worker if (expected != result) { 21*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker assertLongEquals(long expected, long result)25*795d594fSAndroid Build Coastguard Worker public static void assertLongEquals(long expected, long result) { 26*795d594fSAndroid Build Coastguard Worker if (expected != result) { 27*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 28*795d594fSAndroid Build Coastguard Worker } 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker /** 32*795d594fSAndroid Build Coastguard Worker * Test merging of `NOT+AND` into `BIC`. 33*795d594fSAndroid Build Coastguard Worker */ 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm64 (before) 36*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 37*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 38*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 39*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Base>>,<<Not>>] 40*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm64 (after) 43*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 44*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 45*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:And 46*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm64 (after) 49*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 50*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAnd(int, int) disassembly (after) 53*795d594fSAndroid Build Coastguard Worker /// CHECK: bic w{{\d+}}, w{{\d+}}, w{{\d+}} 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm (before) 57*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 58*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 59*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 60*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Base>>,<<Not>>] 61*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm (after) 64*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 65*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 66*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:And 67*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_arm (after) 70*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 71*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAnd(int, int) disassembly (after) 74*795d594fSAndroid Build Coastguard Worker /// CHECK: bic r{{\d+}}, r{{\d+}}, r{{\d+}} 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_riscv64 (before) 78*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 79*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 80*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 81*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Base>>,<<Not>>] 82*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_riscv64 (after) 85*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 86*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 87*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:And 88*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAnd(int, int) instruction_simplifier_riscv64 (after) 91*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 92*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAnd(int, int) disassembly (after) 95*795d594fSAndroid Build Coastguard Worker /// CHECK: andn a{{\d+}}, a{{\d+}}, a{{\d+}} 96*795d594fSAndroid Build Coastguard Worker $opt$noinline$notAnd(int base, int mask)97*795d594fSAndroid Build Coastguard Worker public static int $opt$noinline$notAnd(int base, int mask) { 98*795d594fSAndroid Build Coastguard Worker return base & ~mask; 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker /** 102*795d594fSAndroid Build Coastguard Worker * Test merging of `NOT+ORR` into `ORN`. 103*795d594fSAndroid Build Coastguard Worker */ 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm64 (before) 106*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 107*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 108*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:j\d+>> Not [<<Mask>>] 109*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:j\d+>> Or [<<Base>>,<<Not>>] 110*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm64 (after) 113*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 114*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 115*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:j\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:Or 116*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm64 (after) 119*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 120*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Or 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.$opt$noinline$notOr(long, long) disassembly (after) 123*795d594fSAndroid Build Coastguard Worker /// CHECK: orn x{{\d+}}, x{{\d+}}, x{{\d+}} 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm (before) 127*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 128*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 129*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:j\d+>> Not [<<Mask>>] 130*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:j\d+>> Or [<<Base>>,<<Not>>] 131*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm (after) 134*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 135*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 136*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:j\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:Or 137*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_arm (after) 140*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 141*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Or 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: long Main.$opt$noinline$notOr(long, long) disassembly (after) 144*795d594fSAndroid Build Coastguard Worker /// CHECK: orn r{{\d+}}, r{{\d+}}, r{{\d+}} 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_riscv64 (before) 148*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 149*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 150*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:j\d+>> Not [<<Mask>>] 151*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:j\d+>> Or [<<Base>>,<<Not>>] 152*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_riscv64 (after) 155*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:j\d+>> ParameterValue 156*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:j\d+>> ParameterValue 157*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:j\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:Or 158*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$opt$noinline$notOr(long, long) instruction_simplifier_riscv64 (after) 161*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 162*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Or 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$opt$noinline$notOr(long, long) disassembly (after) 165*795d594fSAndroid Build Coastguard Worker /// CHECK: orn a{{\d+}}, a{{\d+}}, a{{\d+}} 166*795d594fSAndroid Build Coastguard Worker $opt$noinline$notOr(long base, long mask)167*795d594fSAndroid Build Coastguard Worker public static long $opt$noinline$notOr(long base, long mask) { 168*795d594fSAndroid Build Coastguard Worker return base | ~mask; 169*795d594fSAndroid Build Coastguard Worker } 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker /** 172*795d594fSAndroid Build Coastguard Worker * Test merging of `NOT+EOR` into `EON`. 173*795d594fSAndroid Build Coastguard Worker */ 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm64 (before) 176*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 177*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 178*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 179*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> Xor [<<Base>>,<<Not>>] 180*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm64 (after) 183*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 184*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 185*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:Xor 186*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm64 (after) 189*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 190*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Xor 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notXor(int, int) disassembly (after) 193*795d594fSAndroid Build Coastguard Worker /// CHECK: eon w{{\d+}}, w{{\d+}}, w{{\d+}} 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm (before) 197*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 198*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 199*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 200*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> Xor [<<Base>>,<<Not>>] 201*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm (after) 204*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 205*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 206*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 207*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> Xor [<<Base>>,<<Not>>] 208*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_arm (after) 211*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_riscv64 (before) 215*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 216*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 217*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 218*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> Xor [<<Base>>,<<Not>>] 219*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_riscv64 (after) 222*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 223*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 224*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Base>>,<<Mask>>] kind:Xor 225*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 226*795d594fSAndroid Build Coastguard Worker 227*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notXor(int, int) instruction_simplifier_riscv64 (after) 228*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Not 229*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Xor 230*795d594fSAndroid Build Coastguard Worker 231*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notXor(int, int) disassembly (after) 232*795d594fSAndroid Build Coastguard Worker /// CHECK: xnor a{{\d+}}, a{{\d+}}, a{{\d+}} 233*795d594fSAndroid Build Coastguard Worker $opt$noinline$notXor(int base, int mask)234*795d594fSAndroid Build Coastguard Worker public static int $opt$noinline$notXor(int base, int mask) { 235*795d594fSAndroid Build Coastguard Worker return base ^ ~mask; 236*795d594fSAndroid Build Coastguard Worker } 237*795d594fSAndroid Build Coastguard Worker 238*795d594fSAndroid Build Coastguard Worker /** 239*795d594fSAndroid Build Coastguard Worker * Check that transformation is done when the argument is a constant. 240*795d594fSAndroid Build Coastguard Worker */ 241*795d594fSAndroid Build Coastguard Worker 242*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_arm64 (before) 243*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 244*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 245*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Base>>] 246*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Not>>,<<Constant>>] 247*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_arm64 (after) 250*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 251*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 252*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Constant>>,<<Base>>] kind:And 253*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 254*795d594fSAndroid Build Coastguard Worker 255*795d594fSAndroid Build Coastguard Worker 256*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_arm (before) 257*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 258*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 259*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Base>>] 260*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Not>>,<<Constant>>] 261*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_arm (after) 264*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 265*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 266*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Constant>>,<<Base>>] kind:And 267*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker 270*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_riscv64 (before) 271*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 272*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 273*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Base>>] 274*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op:i\d+>> And [<<Not>>,<<Constant>>] 275*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Op>>] 276*795d594fSAndroid Build Coastguard Worker 277*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAndConstant(int) instruction_simplifier_riscv64 (after) 278*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 279*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Constant:i\d+>> IntConstant 280*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NegOp:i\d+>> BitwiseNegatedRight [<<Constant>>,<<Base>>] kind:And 281*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<NegOp>>] 282*795d594fSAndroid Build Coastguard Worker $opt$noinline$notAndConstant(int mask)283*795d594fSAndroid Build Coastguard Worker public static int $opt$noinline$notAndConstant(int mask) { 284*795d594fSAndroid Build Coastguard Worker return 0xf & ~mask; 285*795d594fSAndroid Build Coastguard Worker } 286*795d594fSAndroid Build Coastguard Worker 287*795d594fSAndroid Build Coastguard Worker /** 288*795d594fSAndroid Build Coastguard Worker * Check that no transformation is done when Not has multiple uses. 289*795d594fSAndroid Build Coastguard Worker */ 290*795d594fSAndroid Build Coastguard Worker 291*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm64 (before) 292*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 293*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 294*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 295*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 296*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 297*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 298*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 299*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 300*795d594fSAndroid Build Coastguard Worker 301*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm64 (after) 302*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 303*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 304*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 305*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 306*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 307*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 308*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 309*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 310*795d594fSAndroid Build Coastguard Worker 311*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm64 (after) 312*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker 315*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm (before) 316*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 317*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 318*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 319*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 320*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 321*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 322*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 323*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 324*795d594fSAndroid Build Coastguard Worker 325*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm (after) 326*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 327*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 328*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 329*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 330*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 331*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 332*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 333*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 334*795d594fSAndroid Build Coastguard Worker 335*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_arm (after) 336*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 337*795d594fSAndroid Build Coastguard Worker 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_riscv64 (before) 340*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 341*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 342*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 343*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 344*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 345*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 346*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 347*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 348*795d594fSAndroid Build Coastguard Worker 349*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_riscv64 (after) 350*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Base:i\d+>> ParameterValue 351*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Mask:i\d+>> ParameterValue 352*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 353*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Not:i\d+>> Not [<<Mask>>] 354*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op1:i\d+>> And [<<Not>>,<<One>>] 355*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Op2:i\d+>> And [<<Base>>,<<Not>>] 356*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<Op1>>,<<Op2>>] 357*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Add>>] 358*795d594fSAndroid Build Coastguard Worker 359*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$notAndMultipleUses(int, int) instruction_simplifier_riscv64 (after) 360*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 361*795d594fSAndroid Build Coastguard Worker $opt$noinline$notAndMultipleUses(int base, int mask)362*795d594fSAndroid Build Coastguard Worker public static int $opt$noinline$notAndMultipleUses(int base, int mask) { 363*795d594fSAndroid Build Coastguard Worker int tmp = ~mask; 364*795d594fSAndroid Build Coastguard Worker return (tmp & 0x1) + (base & tmp); 365*795d594fSAndroid Build Coastguard Worker } 366*795d594fSAndroid Build Coastguard Worker 367*795d594fSAndroid Build Coastguard Worker /** 368*795d594fSAndroid Build Coastguard Worker * Check that no transformation is done when both inputs are Not's. 369*795d594fSAndroid Build Coastguard Worker */ 370*795d594fSAndroid Build Coastguard Worker 371*795d594fSAndroid Build Coastguard Worker // We don't check the instructions before the pass, since if De Morgan's laws 372*795d594fSAndroid Build Coastguard Worker // have been applied then Not/Not/Or is replaced by And/Not. 373*795d594fSAndroid Build Coastguard Worker 374*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$opt$noinline$deMorganOr(int, int) instruction_simplifier_arm64 (after) 375*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 376*795d594fSAndroid Build Coastguard Worker 377*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$opt$noinline$deMorganOr(int, int) instruction_simplifier_arm (after) 378*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 379*795d594fSAndroid Build Coastguard Worker 380*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$opt$noinline$deMorganOr(int, int) instruction_simplifier_riscv64 (after) 381*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BitwiseNegatedRight 382*795d594fSAndroid Build Coastguard Worker $opt$noinline$deMorganOr(int a, int b)383*795d594fSAndroid Build Coastguard Worker public static int $opt$noinline$deMorganOr(int a, int b) { 384*795d594fSAndroid Build Coastguard Worker return ~a | ~b; 385*795d594fSAndroid Build Coastguard Worker } 386*795d594fSAndroid Build Coastguard Worker 387*795d594fSAndroid Build Coastguard Worker /** 388*795d594fSAndroid Build Coastguard Worker * Check that we transform a And+Sub into a bic 389*795d594fSAndroid Build Coastguard Worker */ 390*795d594fSAndroid Build Coastguard Worker 391*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm (before) 392*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 393*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Left>>,<<HAnd>>] 394*795d594fSAndroid Build Coastguard Worker 395*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm (after) 396*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 397*795d594fSAndroid Build Coastguard Worker 398*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm (after) 399*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 400*795d594fSAndroid Build Coastguard Worker 401*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm (after) 402*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 403*795d594fSAndroid Build Coastguard Worker 404*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm64 (before) 405*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 406*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Left>>,<<HAnd>>] 407*795d594fSAndroid Build Coastguard Worker 408*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm64 (after) 409*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 410*795d594fSAndroid Build Coastguard Worker 411*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm64 (after) 412*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 413*795d594fSAndroid Build Coastguard Worker 414*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_arm64 (after) 415*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 416*795d594fSAndroid Build Coastguard Worker 417*795d594fSAndroid Build Coastguard Worker 418*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_riscv64 (before) 419*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 420*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Left>>,<<HAnd>>] 421*795d594fSAndroid Build Coastguard Worker 422*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_riscv64 (after) 423*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 424*795d594fSAndroid Build Coastguard Worker 425*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_riscv64 (after) 426*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 427*795d594fSAndroid Build Coastguard Worker 428*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic(int, int) instruction_simplifier_riscv64 (after) 429*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 430*795d594fSAndroid Build Coastguard Worker $noinline$AndSubIntoBic(int a, int b)431*795d594fSAndroid Build Coastguard Worker public static int $noinline$AndSubIntoBic(int a, int b) { 432*795d594fSAndroid Build Coastguard Worker return a - (a & b); 433*795d594fSAndroid Build Coastguard Worker } 434*795d594fSAndroid Build Coastguard Worker 435*795d594fSAndroid Build Coastguard Worker /** 436*795d594fSAndroid Build Coastguard Worker * Check that we transform a And+Sub into a bic. Alternative version where the and is inverted. 437*795d594fSAndroid Build Coastguard Worker */ 438*795d594fSAndroid Build Coastguard Worker 439*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm (before) 440*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 441*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Right>>,<<HAnd>>] 442*795d594fSAndroid Build Coastguard Worker 443*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm (after) 444*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 445*795d594fSAndroid Build Coastguard Worker 446*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm (after) 447*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 448*795d594fSAndroid Build Coastguard Worker 449*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm (after) 450*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 451*795d594fSAndroid Build Coastguard Worker 452*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm64 (before) 453*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 454*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Right>>,<<HAnd>>] 455*795d594fSAndroid Build Coastguard Worker 456*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm64 (after) 457*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 458*795d594fSAndroid Build Coastguard Worker 459*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm64 (after) 460*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 461*795d594fSAndroid Build Coastguard Worker 462*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_arm64 (after) 463*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 464*795d594fSAndroid Build Coastguard Worker 465*795d594fSAndroid Build Coastguard Worker 466*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_riscv64 (before) 467*795d594fSAndroid Build Coastguard Worker /// CHECK: <<HAnd:i\d+>> And [<<Left:i\d+>>,<<Right:i\d+>>] 468*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub [<<Right>>,<<HAnd>>] 469*795d594fSAndroid Build Coastguard Worker 470*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_riscv64 (after) 471*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: And 472*795d594fSAndroid Build Coastguard Worker 473*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_riscv64 (after) 474*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 475*795d594fSAndroid Build Coastguard Worker 476*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$AndSubIntoBic_v2(int, int) instruction_simplifier_riscv64 (after) 477*795d594fSAndroid Build Coastguard Worker /// CHECK: BitwiseNegatedRight kind:And 478*795d594fSAndroid Build Coastguard Worker $noinline$AndSubIntoBic_v2(int a, int b)479*795d594fSAndroid Build Coastguard Worker public static int $noinline$AndSubIntoBic_v2(int a, int b) { 480*795d594fSAndroid Build Coastguard Worker return b - (a & b); 481*795d594fSAndroid Build Coastguard Worker } 482*795d594fSAndroid Build Coastguard Worker main(String[] args)483*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 484*795d594fSAndroid Build Coastguard Worker assertIntEquals(0xe, $opt$noinline$notAnd(0xf, 0x1)); 485*795d594fSAndroid Build Coastguard Worker assertLongEquals(~0x0, $opt$noinline$notOr(0xf, 0x1)); 486*795d594fSAndroid Build Coastguard Worker assertIntEquals(~0xe, $opt$noinline$notXor(0xf, 0x1)); 487*795d594fSAndroid Build Coastguard Worker assertIntEquals(0xe, $opt$noinline$notAndConstant(0x1)); 488*795d594fSAndroid Build Coastguard Worker assertIntEquals(0xe, $opt$noinline$notAndMultipleUses(0xf, 0x1)); 489*795d594fSAndroid Build Coastguard Worker assertIntEquals(~0x1, $opt$noinline$deMorganOr(0x3, 0x1)); 490*795d594fSAndroid Build Coastguard Worker assertIntEquals(0x2, $noinline$AndSubIntoBic(0x3, 0x1)); 491*795d594fSAndroid Build Coastguard Worker assertIntEquals(0x2, $noinline$AndSubIntoBic_v2(0x1, 0x3)); 492*795d594fSAndroid Build Coastguard Worker } 493*795d594fSAndroid Build Coastguard Worker } 494