Mercurial > hg > truffle
diff graal/com.oracle.max.asmdis/src/com/sun/max/asm/gen/risc/sparc/IntegerArithmetic.java @ 3733:e233f5660da4
Added Java files from Maxine project.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 17 Dec 2011 19:59:18 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.asmdis/src/com/sun/max/asm/gen/risc/sparc/IntegerArithmetic.java Sat Dec 17 19:59:18 2011 +0100 @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.max.asm.gen.risc.sparc; + +import static com.sun.max.asm.gen.risc.sparc.SPARCFields.*; + +import com.sun.max.asm.gen.risc.*; + +/** + */ +class IntegerArithmetic extends SPARCInstructionDescriptionCreator { + + private void createBinaryArithmetic(String name, int op3Contents) { + define(name, op(0x2), rs1, i(0), res_12_5, rs2, rd, op3(op3Contents)); + define(name, op(0x2), rs1, i(1), simm13, rd, op3(op3Contents)); + } + + private void create_A2() { + createBinaryArithmetic("add", 0x0); + createBinaryArithmetic("addc", 0x8); + createBinaryArithmetic("addcc", 0x10); + createBinaryArithmetic("addccc", 0x18); + } + + private void create_A10() { + if (assembly().generatingDeprecatedInstructions()) { + createBinaryArithmetic("udiv", 0xe); + createBinaryArithmetic("sdiv", 0xf); + createBinaryArithmetic("udivcc", 0x1e); + createBinaryArithmetic("sdivcc", 0x1f); + } + } + + private void create_A31() { + createBinaryArithmetic("and", 0x1); + createBinaryArithmetic("andcc", 0x11); + createBinaryArithmetic("andn", 0x5); + createBinaryArithmetic("andncc", 0x15); + createBinaryArithmetic("or", 0x2); + createBinaryArithmetic("orcc", 0x12); + createBinaryArithmetic("orn", 0x6); + createBinaryArithmetic("orncc", 0x16); + createBinaryArithmetic("xor", 0x3); + createBinaryArithmetic("xorcc", 0x13); + createBinaryArithmetic("xnor", 0x7); + + createBinaryArithmetic("xnorcc", 0x17); + } + + private void create_A36() { + if (assembly().generatingV9Instructions()) { + createBinaryArithmetic("mulx", 0x9); + createBinaryArithmetic("sdivx", 0x2d); + createBinaryArithmetic("udivx", 0xd); + } + } + + private void create_A38() { + if (assembly().generatingDeprecatedInstructions()) { + createBinaryArithmetic("umul", 0xa); + createBinaryArithmetic("smul", 0xb); + createBinaryArithmetic("umulcc", 0x1a); + createBinaryArithmetic("smulcc", 0x1b); + } + } + + private void create_A39() { + if (assembly().generatingDeprecatedInstructions()) { + createBinaryArithmetic("mulscc", 0x24); + } + } + + private void create_A41() { + define("popc", op(0x2), res_18_14, i(0), res_12_5, rs2, rd, op3(0x2e)); + define("popc", op(0x2), res_18_14, i(1), simm13, rd, op3(0x2e)); + } + + private void create_A48() { + define("sethi", op(0x0), op2(0x4), imm22, rd); + } + + private void createShift(String name, int op3Contents) { + final Object[] head = {op(0x2), rs1, op3(op3Contents)}; + define(name, head, i(0), x(0), res_11_5, rs2, rd); + define(name + "x", head, i(0), x(1), res_11_5, rs2, rd); + define(name, head, i(1), x(0), res_11_5, shcnt32, rd); + define(name + "x", head, i(1), x(1), res_11_6, shcnt64, rd); + } + + private void create_A49() { + createShift("sll", 0x25); + createShift("srl", 0x26); + createShift("sra", 0x27); + } + + private void create_A56() { + createBinaryArithmetic("sub", 0x4); + createBinaryArithmetic("subcc", 0x14); + createBinaryArithmetic("subc", 0xc); + createBinaryArithmetic("subccc", 0x1c); + } + + private void create_A59() { + createBinaryArithmetic("taddcc", 0x20); + if (assembly().generatingDeprecatedInstructions()) { + createBinaryArithmetic("taddcctv", 0x22); + } + } + + private void create_A60() { + createBinaryArithmetic("tsubcc", 0x21); + if (assembly().generatingDeprecatedInstructions()) { + createBinaryArithmetic("tsubcctv", 0x23); + } + } + + IntegerArithmetic(RiscTemplateCreator templateCreator) { + super(templateCreator); + + setCurrentArchitectureManualSection("A.2"); + create_A2(); + + setCurrentArchitectureManualSection("A.10"); + create_A10(); + + setCurrentArchitectureManualSection("A.31"); + create_A31(); + + setCurrentArchitectureManualSection("A.36"); + create_A36(); + + setCurrentArchitectureManualSection("A.38"); + create_A38(); + + setCurrentArchitectureManualSection("A.39"); + create_A39(); + + setCurrentArchitectureManualSection("A.41"); + create_A41(); + + setCurrentArchitectureManualSection("A.48"); + create_A48(); + + setCurrentArchitectureManualSection("A.49"); + create_A49(); + + setCurrentArchitectureManualSection("A.56"); + create_A56(); + + setCurrentArchitectureManualSection("A.59"); + create_A59(); + + setCurrentArchitectureManualSection("A.60"); + create_A60(); + } +}