interp: move some often-repeated code into a function

Этот коммит содержится в:
Ayke van Laethem 2023-05-20 17:14:01 +02:00 коммит произвёл Ron Evans
родитель 2fb866ca86
коммит 54c07b7de8
2 изменённых файлов: 20 добавлений и 44 удалений

Просмотреть файл

@ -346,16 +346,7 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
dstObj.buffer = dstBuf dstObj.buffer = dstBuf
mem.put(dst.index(), dstObj) mem.put(dst.index(), dstObj)
} }
switch inst.llvmInst.Type().IntTypeWidth() { locals[inst.localIndex] = makeLiteralInt(n, inst.llvmInst.Type().IntTypeWidth())
case 16:
locals[inst.localIndex] = literalValue{uint16(n)}
case 32:
locals[inst.localIndex] = literalValue{uint32(n)}
case 64:
locals[inst.localIndex] = literalValue{uint64(n)}
default:
panic("unknown integer type width")
}
case strings.HasPrefix(callFn.name, "llvm.memcpy.p0") || strings.HasPrefix(callFn.name, "llvm.memmove.p0"): case strings.HasPrefix(callFn.name, "llvm.memcpy.p0") || strings.HasPrefix(callFn.name, "llvm.memmove.p0"):
// Copy a block of memory from one pointer to another. // Copy a block of memory from one pointer to another.
dst, err := operands[1].asPointer(r) dst, err := operands[1].asPointer(r)
@ -647,16 +638,7 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
} }
// GEP on fixed pointer value (for example, memory-mapped I/O). // GEP on fixed pointer value (for example, memory-mapped I/O).
ptrValue := operands[0].Uint() + offset ptrValue := operands[0].Uint() + offset
switch operands[0].len(r) { locals[inst.localIndex] = makeLiteralInt(ptrValue, int(operands[0].len(r)*8))
case 8:
locals[inst.localIndex] = literalValue{uint64(ptrValue)}
case 4:
locals[inst.localIndex] = literalValue{uint32(ptrValue)}
case 2:
locals[inst.localIndex] = literalValue{uint16(ptrValue)}
default:
panic("pointer operand is not of a known pointer size")
}
continue continue
} }
ptr = ptr.addOffset(int64(offset)) ptr = ptr.addOffset(int64(offset))
@ -810,18 +792,7 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
default: default:
panic("unreachable") panic("unreachable")
} }
switch lhs.len(r) { locals[inst.localIndex] = makeLiteralInt(result, int(lhs.len(r)*8))
case 8:
locals[inst.localIndex] = literalValue{result}
case 4:
locals[inst.localIndex] = literalValue{uint32(result)}
case 2:
locals[inst.localIndex] = literalValue{uint16(result)}
case 1:
locals[inst.localIndex] = literalValue{uint8(result)}
default:
panic("unknown integer size")
}
if r.debug { if r.debug {
fmt.Fprintln(os.Stderr, indent+instructionNameMap[inst.opcode]+":", lhs, rhs, "->", result) fmt.Fprintln(os.Stderr, indent+instructionNameMap[inst.opcode]+":", lhs, rhs, "->", result)
} }
@ -843,18 +814,7 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
if r.debug { if r.debug {
fmt.Fprintln(os.Stderr, indent+instructionNameMap[inst.opcode]+":", value, bitwidth) fmt.Fprintln(os.Stderr, indent+instructionNameMap[inst.opcode]+":", value, bitwidth)
} }
switch bitwidth { locals[inst.localIndex] = makeLiteralInt(value, int(bitwidth))
case 64:
locals[inst.localIndex] = literalValue{value}
case 32:
locals[inst.localIndex] = literalValue{uint32(value)}
case 16:
locals[inst.localIndex] = literalValue{uint16(value)}
case 8:
locals[inst.localIndex] = literalValue{uint8(value)}
default:
panic("unknown integer size in sext/zext/trunc")
}
case llvm.SIToFP, llvm.UIToFP: case llvm.SIToFP, llvm.UIToFP:
var value float64 var value float64
switch inst.opcode { switch inst.opcode {

Просмотреть файл

@ -373,6 +373,22 @@ type literalValue struct {
value interface{} value interface{}
} }
// Make a literalValue given the number of bits.
func makeLiteralInt(value uint64, bits int) literalValue {
switch bits {
case 64:
return literalValue{value}
case 32:
return literalValue{uint32(value)}
case 16:
return literalValue{uint16(value)}
case 8:
return literalValue{uint8(value)}
default:
panic("unknown integer size")
}
}
func (v literalValue) len(r *runner) uint32 { func (v literalValue) len(r *runner) uint32 {
switch v.value.(type) { switch v.value.(type) {
case uint64: case uint64: