xref: /openbmc/qemu/tcg/tcg-ldst.c.inc (revision 47d3878422ed0216cb1d5d69c3b929f10a008cd4)
1139c1837SPaolo Bonzini/*
2139c1837SPaolo Bonzini * TCG Backend Data: load-store optimization only.
3139c1837SPaolo Bonzini *
4139c1837SPaolo Bonzini * Permission is hereby granted, free of charge, to any person obtaining a copy
5139c1837SPaolo Bonzini * of this software and associated documentation files (the "Software"), to deal
6139c1837SPaolo Bonzini * in the Software without restriction, including without limitation the rights
7139c1837SPaolo Bonzini * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8139c1837SPaolo Bonzini * copies of the Software, and to permit persons to whom the Software is
9139c1837SPaolo Bonzini * furnished to do so, subject to the following conditions:
10139c1837SPaolo Bonzini *
11139c1837SPaolo Bonzini * The above copyright notice and this permission notice shall be included in
12139c1837SPaolo Bonzini * all copies or substantial portions of the Software.
13139c1837SPaolo Bonzini *
14139c1837SPaolo Bonzini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15139c1837SPaolo Bonzini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16139c1837SPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17139c1837SPaolo Bonzini * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18139c1837SPaolo Bonzini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19139c1837SPaolo Bonzini * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20139c1837SPaolo Bonzini * THE SOFTWARE.
21139c1837SPaolo Bonzini */
22139c1837SPaolo Bonzini
23139c1837SPaolo Bonzini/*
24139c1837SPaolo Bonzini * Generate TB finalization at the end of block
25139c1837SPaolo Bonzini */
26139c1837SPaolo Bonzini
27139c1837SPaolo Bonzinistatic bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
28139c1837SPaolo Bonzinistatic bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
29139c1837SPaolo Bonzini
30139c1837SPaolo Bonzinistatic int tcg_out_ldst_finalize(TCGContext *s)
31139c1837SPaolo Bonzini{
32139c1837SPaolo Bonzini    TCGLabelQemuLdst *lb;
33139c1837SPaolo Bonzini
34139c1837SPaolo Bonzini    /* qemu_ld/st slow paths */
35139c1837SPaolo Bonzini    QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
36139c1837SPaolo Bonzini        if (lb->is_ld
37139c1837SPaolo Bonzini            ? !tcg_out_qemu_ld_slow_path(s, lb)
38139c1837SPaolo Bonzini            : !tcg_out_qemu_st_slow_path(s, lb)) {
39139c1837SPaolo Bonzini            return -2;
40139c1837SPaolo Bonzini        }
41139c1837SPaolo Bonzini
42139c1837SPaolo Bonzini        /* Test for (pending) buffer overflow.  The assumption is that any
43139c1837SPaolo Bonzini           one operation beginning below the high water mark cannot overrun
44139c1837SPaolo Bonzini           the buffer completely.  Thus we can test for overflow after
45139c1837SPaolo Bonzini           generating code without having to check during generation.  */
46139c1837SPaolo Bonzini        if (unlikely((void *)s->code_ptr > s->code_gen_highwater)) {
47139c1837SPaolo Bonzini            return -1;
48139c1837SPaolo Bonzini        }
49139c1837SPaolo Bonzini    }
50139c1837SPaolo Bonzini    return 0;
51139c1837SPaolo Bonzini}
52139c1837SPaolo Bonzini
53139c1837SPaolo Bonzini/*
54139c1837SPaolo Bonzini * Allocate a new TCGLabelQemuLdst entry.
55139c1837SPaolo Bonzini */
56139c1837SPaolo Bonzini
57139c1837SPaolo Bonzinistatic inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
58139c1837SPaolo Bonzini{
59139c1837SPaolo Bonzini    TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
60139c1837SPaolo Bonzini
61*4745b156SRichard Henderson    memset(l, 0, sizeof(*l));
62139c1837SPaolo Bonzini    QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
63139c1837SPaolo Bonzini
64139c1837SPaolo Bonzini    return l;
65139c1837SPaolo Bonzini}
66