diff --git a/sys/risc-v/rv3264im.vadl b/sys/risc-v/rv3264im.vadl index 46be14424..918b2493d 100644 --- a/sys/risc-v/rv3264im.vadl +++ b/sys/risc-v/rv3264im.vadl @@ -136,7 +136,6 @@ instruction set architecture RV3264Base = { } model IShftInstr (name : Id, op : BinOp, funct3 : Bin, funct2 : Bin, lhsTy : Id) : IsaDefs = { - [ upcast access to : shamt, MLen ] instruction $name : Ftype = // shift immediate instructions X(rd) := ((X(rs1) as $lhsTy) $op shamt) as Regs encoding $name = {opcode = 0b001'0011, zero = 0, funct3 = $funct3, funct2 = $funct2} @@ -144,7 +143,6 @@ instruction set architecture RV3264Base = { } model WShftInstr (name : Id, op : BinOp, funct3 : Bin, funct7 : Bin, lhsTy : Id) : IsaDefs = { - [ upcast access to : shamt, MLen ] instruction $name : Rtype = // shift immediate instructions word X(rd) := (((X(rs1) as $lhsTy) $op shamt) as SInt) as SIntR encoding $name = {opcode = 0b001'1011, funct3 = $funct3, funct7 = $funct7} diff --git a/vadl/main/vadl/ast/AnnotationTable.java b/vadl/main/vadl/ast/AnnotationTable.java index 1f6a5fbf3..2f1c1ae04 100644 --- a/vadl/main/vadl/ast/AnnotationTable.java +++ b/vadl/main/vadl/ast/AnnotationTable.java @@ -44,7 +44,6 @@ import vadl.gcb.annotations.StatusRegisterAnnotation; import vadl.types.BitsType; import vadl.types.Type; -import vadl.types.UIntType; import vadl.utils.Pair; import vadl.utils.SourceLocation; import vadl.utils.WithLocation; @@ -68,7 +67,6 @@ import vadl.viam.annotations.BigEndianAnnotation; import vadl.viam.annotations.DefineOperandAnnotation; import vadl.viam.annotations.EnableHtifAnno; -import vadl.viam.annotations.FieldAccessAnnotation; import vadl.viam.annotations.InstructionUndefinedAnno; import vadl.viam.annotations.TbStateRegisterAnnotation; @@ -335,16 +333,6 @@ public class AnnotationTable { var lit = (StringLiteral) annotation.definition.values.getFirst(); def.addAnnotation(new RelocationSyntaxAnnotation(lit.value)); }).build(); - - annotationOn(InstructionDefinition.class, "upcast access to", UpcastAnnotation::new) - .applyViam((def, annotation, lowering) -> { - var field = - (Format.FieldAccess) ensurePresent(lowering.fetch((FormatField) annotation.targetDef), - () -> Diagnostic.error("Cannot find field", annotation.targetDef.location())); - - def.addAnnotation(new FieldAccessAnnotation(field, - UIntType.unsignedInt(annotation.bitSize.value().intValue()))); - }).build(); } /** @@ -1553,54 +1541,3 @@ void resolveName(AnnotationDefinition definition, SymbolTable.SymbolResolver res super.resolveName(definition, resolver); } } - -/** - * Provides the annotation {@code [ upcast access to : , ]} on an instruction that - * treats the field access of {@code } as being of type {@code }. {@code } has to - * evaluate to a positive integer. - * This is useful when there is a type mismatch between the field access and an LLVM type. - */ -class UpcastAnnotation extends Annotation { - - @LazyInit - ConstantValue bitSize; - - @LazyInit - Definition targetDef; - - public UpcastAnnotation() { - super(); - } - - @Override - void resolveName(AnnotationDefinition definition, SymbolTable.SymbolResolver resolver) { - verifyValuesCnt(definition, 2); - for (var val : definition.values) { - val.accept(resolver); - } - } - - @Override - void typeCheck(AnnotationDefinition definition, TypeChecker typeChecker) { - - var def = definition.values.getFirst(); - Diagnostic.ensure(def instanceof Identifier, () -> error("Invalid annotation value", def) - .description("A single identifier was expected.") - ); - var target = ((Identifier) def).target(); - Diagnostic.ensure(target instanceof Definition, () -> error("Invalid annotation value", def) - .description("The identifier must reference a definition.")); - targetDef = ((Definition) target); - - var valueExpr = definition.values.get(1); - typeChecker.check(valueExpr); - bitSize = typeChecker.constantEvaluator.eval(valueExpr); - Diagnostic.ensure(bitSize.value().signum() > 0, - () -> error("Bit size of type has to be bigger than zero", valueExpr)); - } - - @Override - public String usageString() { - return "[ " + name + " : , ]"; - } -} diff --git a/vadl/main/vadl/lcb/passes/llvmLowering/immediates/GenerateTableGenImmediateRecordPass.java b/vadl/main/vadl/lcb/passes/llvmLowering/immediates/GenerateTableGenImmediateRecordPass.java index 9f622b9c5..11ad9791a 100644 --- a/vadl/main/vadl/lcb/passes/llvmLowering/immediates/GenerateTableGenImmediateRecordPass.java +++ b/vadl/main/vadl/lcb/passes/llvmLowering/immediates/GenerateTableGenImmediateRecordPass.java @@ -36,7 +36,6 @@ import vadl.types.BitsType; import vadl.viam.Instruction; import vadl.viam.Specification; -import vadl.viam.annotations.FieldAccessAnnotation; import vadl.viam.graph.Graph; import vadl.viam.graph.control.InstrCallNode; import vadl.viam.graph.dependency.FieldAccessRefNode; @@ -103,22 +102,11 @@ public List execute(PassResults passResults, "Compiler generator was not able to change the type to the architecture's " + "bit width: " + upcastedType.toString(), fieldAccess.location())); - var upcastAnnotation = instruction.annotation(FieldAccessAnnotation.class); - if (upcastAnnotation != null) { - var upcastedCppType = CppTypeMap.upcast(upcastAnnotation.resultBitWidth()); - upcastedValueType = ValueType.from(upcastedCppType.makeSigned()) - .orElseThrow(() -> Diagnostic.error( - "Unable to cast access to requested bit width: " - + upcastAnnotation.resultBitWidth(), - upcastAnnotation.location()).build()); - } else { - var upcastedValueTypeBitwidth = upcastedValueType.getBitwidth(); - var smallestRegisterClassBitwidth = smallestRegisterClassType.getBitwidth(); - upcastedValueType = upcastedValueTypeBitwidth < smallestRegisterClassBitwidth - ? smallestRegisterClassType - : upcastedValueType; - } - + var upcastedValueTypeBitwidth = upcastedValueType.getBitwidth(); + var smallestRegisterClassBitwidth = smallestRegisterClassType.getBitwidth(); + upcastedValueType = upcastedValueTypeBitwidth < smallestRegisterClassBitwidth + ? smallestRegisterClassType + : upcastedValueType; immediates.add(new TableGenImmediateRecord(instruction, fieldAccess, upcastedValueType)); diff --git a/vadl/main/vadl/lcb/passes/llvmLowering/strategies/LlvmInstructionLoweringStrategy.java b/vadl/main/vadl/lcb/passes/llvmLowering/strategies/LlvmInstructionLoweringStrategy.java index d42022b80..2430eb964 100644 --- a/vadl/main/vadl/lcb/passes/llvmLowering/strategies/LlvmInstructionLoweringStrategy.java +++ b/vadl/main/vadl/lcb/passes/llvmLowering/strategies/LlvmInstructionLoweringStrategy.java @@ -75,7 +75,6 @@ import vadl.viam.Instruction; import vadl.viam.InstructionSetArchitecture; import vadl.viam.PrintableInstruction; -import vadl.viam.annotations.FieldAccessAnnotation; import vadl.viam.graph.Graph; import vadl.viam.graph.Node; import vadl.viam.graph.NodeList; @@ -113,8 +112,8 @@ public abstract class LlvmInstructionLoweringStrategy { protected final ValueType architectureType; protected final ValueType smallestRegisterClassType; - public LlvmInstructionLoweringStrategy(ValueType architectureType, - ValueType smallestRegisterClassType) { + public LlvmInstructionLoweringStrategy(ValueType architectureType, + ValueType smallestRegisterClassType) { this.architectureType = architectureType; this.smallestRegisterClassType = smallestRegisterClassType; } @@ -242,33 +241,18 @@ protected List replaceOperands( var llvmNode = ensureNonNull(fieldAccesses.get(immediateOperand.fieldAccess()), () -> Diagnostic.error("There is no lowered field access", instruction.location().join(immediateOperand.fieldAccess().location()))); - var upcastAnnotation = instruction.annotation(FieldAccessAnnotation.class); - - if (upcastAnnotation != null) { - var upcastedCppType = CppTypeMap.upcast(upcastAnnotation.resultBitWidth()); - var upcastedType = ValueType.from(upcastedCppType) - .orElseThrow( - () -> Diagnostic.error("Cannot cast requested type", - upcastAnnotation.location()).build()); - llvmNode = - new LlvmFieldAccessRefNode(instruction, - immediateOperand.fieldAccess(), - immediateOperand.fieldAccess().type(), - upcastedType, - LlvmFieldAccessRefNode.Usage.Immediate); - } else { - var llvmNodeBitwidth = llvmNode.type().asDataType().bitWidth(); - var llvmType = llvmNodeBitwidth < this.smallestRegisterClassType.getBitwidth() - ? this.smallestRegisterClassType - : ValueType.from(llvmNode.type().asDataType()).get(); - llvmNode = - new LlvmFieldAccessRefNode( - instruction, - immediateOperand.fieldAccess(), - immediateOperand.fieldAccess().type(), - llvmType, - LlvmFieldAccessRefNode.Usage.Immediate); - } + + var llvmNodeBitwidth = llvmNode.type().asDataType().bitWidth(); + var llvmType = llvmNodeBitwidth < this.smallestRegisterClassType.getBitwidth() + ? this.smallestRegisterClassType + : ValueType.from(llvmNode.type().asDataType()).get(); + llvmNode = + new LlvmFieldAccessRefNode( + instruction, + immediateOperand.fieldAccess(), + immediateOperand.fieldAccess().type(), + llvmType, + LlvmFieldAccessRefNode.Usage.Immediate); operands.set(i, new TableGenInstructionImmediateOperand(llvmNode)); } else if (operand instanceof GcbInstructionImmediateOperand immediateOperand @@ -323,7 +307,7 @@ protected void replaceNode(PrintableInstruction instruction, Node node) { } protected LcbNodeReplacementHandler getReplacementHandler(PrintableInstruction instruction) { - return new LcbNodeReplacementHandler(instruction, architectureType, + return new LcbNodeReplacementHandler(instruction, architectureType, this.smallestRegisterClassType); } diff --git a/vadl/main/vadl/lcb/passes/llvmLowering/strategies/nodeLowering/LcbNodeReplacementHandler.java b/vadl/main/vadl/lcb/passes/llvmLowering/strategies/nodeLowering/LcbNodeReplacementHandler.java index 0a96bf0b2..f40796d43 100644 --- a/vadl/main/vadl/lcb/passes/llvmLowering/strategies/nodeLowering/LcbNodeReplacementHandler.java +++ b/vadl/main/vadl/lcb/passes/llvmLowering/strategies/nodeLowering/LcbNodeReplacementHandler.java @@ -63,9 +63,7 @@ import vadl.types.BuiltInTable; import vadl.types.DataType; import vadl.viam.Constant; -import vadl.viam.Instruction; import vadl.viam.PrintableInstruction; -import vadl.viam.annotations.FieldAccessAnnotation; import vadl.viam.graph.Node; import vadl.viam.graph.control.BranchBeginNode; import vadl.viam.graph.control.BranchEndNode; @@ -437,19 +435,9 @@ public void handle(FieldAccessRefNode fieldAccessRefNode) { var llvmType = ValueType.from(CppTypeMap.upcast(originalType)).orElseThrow(() -> Diagnostic.error("Cannot construct LLVM type", fieldAccessRefNode.location()).build()); - if (printableInstruction instanceof Instruction instruction && instruction.hasAnnotation( - FieldAccessAnnotation.class)) { - var annotation = instruction.annotation(FieldAccessAnnotation.class); - ensureNonNull(annotation, - () -> Diagnostic.error("Expected to have FieldAccessAnnotation", instruction.location())); - - llvmType = ValueType.from(CppTypeMap.upcast(annotation.resultBitWidth())).orElseThrow(() -> - Diagnostic.error("Cannot construct LLVM type", fieldAccessRefNode.location()).build()); - } else { - llvmType = llvmType.getBitwidth() < this.smallestRegisterClassType.getBitwidth() + llvmType = llvmType.getBitwidth() < this.smallestRegisterClassType.getBitwidth() ? this.smallestRegisterClassType : llvmType; - } fieldAccessRefNode.replaceAndDelete( new LlvmFieldAccessRefNode( diff --git a/vadl/main/vadl/viam/annotations/FieldAccessAnnotation.java b/vadl/main/vadl/viam/annotations/FieldAccessAnnotation.java deleted file mode 100644 index c550a7129..000000000 --- a/vadl/main/vadl/viam/annotations/FieldAccessAnnotation.java +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText : © 2026 TU Wien -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program 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 for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package vadl.viam.annotations; - -import vadl.types.UIntType; -import vadl.viam.Annotation; -import vadl.viam.Format; -import vadl.viam.Instruction; - - -/** - * The {@code [ upcast access to : , ]} annotation that can be set on an instruction - * to mark that the field access should have the type {@code }. - */ -public class FieldAccessAnnotation extends Annotation { - - private final UIntType resultBitWidth; - private final Format.FieldAccess field; - - public FieldAccessAnnotation(Format.FieldAccess field, UIntType resultBitWidth) { - this.resultBitWidth = resultBitWidth; - this.field = field; - } - - @Override - public Class parentDefinitionClass() { - return Instruction.class; - } - - - public UIntType resultBitWidth() { - return resultBitWidth; - } - - public Format.FieldAccess field() { - return field; - } -}