]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/internal/obj/riscv/asm_test.go
[dev.link] all: merge branch 'master' into dev.link
[gostls13.git] / src / cmd / internal / obj / riscv / asm_test.go
1 // Copyright 2019 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package riscv
6
7 import (
8         "bytes"
9         "fmt"
10         "internal/testenv"
11         "io/ioutil"
12         "os"
13         "os/exec"
14         "path/filepath"
15         "testing"
16 )
17
18 // TestLarge generates a very large file to verify that large
19 // program builds successfully, in particular, too-far
20 // conditional branches are fixed.
21 func TestLarge(t *testing.T) {
22         if testing.Short() {
23                 t.Skip("Skip in short mode")
24         }
25         testenv.MustHaveGoBuild(t)
26
27         dir, err := ioutil.TempDir("", "testlarge")
28         if err != nil {
29                 t.Fatalf("could not create directory: %v", err)
30         }
31         defer os.RemoveAll(dir)
32
33         // Generate a very large function.
34         buf := bytes.NewBuffer(make([]byte, 0, 7000000))
35         gen(buf)
36
37         tmpfile := filepath.Join(dir, "x.s")
38         err = ioutil.WriteFile(tmpfile, buf.Bytes(), 0644)
39         if err != nil {
40                 t.Fatalf("can't write output: %v\n", err)
41         }
42
43         // Build generated file.
44         cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile)
45         cmd.Env = append(os.Environ(), "GOARCH=riscv64", "GOOS=linux")
46         out, err := cmd.CombinedOutput()
47         if err != nil {
48                 t.Errorf("Build failed: %v, output: %s", err, out)
49         }
50 }
51
52 // gen generates a very large program, with a very far conditional branch.
53 func gen(buf *bytes.Buffer) {
54         fmt.Fprintln(buf, "TEXT f(SB),0,$0-0")
55         fmt.Fprintln(buf, "BEQ X0, X0, label")
56         for i := 0; i < 1<<19; i++ {
57                 fmt.Fprintln(buf, "ADD $0, X0, X0")
58         }
59         fmt.Fprintln(buf, "label:")
60         fmt.Fprintln(buf, "ADD $0, X0, X0")
61 }
62
63 // Issue 20348.
64 func TestNoRet(t *testing.T) {
65         dir, err := ioutil.TempDir("", "testnoret")
66         if err != nil {
67                 t.Fatal(err)
68         }
69         defer os.RemoveAll(dir)
70         tmpfile := filepath.Join(dir, "x.s")
71         if err := ioutil.WriteFile(tmpfile, []byte("TEXT ·stub(SB),$0-0\nNOP\n"), 0644); err != nil {
72                 t.Fatal(err)
73         }
74         cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile)
75         cmd.Env = append(os.Environ(), "GOARCH=riscv64", "GOOS=linux")
76         if out, err := cmd.CombinedOutput(); err != nil {
77                 t.Errorf("%v\n%s", err, out)
78         }
79 }
80
81 func TestImmediateSplitting(t *testing.T) {
82         dir, err := ioutil.TempDir("", "testimmsplit")
83         if err != nil {
84                 t.Fatal(err)
85         }
86         defer os.RemoveAll(dir)
87         tmpfile := filepath.Join(dir, "x.s")
88         asm := `
89 TEXT _stub(SB),$0-0
90         LB      4096(X5), X6
91         LH      4096(X5), X6
92         LW      4096(X5), X6
93         LD      4096(X5), X6
94         LBU     4096(X5), X6
95         LHU     4096(X5), X6
96         LWU     4096(X5), X6
97         SB      X6, 4096(X5)
98         SH      X6, 4096(X5)
99         SW      X6, 4096(X5)
100         SD      X6, 4096(X5)
101
102         FLW     4096(X5), F6
103         FLD     4096(X5), F6
104         FSW     F6, 4096(X5)
105         FSD     F6, 4096(X5)
106
107         MOVB    4096(X5), X6
108         MOVH    4096(X5), X6
109         MOVW    4096(X5), X6
110         MOV     4096(X5), X6
111         MOVBU   4096(X5), X6
112         MOVHU   4096(X5), X6
113         MOVWU   4096(X5), X6
114
115         MOVB    X6, 4096(X5)
116         MOVH    X6, 4096(X5)
117         MOVW    X6, 4096(X5)
118         MOV     X6, 4096(X5)
119
120         MOVF    4096(X5), F6
121         MOVD    4096(X5), F6
122         MOVF    F6, 4096(X5)
123         MOVD    F6, 4096(X5)
124 `
125         if err := ioutil.WriteFile(tmpfile, []byte(asm), 0644); err != nil {
126                 t.Fatal(err)
127         }
128         cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile)
129         cmd.Env = append(os.Environ(), "GOARCH=riscv64", "GOOS=linux")
130         if out, err := cmd.CombinedOutput(); err != nil {
131                 t.Errorf("%v\n%s", err, out)
132         }
133 }