aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/prefix-ds-dq.c
blob: 3f477a07cb3263ca05cf095695f7cb5724b31e3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/* { dg-do compile } */
/* { dg-require-effective-target powerpc_prefixed_addr } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
/* If -mstrict-align is enabled by default, we don't get the expected opcodes.
   { dg-additional-options "-mno-strict-align" { target opt_mstrict_align } } */

/* Tests whether we generate a prefixed load/store operation for addresses that
   don't meet DS/DQ offset constraints.  64-bit is needed for testing the use
   of the PLWA instruciton.  */

struct packed_struct
{
  long long pad;			/* offset  0 bytes.  */
  unsigned char pad_uc;			/* offset  8 bytes.  */
  unsigned char uc;			/* offset  9 bytes.  */

  unsigned char pad_sc[sizeof (long long) - sizeof (unsigned char)];
  unsigned char sc;			/* offset  17 bytes.  */

  unsigned char pad_us[sizeof (long long) - sizeof (signed char)];
  unsigned short us;			/* offset  25 bytes.  */

  unsigned char pad_ss[sizeof (long long) - sizeof (unsigned short)];
  short ss;				/* offset 33 bytes.  */

  unsigned char pad_ui[sizeof (long long) - sizeof (short)];
  unsigned int ui;			/* offset 41 bytes.  */

  unsigned char pad_si[sizeof (long long) - sizeof (unsigned int)];
  unsigned int si;			/* offset 49 bytes.  */

  unsigned char pad_f[sizeof (long long) - sizeof (int)];
  float f;				/* offset 57 bytes.  */

  unsigned char pad_d[sizeof (long long) - sizeof (float)];
  double d;				/* offset 65 bytes.  */
  __float128 f128;			/* offset 73 bytes.  */
} __attribute__((packed));

unsigned char
load_uc (struct packed_struct *p)
{
  return p->uc;				/* LBZ 3,9(3).  */
}

signed char
load_sc (struct packed_struct *p)
{
  return p->sc;				/* LBZ 3,17(3) + EXTSB 3,3.  */
}

unsigned short
load_us (struct packed_struct *p)
{
  return p->us;				/* LHZ 3,25(3).  */
}

short
load_ss (struct packed_struct *p)
{
  return p->ss;				/* LHA 3,33(3).  */
}

unsigned int
load_ui (struct packed_struct *p)
{
  return p->ui;				/* LWZ 3,41(3).  */
}

int
load_si (struct packed_struct *p)
{
  return p->si;				/* PLWA 3,49(3).  */
}

float
load_float (struct packed_struct *p)
{
  return p->f;				/* LFS 1,57(3).  */
}

double
load_double (struct packed_struct *p)
{
  return p->d;				/* LFD 1,65(3).  */
}

__float128
load_float128 (struct packed_struct *p)
{
  return p->f128;			/* PLXV 34,73(3).  */
}

void
store_uc (struct packed_struct *p, unsigned char uc)
{
  p->uc = uc;				/* STB 4,9(3).  */
}

void
store_sc (struct packed_struct *p, signed char sc)
{
  p->sc = sc;				/* STB 4,17(3).  */
}

void
store_us (struct packed_struct *p, unsigned short us)
{
  p->us = us;				/* STH 4,25(3).  */
}

void
store_ss (struct packed_struct *p, signed short ss)
{
  p->ss = ss;				/* STH 4,33(3).  */
}

void
store_ui (struct packed_struct *p, unsigned int ui)
{
  p->ui = ui;				/* STW 4,41(3).  */
}

void
store_si (struct packed_struct *p, signed int si)
{
  p->si = si;				/* STW 4,49(3).  */
}

void
store_float (struct packed_struct *p, float f)
{
  p->f = f;				/* STFS 1,57(3).  */
}

void
store_double (struct packed_struct *p, double d)
{
  p->d = d;				/* STFD 1,65(3).  */
}

void
store_float128 (struct packed_struct *p, __float128 f128)
{
  p->f128 = f128;			/* PSTXV 34,1(3).  */
}

/* { dg-final { scan-assembler-times {\mextsb\M} 1 } } */
/* { dg-final { scan-assembler-times {\mlbz\M}   2 } } */
/* { dg-final { scan-assembler-times {\mlfd\M}   1 } } */
/* { dg-final { scan-assembler-times {\mlfs\M}   1 } } */
/* { dg-final { scan-assembler-times {\mlha\M}   1 } } */
/* { dg-final { scan-assembler-times {\mlhz\M}   1 } } */
/* { dg-final { scan-assembler-times {\mlwz\M}   1 } } */
/* { dg-final { scan-assembler-times {\mplwa\M}  1 } } */
/* { dg-final { scan-assembler-times {\mplxv\M}  1 } } */
/* { dg-final { scan-assembler-times {\mpstxv\M} 1 } } */
/* { dg-final { scan-assembler-times {\mstb\M}   2 } } */
/* { dg-final { scan-assembler-times {\mstfd\M}  1 } } */
/* { dg-final { scan-assembler-times {\mstfs\M}  1 } } */
/* { dg-final { scan-assembler-times {\msth\M}   2 } } */
/* { dg-final { scan-assembler-times {\mstw\M}   2 } } */