1
0
mirror of https://github.com/taigrr/gopher-os synced 2025-01-18 04:43:13 -08:00

acpi: define helper functions for working with opcode groups

This commit is contained in:
Achilleas Anagnostopoulos 2018-02-27 08:37:55 +00:00
parent b1e959ec4d
commit ca1682c431
2 changed files with 174 additions and 0 deletions

View File

@ -130,3 +130,69 @@ const (
// Sentinel value to indicate freed objects // Sentinel value to indicate freed objects
pOpIntFreedObject = uint16(0xff + 0xff) pOpIntFreedObject = uint16(0xff + 0xff)
) )
// pOpIsLocalArg returns true if this opcode represents any of the supported local
// function args 0 to 7.
func pOpIsLocalArg(op uint16) bool {
return op >= pOpLocal0 && op <= pOpLocal7
}
// pOpIsMethodArg returns true if this opcode represents any of the supported
// input function args 0 to 6.
func pOpIsMethodArg(op uint16) bool {
return op >= pOpArg0 && op <= pOpArg6
}
// pOpIsArg returns true if this opcode is either a local or a method arg.
func pOpIsArg(op uint16) bool {
return pOpIsLocalArg(op) || pOpIsMethodArg(op)
}
// pOpIsType2 returns true if this is a Type2Opcode.
//
// Grammar:
// Type2Opcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat |
// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement |
// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit |
// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual |
// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid |
// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod |
// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr |
// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight |
// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer |
// DefToDecimalString | DefToHexString | DefToInteger | DefToString |
// DefWait | DefXOr
func pOpIsType2(op uint16) bool {
switch op {
case pOpAcquire, pOpAdd, pOpAnd, pOpBuffer, pOpConcat,
pOpConcatRes, pOpCondRefOf, pOpCopyObject, pOpDecrement,
pOpDerefOf, pOpDivide, pOpFindSetLeftBit, pOpFindSetRightBit,
pOpFromBCD, pOpIncrement, pOpIndex, pOpLand, pOpLEqual,
pOpLGreater, pOpLLess, pOpMid,
pOpLnot, pOpLoadTable, pOpLor, pOpMatch, pOpMod,
pOpMultiply, pOpNand, pOpNor, pOpNot, pOpObjectType, pOpOr,
pOpPackage, pOpVarPackage, pOpRefOf, pOpShiftLeft, pOpShiftRight,
pOpSizeOf, pOpStore, pOpSubtract, pOpTimer, pOpToBCD, pOpToBuffer,
pOpToDecimalString, pOpToHexString, pOpToInteger, pOpToString,
pOpWait, pOpXor:
return true
default:
return false
}
}
// pOpIsDataObject returns true if this opcode is part of a DataObject definition
//
// Grammar:
// DataObject := ComputationalData | DefPackage | DefVarPackage
// ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | ConstObj | RevisionOp | DefBuffer
// ConstObj := ZeroOp | OneOp | OnesOp
func pOpIsDataObject(op uint16) bool {
switch op {
case pOpBytePrefix, pOpWordPrefix, pOpDwordPrefix, pOpQwordPrefix, pOpStringPrefix,
pOpZero, pOpOne, pOpOnes, pOpRevision, pOpBuffer, pOpPackage, pOpVarPackage:
return true
default:
return false
}
}

View File

@ -0,0 +1,108 @@
package aml
import "testing"
func TestOpcodeIsX(t *testing.T) {
specs := []struct {
op uint16
testFn func(uint16) bool
want bool
}{
// OpIsLocalArg
{pOpLocal0, pOpIsLocalArg, true},
{pOpLocal1, pOpIsLocalArg, true},
{pOpLocal2, pOpIsLocalArg, true},
{pOpLocal3, pOpIsLocalArg, true},
{pOpLocal4, pOpIsLocalArg, true},
{pOpLocal5, pOpIsLocalArg, true},
{pOpLocal6, pOpIsLocalArg, true},
{pOpLocal7, pOpIsLocalArg, true},
{pOpArg0, pOpIsLocalArg, false},
{pOpDivide, pOpIsLocalArg, false},
// OpIsMethodArg
{pOpArg0, pOpIsMethodArg, true},
{pOpArg1, pOpIsMethodArg, true},
{pOpArg2, pOpIsMethodArg, true},
{pOpArg3, pOpIsMethodArg, true},
{pOpArg4, pOpIsMethodArg, true},
{pOpArg5, pOpIsMethodArg, true},
{pOpArg6, pOpIsMethodArg, true},
{pOpLocal7, pOpIsMethodArg, false},
{pOpIf, pOpIsMethodArg, false},
// OpIsArg
{pOpLocal5, pOpIsArg, true},
{pOpArg1, pOpIsArg, true},
{pOpDivide, pOpIsArg, false},
// OpIsType2
{pOpAcquire, pOpIsType2, true},
{pOpAdd, pOpIsType2, true},
{pOpAnd, pOpIsType2, true},
{pOpBuffer, pOpIsType2, true},
{pOpConcat, pOpIsType2, true},
{pOpConcatRes, pOpIsType2, true},
{pOpCondRefOf, pOpIsType2, true},
{pOpCopyObject, pOpIsType2, true},
{pOpDecrement, pOpIsType2, true},
{pOpDerefOf, pOpIsType2, true},
{pOpDivide, pOpIsType2, true},
{pOpFindSetLeftBit, pOpIsType2, true},
{pOpFindSetRightBit, pOpIsType2, true},
{pOpFromBCD, pOpIsType2, true},
{pOpIncrement, pOpIsType2, true},
{pOpIndex, pOpIsType2, true},
{pOpLand, pOpIsType2, true},
{pOpLEqual, pOpIsType2, true},
{pOpLGreater, pOpIsType2, true},
{pOpLLess, pOpIsType2, true},
{pOpMid, pOpIsType2, true},
{pOpLnot, pOpIsType2, true},
{pOpLoadTable, pOpIsType2, true},
{pOpLor, pOpIsType2, true},
{pOpMatch, pOpIsType2, true},
{pOpMod, pOpIsType2, true},
{pOpMultiply, pOpIsType2, true},
{pOpNand, pOpIsType2, true},
{pOpNor, pOpIsType2, true},
{pOpNot, pOpIsType2, true},
{pOpObjectType, pOpIsType2, true},
{pOpOr, pOpIsType2, true},
{pOpPackage, pOpIsType2, true},
{pOpVarPackage, pOpIsType2, true},
{pOpRefOf, pOpIsType2, true},
{pOpShiftLeft, pOpIsType2, true},
{pOpShiftRight, pOpIsType2, true},
{pOpSizeOf, pOpIsType2, true},
{pOpStore, pOpIsType2, true},
{pOpSubtract, pOpIsType2, true},
{pOpTimer, pOpIsType2, true},
{pOpToBCD, pOpIsType2, true},
{pOpToBuffer, pOpIsType2, true},
{pOpToDecimalString, pOpIsType2, true},
{pOpToHexString, pOpIsType2, true},
{pOpToInteger, pOpIsType2, true},
{pOpToString, pOpIsType2, true},
{pOpWait, pOpIsType2, true},
{pOpXor, pOpIsType2, true},
{pOpBytePrefix, pOpIsType2, false},
// OpIsDataObject
{pOpBytePrefix, pOpIsDataObject, true},
{pOpWordPrefix, pOpIsDataObject, true},
{pOpDwordPrefix, pOpIsDataObject, true},
{pOpQwordPrefix, pOpIsDataObject, true},
{pOpStringPrefix, pOpIsDataObject, true},
{pOpZero, pOpIsDataObject, true},
{pOpOne, pOpIsDataObject, true},
{pOpOnes, pOpIsDataObject, true},
{pOpRevision, pOpIsDataObject, true},
{pOpBuffer, pOpIsDataObject, true},
{pOpPackage, pOpIsDataObject, true},
{pOpVarPackage, pOpIsDataObject, true},
{pOpLor, pOpIsDataObject, false},
}
for specIndex, spec := range specs {
if got := spec.testFn(spec.op); got != spec.want {
t.Errorf("[spec %d] opcode %q: expected to get %t; got %t", specIndex, spec.op, spec.want, got)
}
}
}