Skip to content

Commit 4b4aefe

Browse files
committed
native/x64: 补充缺少指令的定义
1 parent d9ab47f commit 4b4aefe

File tree

7 files changed

+80
-27
lines changed

7 files changed

+80
-27
lines changed

internal/native/parser/parser_inst_x64_x.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ func (p *parser) parseInst_x64(fn *ast.Func) (inst *ast.Instruction) {
121121
}
122122
return
123123

124+
case x64.OpFormatType_Any2Any_Imm:
125+
// roundsd
126+
// roundss
127+
panic("TODO")
128+
124129
default:
125130
p.errorf(p.pos, "%v is not x64 instruction", p.tok)
126131
}

internal/native/wat2x64/func.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,16 +1939,16 @@ func (p *wat2X64Worker) buildFunc_ins(
19391939
i := i.(ast.Ins_F32Const)
19401940
sp0 := p.fnWasmR0Base - 8*stk.Push(token.F32) - 8
19411941
fmt.Fprintf(w, " # f32.const %f\n", i.X)
1942-
fmt.Fprintf(w, " mov eax, 0x%X\n", math.Float32bits(i.X))
1943-
fmt.Fprintf(w, " movd qword ptr [rbp%+d], rax\n", sp0)
1942+
fmt.Fprintf(w, " mov eax, 0x%X\n", math.Float32bits(i.X))
1943+
fmt.Fprintf(w, " mov qword ptr [rbp%+d], rax\n", sp0)
19441944
fmt.Fprintln(w)
19451945

19461946
case token.INS_F64_CONST:
19471947
i := i.(ast.Ins_F64Const)
19481948
sp0 := p.fnWasmR0Base - 8*stk.Push(token.F64) - 8
19491949
fmt.Fprintf(w, " # f64.const %f\n", i.X)
19501950
fmt.Fprintf(w, " movabs rax, 0x%X\n", math.Float64bits(i.X))
1951-
fmt.Fprintf(w, " movq qword ptr [rbp%+d], rax\n", sp0)
1951+
fmt.Fprintf(w, " mov qword ptr [rbp%+d], rax\n", sp0)
19521952
fmt.Fprintln(w)
19531953

19541954
case token.INS_I32_EQZ:
@@ -2298,7 +2298,7 @@ func (p *wat2X64Worker) buildFunc_ins(
22982298
fmt.Fprintf(w, " ucomiss xmm4, xmm5\n")
22992299
fmt.Fprintf(w, " setb al\n")
23002300
fmt.Fprintf(w, " setnp cl # set if not NaN\n")
2301-
fmt.Fprintf(w, " and al, cl\n")
2301+
fmt.Fprintf(w, " and al, cl\n")
23022302
fmt.Fprintf(w, " movzx eax, al\n")
23032303
fmt.Fprintf(w, " mov dword ptr [rbp%+d], eax\n", ret0)
23042304
fmt.Fprintln(w)
@@ -2362,7 +2362,7 @@ func (p *wat2X64Worker) buildFunc_ins(
23622362
fmt.Fprintf(w, " ucomisd xmm4, xmm5\n")
23632363
fmt.Fprintf(w, " sete al\n")
23642364
fmt.Fprintf(w, " setnp cl # set if not NaN\n")
2365-
fmt.Fprintf(w, " and al, cl\n")
2365+
fmt.Fprintf(w, " and al, cl\n")
23662366
fmt.Fprintf(w, " movzx eax, al\n")
23672367
fmt.Fprintf(w, " mov dword ptr [rbp%+d], eax\n", ret0)
23682368
fmt.Fprintln(w)

internal/native/x64/a_out.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,13 @@ const (
114114
ACALL // call
115115
ACDQ // cdq
116116
ACMP // cmp
117+
ACMOVNE // cmovne
118+
ACQO // cqo
117119
ACVTSI2SD // cvtsi2sd
118120
ACVTSS2SD // cvtss2sd
119121
ACVTTSD2SI // cvttsd2si
122+
ACVTTSS2SI // cvttss2si
123+
ACVTSI2SS // cvtsi2ss
120124
ADEC // dec
121125
ADIV // div
122126
ADIVSD // divsd
@@ -133,9 +137,13 @@ const (
133137
AJNZ // jnz
134138
AJZ // jz
135139
ALEA // lea
140+
ALZCNT // lzcnt
141+
AMAXSD // maxsd
142+
AMAXSS // maxss
143+
AMINSD // minsd
144+
AMINSS // minss
136145
AMOV // mov
137146
AMOVABS // movabs
138-
AMOVQ // movq
139147
AMOVSD // movsd
140148
AMOVSS // movss
141149
AMOVSXD // movsxd
@@ -146,8 +154,13 @@ const (
146154
ANOP // nop
147155
AOR // or
148156
APOP // pop
157+
APOPCNT // popcnt
149158
APUSH // push
150159
ARET // ret
160+
AROL // rol
161+
AROR // ror
162+
AROUNDSD // roundsd
163+
AROUNDSS // roundss
151164
ASAR // sar
152165
ASETA // seta
153166
ASETAE // setae
@@ -161,12 +174,16 @@ const (
161174
ASETNE // setne
162175
ASETNP // setnp
163176
ASHL // shl
177+
ASHR // shr
178+
ASQRTSD // sqrtsd
179+
ASQRTSS // sqrtss
164180
ASTD // std
165181
ASUB // sub
166182
ASUBSD // subsd
167183
ASUBSS // subss
168184
ASYSCALL // syscall
169185
ATEST // test
186+
ATZCNT // tzcnt
170187
AUCOMISD // ucomisd
171188
AXOR // xor
172189

internal/native/x64/anames.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,13 @@ var _Anames = []string{
138138
ACALL: "call",
139139
ACDQ: "cdq",
140140
ACMP: "cmp",
141+
ACMOVNE: "cmovne",
142+
ACQO: "cqo",
141143
ACVTSI2SD: "cvtsi2sd",
142144
ACVTSS2SD: "cvtss2sd",
143145
ACVTTSD2SI: "cvttsd2si",
146+
ACVTTSS2SI: "cvttss2si",
147+
ACVTSI2SS: "cvtsi2ss",
144148
ADEC: "dec",
145149
ADIV: "div",
146150
ADIVSD: "divsd",
@@ -157,9 +161,13 @@ var _Anames = []string{
157161
AJNZ: "jnz",
158162
AJZ: "jz",
159163
ALEA: "lea",
164+
ALZCNT: "lzcnt",
165+
AMAXSD: "maxsd",
166+
AMAXSS: "maxss",
167+
AMINSD: "minsd",
168+
AMINSS: "minss",
160169
AMOV: "mov",
161170
AMOVABS: "movabs",
162-
AMOVQ: "movq",
163171
AMOVSD: "movsd",
164172
AMOVSS: "movss",
165173
AMOVSXD: "movsxd",
@@ -170,8 +178,13 @@ var _Anames = []string{
170178
ANOP: "nop",
171179
AOR: "or",
172180
APOP: "pop",
181+
APOPCNT: "popcnt",
173182
APUSH: "push",
174183
ARET: "ret",
184+
AROL: "rol",
185+
AROR: "ror",
186+
AROUNDSD: "roundsd",
187+
AROUNDSS: "roundss",
175188
ASAR: "sar",
176189
ASETA: "seta",
177190
ASETAE: "setae",
@@ -185,12 +198,16 @@ var _Anames = []string{
185198
ASETNE: "setne",
186199
ASETNP: "setnp",
187200
ASHL: "shl",
201+
ASHR: "shr",
202+
ASQRTSD: "sqrtsd",
203+
ASQRTSS: "sqrtss",
188204
ASTD: "std",
189205
ASUB: "sub",
190206
ASUBSD: "subsd",
191207
ASUBSS: "subss",
192208
ASYSCALL: "syscall",
193209
ATEST: "test",
210+
ATZCNT: "tzcnt",
194211
AUCOMISD: "ucomisd",
195212
AXOR: "xor",
196213
}

internal/native/x64/opcode.go

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@ package x64
77
type OpFormatType int
88

99
const (
10-
OpFormatType_NULL OpFormatType = iota
11-
OpFormatType_NoArgs // 无参数
12-
OpFormatType_Imm // 一元立即数
13-
OpFormatType_Reg // 一元寄存器
14-
OpFormatType_Mem // 一元内 存
15-
OpFormatType_Imm2Reg // 立即数 => 寄存器
16-
OpFormatType_Imm2Mem // 立即数 => 内 存
17-
OpFormatType_Reg2Reg // 寄存器 => 寄存器
18-
OpFormatType_Mem2Reg // 内 存 => 寄存器
19-
OpFormatType_Reg2Mem // 寄存器 => 内 存
20-
OpFormatType_Any // 一元未知
21-
OpFormatType_Any2Any // 二元未知, 对应 mov 指令
10+
OpFormatType_NULL OpFormatType = iota
11+
OpFormatType_NoArgs // 无参数
12+
OpFormatType_Imm // 一元立即数
13+
OpFormatType_Reg // 一元寄存器
14+
OpFormatType_Mem // 一元内 存
15+
OpFormatType_Imm2Reg // 立即数 => 寄存器
16+
OpFormatType_Imm2Mem // 立即数 => 内 存
17+
OpFormatType_Reg2Reg // 寄存器 => 寄存器
18+
OpFormatType_Mem2Reg // 内 存 => 寄存器
19+
OpFormatType_Reg2Mem // 寄存器 => 内 存
20+
OpFormatType_Any // 一元未知
21+
OpFormatType_Any2Any // 二元未知, 对应 mov 指令
22+
OpFormatType_Any2Any_Imm // 3个未知数
2223
)
2324

2425
// X64 指令类型
@@ -30,9 +31,13 @@ var x64ModeTable = [...]OpFormatType{
3031
ACALL: OpFormatType_Any,
3132
ACDQ: OpFormatType_NoArgs,
3233
ACMP: OpFormatType_Any2Any,
34+
ACMOVNE: OpFormatType_Reg2Reg,
35+
ACQO: OpFormatType_NoArgs,
3336
ACVTSI2SD: OpFormatType_Reg2Reg,
3437
ACVTSS2SD: OpFormatType_Reg2Reg,
3538
ACVTTSD2SI: OpFormatType_Reg2Reg,
39+
ACVTTSS2SI: OpFormatType_Reg2Reg,
40+
ACVTSI2SS: OpFormatType_Reg2Reg,
3641
ADEC: OpFormatType_Any,
3742
ADIV: OpFormatType_Any,
3843
ADIVSD: OpFormatType_Any2Any,
@@ -49,9 +54,13 @@ var x64ModeTable = [...]OpFormatType{
4954
AJNZ: OpFormatType_Any,
5055
AJZ: OpFormatType_Any,
5156
ALEA: OpFormatType_Mem2Reg,
57+
ALZCNT: OpFormatType_Reg2Reg,
58+
AMAXSD: OpFormatType_Mem2Reg,
59+
AMAXSS: OpFormatType_Mem2Reg,
60+
AMINSD: OpFormatType_Mem2Reg,
61+
AMINSS: OpFormatType_Mem2Reg,
5262
AMOV: OpFormatType_Any2Any,
5363
AMOVABS: OpFormatType_Imm2Reg,
54-
AMOVQ: OpFormatType_Any2Any,
5564
AMOVSD: OpFormatType_Any2Any,
5665
AMOVSS: OpFormatType_Any2Any,
5766
AMOVSXD: OpFormatType_Any2Any,
@@ -62,8 +71,13 @@ var x64ModeTable = [...]OpFormatType{
6271
ANOP: OpFormatType_NoArgs,
6372
AOR: OpFormatType_Any2Any,
6473
APOP: OpFormatType_Any,
74+
APOPCNT: OpFormatType_Reg2Reg,
6575
APUSH: OpFormatType_Any,
6676
ARET: OpFormatType_NoArgs,
77+
AROL: OpFormatType_Reg2Reg,
78+
AROR: OpFormatType_Reg2Reg,
79+
AROUNDSD: OpFormatType_Any2Any_Imm,
80+
AROUNDSS: OpFormatType_Any2Any_Imm,
6781
ASAR: OpFormatType_Reg2Reg,
6882
ASETA: OpFormatType_Any,
6983
ASETAE: OpFormatType_Any,
@@ -77,12 +91,16 @@ var x64ModeTable = [...]OpFormatType{
7791
ASETNE: OpFormatType_Any,
7892
ASETNP: OpFormatType_Any,
7993
ASHL: OpFormatType_Any2Any,
94+
ASHR: OpFormatType_Reg2Reg,
95+
ASQRTSD: OpFormatType_Reg2Reg,
96+
ASQRTSS: OpFormatType_Reg2Reg,
8097
ASTD: OpFormatType_NoArgs,
8198
ASUB: OpFormatType_Any2Any,
8299
ASUBSD: OpFormatType_Any2Any,
83100
ASUBSS: OpFormatType_Any2Any,
84101
ASYSCALL: OpFormatType_NoArgs,
85102
ATEST: OpFormatType_Any2Any,
103+
ATZCNT: OpFormatType_Reg2Reg,
86104
AUCOMISD: OpFormatType_Reg2Reg,
87105
AXOR: OpFormatType_Reg2Reg,
88106

internal/native/x64/prog_build.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,6 @@ func (prog *Prog) buildProg(as abi.As, arg *abi.X64Argument) (inst *Prog, err er
267267
// movabs rax, 0x3FF0000000000000
268268
assert(prog.nArg(arg) == 2)
269269
prog.As = p9x86.AMOVQ
270-
case AMOVQ: // movq
271-
// movq [rbp-760], rax
272-
assert(prog.nArg(arg) == 2)
273-
prog.As = p9x86.AMOVQ
274270
case AMOVSD: // movsd
275271
// movsd xmm4, qword ptr [rbp-320]
276272
// movsd qword ptr [rbp-760], xmm4

waroot/changelog.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# 版本日志
22

33
- dev (2026-??-??)
4-
- TODO: wat2la 实现
5-
- TODO: wat2x64 实现
64
- 发布 `WaCode` 轻量级开发环境
7-
- v1.7.0 (2026-02-??)
5+
- v1.8.0 (2026-03-??)
6+
- TODO: X64支持
7+
- v1.7.0 (2026-02-17) - 丙午年第一弹
88
- 实现自研全链路零依赖龙芯64架构的构建支持
99
- 更新凹语言汇编器更新以适配新设计的汇编语法
1010
- `wa objdump` 增加中文指令反汇编, 完善参数对齐

0 commit comments

Comments
 (0)