Optab{ACSG, C_REG, C_REG, C_NONE, C_SOREG, 79, 0},
// floating point
- Optab{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 2, 0},
- Optab{AFADD, C_FREG, C_FREG, C_NONE, C_FREG, 2, 0},
+ Optab{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 32, 0},
Optab{AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 0},
Optab{AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 0},
- Optab{AFMADD, C_FREG, C_FREG, C_FREG, C_FREG, 34, 0},
+ Optab{AFMADD, C_FREG, C_FREG, C_NONE, C_FREG, 34, 0},
Optab{AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 0},
- Optab{AFMUL, C_FREG, C_FREG, C_NONE, C_FREG, 32, 0},
Optab{AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, REGSP},
Optab{AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 0},
Optab{AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 0},
opset(AFMADDS, r)
opset(AFMSUB, r)
opset(AFMSUBS, r)
- opset(AFNMADD, r)
- opset(AFNMADDS, r)
- opset(AFNMSUB, r)
- opset(AFNMSUBS, r)
case AFMUL:
opset(AFMULS, r)
case AFCMPO:
opcode = op_DSGR
case ADIVDU, AMODDU:
opcode = op_DLGR
- case AFADD:
- opcode = op_ADBR
- case AFADDS:
- opcode = op_AEBR
- case AFSUB:
- opcode = op_SDBR
- case AFSUBS:
- opcode = op_SEBR
- case AFDIV:
- opcode = op_DDBR
- case AFDIVS:
- opcode = op_DEBR
}
switch p.As {
zRRE(opcode, REGTMP, uint32(p.From.Reg), asm)
zRRE(op_LGR, uint32(p.To.Reg), REGTMP, asm)
- case AFADD, AFADDS:
- if r == p.To.Reg {
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- } else if p.From.Reg == p.To.Reg {
- zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
- } else {
- zRR(op_LDR, uint32(p.To.Reg), uint32(r), asm)
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- }
-
- case AFSUB, AFSUBS, AFDIV, AFDIVS:
- if r == p.To.Reg {
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- } else if p.From.Reg == p.To.Reg {
- zRRE(op_LGDR, REGTMP, uint32(r), asm)
- zRRE(opcode, uint32(r), uint32(p.From.Reg), asm)
- zRR(op_LDR, uint32(p.To.Reg), uint32(r), asm)
- zRRE(op_LDGR, uint32(r), REGTMP, asm)
- } else {
- zRR(op_LDR, uint32(p.To.Reg), uint32(r), asm)
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- }
-
}
case 3: // mov $constant reg
uint8(wd>>8),
uint8(wd))
- case 32: // fmul freg [freg] freg
- r := int(p.Reg)
- if r == 0 {
- r = int(p.To.Reg)
- }
-
+ case 32: // float op freg freg
var opcode uint32
-
switch p.As {
default:
ctxt.Diag("invalid opcode")
+ case AFADD:
+ opcode = op_ADBR
+ case AFADDS:
+ opcode = op_AEBR
+ case AFDIV:
+ opcode = op_DDBR
+ case AFDIVS:
+ opcode = op_DEBR
case AFMUL:
opcode = op_MDBR
case AFMULS:
opcode = op_MEEBR
+ case AFSUB:
+ opcode = op_SDBR
+ case AFSUBS:
+ opcode = op_SEBR
}
-
- if r == int(p.To.Reg) {
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- } else if p.From.Reg == p.To.Reg {
- zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
- } else {
- zRR(op_LDR, uint32(p.To.Reg), uint32(r), asm)
- zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
- }
+ zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
case 33: // float op [freg] freg
r := p.From.Reg
}
zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
- case 34: // float multiply-add freg freg freg freg
+ case 34: // float multiply-add freg freg freg
var opcode uint32
-
switch p.As {
default:
ctxt.Diag("invalid opcode")
opcode = op_MSDBR
case AFMSUBS:
opcode = op_MSEBR
- case AFNMADD:
- opcode = op_MADBR
- case AFNMADDS:
- opcode = op_MAEBR
- case AFNMSUB:
- opcode = op_MSDBR
- case AFNMSUBS:
- opcode = op_MSEBR
- }
-
- zRR(op_LDR, uint32(p.To.Reg), uint32(p.Reg), asm)
- zRRD(opcode, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From3.Reg), asm)
-
- if p.As == AFNMADD || p.As == AFNMADDS || p.As == AFNMSUB || p.As == AFNMSUBS {
- zRRE(op_LCDFR, uint32(p.To.Reg), uint32(p.To.Reg), asm)
}
+ zRRD(opcode, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
case 35: // mov reg mem (no relocation)
d2 := regoff(ctxt, &p.To)
MOVD $coshtab<>+0(SB), R3
WFMADB V3, V6, V1, V6
WORD $0x68043000 //ld %f0,0(%r4,%r3)
- FMSUB F0, F3, F2, F2
+ FMSUB F0, F3, F2
WORD $0xA71AF000 //ahi %r1,-4096
WFMADB V2, V6, V0, V6
L17:
BYTE $0x30
BYTE $0x59
WORD $0xB3C10022 //ldgr %f2,%r2
- FMADD F2, F6, F2, F2
+ FMADD F2, F6, F2
MOVD $coshx4ff<>+0(SB), R1
FMOVD 0(R1), F0
FMUL F2, F0
FMOVD coshrodataL23<>+8(SB), F4
FADD F3, F2
MOVD $coshe6<>+0(SB), R1
- FMSUB F4, F2, F0, F0
+ FMSUB F4, F2, F0
FMOVD 0(R1), F6
WFMDB V0, V0, V1
MOVD $coshe4<>+0(SB), R1
MOVD $coshe5<>+0(SB), R1
FMOVD coshrodataL23<>+0(SB), F5
WFMADB V1, V6, V4, V6
- FMADD F5, F2, F0, F0
+ FMADD F5, F2, F0
FMOVD 0(R1), F2
MOVD $coshe3<>+0(SB), R1
FMOVD 0(R1), F4
WORD $0x68145000 //ld %f1,0(%r4,%r5)
WFMSDB V4, V1, V0, V2
WORD $0xA7487FBE //lhi %r4,32702
- FMADD F3, F2, F1, F1
+ FMADD F3, F2, F1
SUBW R1, R4
WORD $0xECC439BC //risbg %r12,%r4,57,128+60,3
BYTE $0x03
BYTE $0x55
WORD $0x682C5000 //ld %f2,0(%r12,%r5)
- FMSUB F2, F4, F0, F0
+ FMSUB F2, F4, F0
WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16
BYTE $0x30
BYTE $0x59
BYTE $0x59
WORD $0xB3C10022 //ldgr %f2,%r2
WORD $0xB3C10003 //ldgr %f0,%r3
- FMADD F2, F1, F2, F2
- FMADD F0, F6, F0, F0
+ FMADD F2, F1, F2
+ FMADD F0, F6, F0
FADD F2, F0
FMOVD F0, ret+8(FP)
RET
BYTE $0x03
BYTE $0x55
WORD $0x68034000 //ld %f0,0(%r3,%r4)
- FMSUB F0, F3, F2, F2
+ FMSUB F0, F3, F2
WORD $0xA7386FBE //lhi %r3,28606
WFMADB V2, V6, V0, V6
SUBW R1, R3, R1