Skip to content

Commit b19d38a

Browse files
committed
32bit and 64bit function test
1 parent 27268b8 commit b19d38a

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

steps/4_func/main.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ func callWrapper()
1414
type funcStorage struct {
1515
code uintptr
1616
argsize uintptr
17+
retsize uintptr
1718
value int
1819
}
1920

20-
func fake(s *funcStorage, i *[2]int) int {
21+
func fake(s *funcStorage, i *[2]int) int64 {
2122
fmt.Println("in fake: ", s.value, i[0], i[1])
22-
return i[0] + 100 + s.value
23+
return int64(i[0] + 100 + s.value)
2324
}
2425

2526
var alignSize = unsafe.Sizeof(uintptr(0))
@@ -35,15 +36,20 @@ func emulate(x reflect.Value) {
3536
size = (size + alignSize - 1) &^ (alignSize - 1)
3637
toassign.argsize += size
3738
}
39+
for i := 0; i < ftype.NumOut(); i++ {
40+
size := ftype.Out(i).Size()
41+
size = (size + alignSize - 1) &^ (alignSize - 1)
42+
toassign.retsize += size
43+
}
3844
toassign.value = -5
3945
*(*unsafe.Pointer)(unsafe.Pointer(fptr)) = unsafe.Pointer(toassign)
4046
fmt.Println(toassign)
4147
}
4248

4349
func main() {
44-
var test func(int, byte, int) int
45-
var test1 func(int, int) int
46-
var test2 func(int, string) int
50+
var test func(int, byte, int) int64
51+
var test1 func(int, int) int64
52+
var test2 func(int, string) int64
4753

4854
emulate(reflect.ValueOf(&test))
4955
emulate(reflect.ValueOf(&test1))
@@ -60,5 +66,4 @@ func main() {
6066
fmt.Println("test2 1: ", test2(10, "1, 2"))
6167
fmt.Println("test2 2: ", test2(11, "2, 3"))
6268
fmt.Println("test2 3: ", test2(12, "3, 4"))
63-
6469
}

steps/4_func/main_386.s

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "textflag.h"
2+
#include "funcdata.h"
3+
#include "go_asm.h"
4+
5+
TEXT ·callWrapper(SB),NOSPLIT|WRAPPER,$16
6+
NO_LOCAL_POINTERS
7+
MOVL DX, 0(SP)
8+
LEAL argframe+0(FP), CX
9+
MOVL CX, 4(SP)
10+
CALL ·fake(SB)
11+
12+
MOVL SP, AX
13+
ADDL $16+4, AX
14+
MOVL 0(SP), CX
15+
MOVL funcStorage_argsize(CX), DX
16+
ADDL DX, AX
17+
MOVL funcStorage_retsize(CX), DX
18+
MOVL SP, CX
19+
ADDL $8, CX
20+
21+
next:
22+
MOVL (CX), BX
23+
MOVL BX, (AX)
24+
25+
ADDL $4, CX
26+
ADDL $4, AX
27+
SUBL $4, DX
28+
29+
TESTL DX, DX
30+
JNE next
31+
32+
RET
File renamed without changes.

0 commit comments

Comments
 (0)