@@ -116,8 +116,6 @@ var optabBase = []Optab{
116
116
/* move register */
117
117
{as : AADD , a1 : C_REG , a2 : C_REG , a6 : C_REG , type_ : 2 , size : 4 },
118
118
{as : AADD , a1 : C_REG , a6 : C_REG , type_ : 2 , size : 4 },
119
- {as : AADD , a1 : C_U15CON , a2 : C_REG , a6 : C_REG , type_ : 4 , size : 4 },
120
- {as : AADD , a1 : C_U15CON , a6 : C_REG , type_ : 4 , size : 4 },
121
119
{as : AADD , a1 : C_S16CON , a2 : C_REG , a6 : C_REG , type_ : 4 , size : 4 },
122
120
{as : AADD , a1 : C_S16CON , a6 : C_REG , type_ : 4 , size : 4 },
123
121
{as : AADD , a1 : C_U16CON , a2 : C_REG , a6 : C_REG , type_ : 22 , size : 8 },
@@ -146,8 +144,6 @@ var optabBase = []Optab{
146
144
{as : AMULLW , a1 : C_REG , a6 : C_REG , type_ : 2 , size : 4 },
147
145
{as : AMULLW , a1 : C_S16CON , a2 : C_REG , a6 : C_REG , type_ : 4 , size : 4 },
148
146
{as : AMULLW , a1 : C_S16CON , a6 : C_REG , type_ : 4 , size : 4 },
149
- {as : AMULLW , a1 : C_U16CON , a2 : C_REG , a6 : C_REG , type_ : 4 , size : 4 },
150
- {as : AMULLW , a1 : C_U16CON , a6 : C_REG , type_ : 4 , size : 4 },
151
147
{as : AMULLW , a1 : C_32CON , a2 : C_REG , a6 : C_REG , type_ : 22 , size : 12 },
152
148
{as : AMULLW , a1 : C_32CON , a6 : C_REG , type_ : 22 , size : 12 },
153
149
{as : ASUBC , a1 : C_REG , a2 : C_REG , a6 : C_REG , type_ : 10 , size : 4 },
@@ -232,8 +228,7 @@ var optabBase = []Optab{
232
228
{as : AMOVBZ , a1 : C_REG , a6 : C_XOREG , type_ : 108 , size : 4 },
233
229
{as : AMOVBZ , a1 : C_REG , a6 : C_REG , type_ : 13 , size : 4 },
234
230
235
- {as : AMOVD , a1 : C_S16CON , a6 : C_REG , type_ : 3 , size : 4 },
236
- {as : AMOVD , a1 : C_U16CON , a6 : C_REG , type_ : 3 , size : 4 },
231
+ {as : AMOVD , a1 : C_16CON , a6 : C_REG , type_ : 3 , size : 4 },
237
232
{as : AMOVD , a1 : C_SACON , a6 : C_REG , type_ : 3 , size : 4 },
238
233
{as : AMOVD , a1 : C_SOREG , a6 : C_REG , type_ : 8 , size : 4 },
239
234
{as : AMOVD , a1 : C_XOREG , a6 : C_REG , type_ : 109 , size : 4 },
@@ -245,8 +240,7 @@ var optabBase = []Optab{
245
240
{as : AMOVD , a1 : C_REG , a6 : C_SPR , type_ : 66 , size : 4 },
246
241
{as : AMOVD , a1 : C_REG , a6 : C_REG , type_ : 13 , size : 4 },
247
242
248
- {as : AMOVW , a1 : C_S16CON , a6 : C_REG , type_ : 3 , size : 4 },
249
- {as : AMOVW , a1 : C_U16CON , a6 : C_REG , type_ : 3 , size : 4 },
243
+ {as : AMOVW , a1 : C_16CON , a6 : C_REG , type_ : 3 , size : 4 },
250
244
{as : AMOVW , a1 : C_SACON , a6 : C_REG , type_ : 3 , size : 4 },
251
245
{as : AMOVW , a1 : C_CREG , a6 : C_REG , type_ : 68 , size : 4 },
252
246
{as : AMOVW , a1 : C_SOREG , a6 : C_REG , type_ : 8 , size : 4 },
@@ -391,9 +385,7 @@ var optabBase = []Optab{
391
385
{as : AVSEL , a1 : C_VREG , a2 : C_VREG , a3 : C_VREG , a6 : C_VREG , type_ : 83 , size : 4 }, /* vector select, va-form */
392
386
393
387
/* Vector splat */
394
- {as : AVSPLTB , a1 : C_U15CON , a2 : C_VREG , a6 : C_VREG , type_ : 82 , size : 4 }, /* vector splat, vx-form */
395
388
{as : AVSPLTB , a1 : C_S16CON , a2 : C_VREG , a6 : C_VREG , type_ : 82 , size : 4 },
396
- {as : AVSPLTISB , a1 : C_U15CON , a6 : C_VREG , type_ : 82 , size : 4 }, /* vector splat immediate, vx-form */
397
389
{as : AVSPLTISB , a1 : C_S16CON , a6 : C_VREG , type_ : 82 , size : 4 },
398
390
399
391
/* Vector AES */
@@ -2544,34 +2536,26 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) {
2544
2536
}
2545
2537
o1 = AOP_RRR (c .oprrr (p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (p .From .Reg ))
2546
2538
2547
- case 3 : /* mov $soreg/addcon/andcon/ucon , r ==> addis/oris/ addi/ori $i,reg',r */
2539
+ case 3 : /* mov $soreg/16con , r ==> addi/ori $i,reg',r */
2548
2540
d := c .vregoff (& p .From )
2549
2541
2550
2542
v := int32 (d )
2551
2543
r := int (p .From .Reg )
2552
- // p.From may be a constant value or an offset(reg) type argument.
2553
- isZeroOrR0 := r & 0x1f == 0
2554
2544
2555
2545
if r0iszero != 0 /*TypeKind(100016)*/ && p .To .Reg == 0 && (r != 0 || v != 0 ) {
2556
2546
c .ctxt .Diag ("literal operation on R0\n %v" , p )
2557
2547
}
2558
- a := OP_ADDI
2559
- if int64 (int16 (d )) != d {
2560
- // Operand is 16 bit value with sign bit set
2561
- if o .a1 == C_U16CON {
2562
- // Needs unsigned 16 bit so use ORI
2563
- if isZeroOrR0 {
2564
- o1 = LOP_IRR (uint32 (OP_ORI ), uint32 (p .To .Reg ), uint32 (0 ), uint32 (v ))
2565
- break
2566
- }
2567
- // With S16CON, needs signed 16 bit value, fall through to use ADDI
2568
- } else if o .a1 != C_S16CON {
2569
- log .Fatalf ("invalid handling of %v" , p )
2548
+ if int64 (int16 (d )) == d {
2549
+ // MOVD $int16, Ry or MOVD $offset(Rx), Ry
2550
+ o1 = AOP_IRR (uint32 (OP_ADDI ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v ))
2551
+ } else {
2552
+ // MOVD $uint16, Ry
2553
+ if int64 (uint16 (d )) != d || (r != 0 && r != REGZERO ) {
2554
+ c .ctxt .Diag ("Rule expects a uint16 constant load. got:\n %v" , p )
2570
2555
}
2556
+ o1 = LOP_IRR (uint32 (OP_ORI ), uint32 (p .To .Reg ), uint32 (0 ), uint32 (v ))
2571
2557
}
2572
2558
2573
- o1 = AOP_IRR (uint32 (a ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v ))
2574
-
2575
2559
case 4 : /* add/mul $scon,[r1],r2 */
2576
2560
v := c .regoff (& p .From )
2577
2561
0 commit comments