mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-07-26 06:38:42 +00:00
tools: use byte padding to skip unused register ranges
This simplifies the code. The fields are blank anyway so there is no way to access them anyway (volatile or not). Also do some other related simplifications of the code that result from this change.
This commit is contained in:
committed by
Ron Evans
parent
525ded3d90
commit
dffb9fbfa7
@@ -668,8 +668,7 @@ var (
|
||||
}
|
||||
|
||||
var regType string
|
||||
eSize := register.elementSize
|
||||
switch eSize {
|
||||
switch register.elementSize {
|
||||
case 4:
|
||||
regType = "volatile.Register32"
|
||||
case 2:
|
||||
@@ -677,27 +676,16 @@ var (
|
||||
case 1:
|
||||
regType = "volatile.Register8"
|
||||
default:
|
||||
eSize = 4
|
||||
regType = "volatile.Register32"
|
||||
}
|
||||
|
||||
// insert padding, if needed
|
||||
if address < register.address {
|
||||
bytesNeeded := register.address - address
|
||||
switch bytesNeeded {
|
||||
case 1:
|
||||
w.WriteString("\t_ volatile.Register8\n")
|
||||
case 2:
|
||||
w.WriteString("\t_ volatile.Register16\n")
|
||||
case 3:
|
||||
w.WriteString("\t_ [3]volatile.Register8\n")
|
||||
default:
|
||||
numSkip := (register.address - address) / uint64(eSize)
|
||||
if numSkip == 1 {
|
||||
fmt.Fprintf(w, "\t_ %s\n", regType)
|
||||
} else {
|
||||
fmt.Fprintf(w, "\t_ [%d]%s\n", numSkip, regType)
|
||||
}
|
||||
if bytesNeeded == 1 {
|
||||
w.WriteString("\t_ byte\n")
|
||||
} else {
|
||||
fmt.Fprintf(w, "\t_ [%d]byte\n", bytesNeeded)
|
||||
}
|
||||
address = register.address
|
||||
}
|
||||
@@ -707,9 +695,8 @@ var (
|
||||
// This is a cluster, not a register. Create the cluster type.
|
||||
regType = "struct {\n"
|
||||
subaddress := register.address
|
||||
var subregSize uint64
|
||||
var subregType string
|
||||
for _, subregister := range register.registers {
|
||||
var subregType string
|
||||
switch subregister.elementSize {
|
||||
case 4:
|
||||
subregType = "volatile.Register32"
|
||||
@@ -728,21 +715,13 @@ var (
|
||||
if subaddress != subregister.address {
|
||||
bytesNeeded := subregister.address - subaddress
|
||||
if bytesNeeded == 1 {
|
||||
regType += "\t\t_ volatile.Register8\n"
|
||||
} else if bytesNeeded == 2 {
|
||||
regType += "\t\t_ volatile.Register16\n"
|
||||
regType += "\t\t_ byte\n"
|
||||
} else {
|
||||
numSkip := (subregister.address - subaddress)
|
||||
if numSkip < 1 {
|
||||
continue
|
||||
} else if numSkip == 1 {
|
||||
regType += "\t\t_ volatile.Register8\n"
|
||||
} else {
|
||||
regType += fmt.Sprintf("\t\t_ [%d]volatile.Register8\n", numSkip)
|
||||
}
|
||||
regType += fmt.Sprintf("\t\t_ [%d]byte\n", bytesNeeded)
|
||||
}
|
||||
subaddress += bytesNeeded
|
||||
}
|
||||
var subregSize uint64
|
||||
if subregister.array != -1 {
|
||||
subregSize = uint64(subregister.array * subregister.elementSize)
|
||||
} else {
|
||||
@@ -753,11 +732,11 @@ var (
|
||||
}
|
||||
if register.array != -1 {
|
||||
if subaddress != register.address+uint64(register.elementSize) {
|
||||
numSkip := ((register.address + uint64(register.elementSize)) - subaddress) / subregSize
|
||||
if numSkip <= 1 {
|
||||
regType += fmt.Sprintf("\t\t_ %s\n", subregType)
|
||||
bytesNeeded := (register.address + uint64(register.elementSize)) - subaddress
|
||||
if bytesNeeded == 1 {
|
||||
regType += "\t_ byte\n"
|
||||
} else {
|
||||
regType += fmt.Sprintf("\t\t_ [%d]%s\n", numSkip, subregType)
|
||||
regType += fmt.Sprintf("\t_ [%d]byte\n", bytesNeeded)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user