From 91bafc0867efbd5176655cb942a6b9ff5edc654d Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sat, 8 Feb 2025 14:44:13 +0100 Subject: [PATCH] Added generic types to sizeof --- src/asmc/resolvePointers.go | 2 +- src/register/RegisterNumber.go | 2 +- src/sizeof/Signed.go | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/asmc/resolvePointers.go b/src/asmc/resolvePointers.go index 9f62e54..748af18 100644 --- a/src/asmc/resolvePointers.go +++ b/src/asmc/resolvePointers.go @@ -16,7 +16,7 @@ restart: for i, pointer := range c.codePointers { address := pointer.Resolve() - if sizeof.Signed(int64(address)) > int(pointer.Size) { + if sizeof.Signed(address) > int(pointer.Size) { left := c.code[:pointer.Position-Address(pointer.OpSize)] right := c.code[pointer.Position+Address(pointer.Size):] size := pointer.Size + pointer.OpSize diff --git a/src/register/RegisterNumber.go b/src/register/RegisterNumber.go index a97dd8b..23aa23f 100644 --- a/src/register/RegisterNumber.go +++ b/src/register/RegisterNumber.go @@ -16,7 +16,7 @@ func (f *Machine) RegisterNumber(mnemonic asm.Mnemonic, a cpu.Register, b int) { } // If the number only needs 32 bits, we can encode the instruction. - if sizeof.Signed(int64(b)) <= 4 { + if sizeof.Signed(b) <= 4 { f.Assembler.RegisterNumber(mnemonic, a, b) f.postInstruction() return diff --git a/src/sizeof/Signed.go b/src/sizeof/Signed.go index a0fee4a..c3049a2 100644 --- a/src/sizeof/Signed.go +++ b/src/sizeof/Signed.go @@ -3,15 +3,17 @@ package sizeof import "math" // Signed tells you how many bytes are needed to encode this signed number. -func Signed(number int64) int { +func Signed[T int | int8 | int16 | int32 | int64](number T) int { + x := int64(number) + switch { - case number >= math.MinInt8 && number <= math.MaxInt8: + case x >= math.MinInt8 && x <= math.MaxInt8: return 1 - case number >= math.MinInt16 && number <= math.MaxInt16: + case x >= math.MinInt16 && x <= math.MaxInt16: return 2 - case number >= math.MinInt32 && number <= math.MaxInt32: + case x >= math.MinInt32 && x <= math.MaxInt32: return 4 default: