blob: 32956af1990e3ef7eb7a2790fa5d20dd3c4f0097 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:expect/expect.dart';
import 'package:vm/testing/il_matchers.dart';
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int and(int x) {
return x & x;
}
void matchIL$and(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int and0(int x) {
return x & 0;
}
void matchIL$and0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_zero' << match.UnboxedConstant(value: 0),
]),
match.block('Function', [
match.DartReturn('c_zero'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int and_1(int x) {
return x & -1;
}
void matchIL$and_1(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int or(int x) {
return x | x;
}
void matchIL$or(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int or0(int x) {
return x | 0;
}
void matchIL$or0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int or_1(int x) {
return x | -1;
}
void matchIL$or_1(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_minus_one' << match.UnboxedConstant(value: -1),
]),
match.block('Function', [
match.DartReturn('c_minus_one'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int xor(int x) {
return x ^ x;
}
void matchIL$xor(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_zero' << match.UnboxedConstant(value: 0),
]),
match.block('Function', [
match.DartReturn('c_zero'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int xor0(int x) {
return x ^ 0;
}
void matchIL$xor0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int add0(int x) {
return x + 0;
}
void matchIL$add0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int sub(int x) {
return x - x;
}
void matchIL$sub(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_zero' << match.UnboxedConstant(value: 0),
]),
match.block('Function', [
match.DartReturn('c_zero'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int sub0(int x) {
return x - 0;
}
void matchIL$sub0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int mul0(int x) {
return x * 0;
}
void matchIL$mul0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_zero' << match.UnboxedConstant(value: 0),
]),
match.block('Function', [
match.DartReturn('c_zero'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int mul1(int x) {
return x * 1;
}
void matchIL$mul1(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int div1(int x) {
return x ~/ 1;
}
void matchIL$div1(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int sll0(int x) {
return x << 0;
}
void matchIL$sll0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int sra0(int x) {
return x >> 0;
}
void matchIL$sra0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int srl0(int x) {
return x >>> 0;
}
void matchIL$srl0(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', []),
match.block('Function', [
'x' << match.Parameter(index: 0),
match.DartReturn('x'),
]),
]);
}
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int srl64(int x) {
return x >>> 64;
}
void matchIL$srl64(FlowGraph graph) {
graph.dump();
graph.match([
match.block('Graph', [
'c_zero' << match.UnboxedConstant(value: 0),
]),
match.block('Function', [
match.DartReturn('c_zero'),
]),
]);
}
main() {
Expect.equals(1, and(1));
Expect.equals(2, and(2));
Expect.equals(0, and0(1));
Expect.equals(0, and0(2));
Expect.equals(1, and_1(1));
Expect.equals(2, and_1(2));
Expect.equals(1, or(1));
Expect.equals(2, or(2));
Expect.equals(1, or0(1));
Expect.equals(2, or0(2));
Expect.equals(-1, or_1(1));
Expect.equals(-1, or_1(2));
Expect.equals(0, xor(1));
Expect.equals(0, xor(2));
Expect.equals(1, xor0(1));
Expect.equals(2, xor0(2));
Expect.equals(1, add0(1));
Expect.equals(2, add0(2));
Expect.equals(0, sub(1));
Expect.equals(0, sub(2));
Expect.equals(1, sub0(1));
Expect.equals(2, sub0(2));
Expect.equals(0, mul0(1));
Expect.equals(0, mul0(2));
Expect.equals(1, mul1(1));
Expect.equals(2, mul1(2));
Expect.equals(1, div1(1));
Expect.equals(2, div1(2));
Expect.equals(1, sll0(1));
Expect.equals(2, sll0(2));
Expect.equals(1, sra0(1));
Expect.equals(2, sra0(2));
Expect.equals(1, srl0(1));
Expect.equals(2, srl0(2));
Expect.equals(0, srl64(1));
Expect.equals(0, srl64(2));
}