149 changes: 148 additions & 1 deletion llvm/test/CodeGen/X86/fp-strict-scalar-cmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4202,7 +4202,154 @@ define void @foo(float %0, float %1) #0 {
}
declare dso_local void @bar()

attributes #0 = { strictfp }
define float @fcmp_select_ogt(float %f1, float %f2) #0 {
; SSE-32-LABEL: fcmp_select_ogt:
; SSE-32: # %bb.0:
; SSE-32-NEXT: pushl %eax
; SSE-32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE-32-NEXT: maxss {{[0-9]+}}(%esp), %xmm0
; SSE-32-NEXT: movss %xmm0, (%esp)
; SSE-32-NEXT: flds (%esp)
; SSE-32-NEXT: wait
; SSE-32-NEXT: popl %eax
; SSE-32-NEXT: retl
;
; SSE-64-LABEL: fcmp_select_ogt:
; SSE-64: # %bb.0:
; SSE-64-NEXT: maxss %xmm1, %xmm0
; SSE-64-NEXT: retq
;
; AVX-32-LABEL: fcmp_select_ogt:
; AVX-32: # %bb.0:
; AVX-32-NEXT: pushl %eax
; AVX-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; AVX-32-NEXT: vmaxss {{[0-9]+}}(%esp), %xmm0, %xmm0
; AVX-32-NEXT: vmovss %xmm0, (%esp)
; AVX-32-NEXT: flds (%esp)
; AVX-32-NEXT: wait
; AVX-32-NEXT: popl %eax
; AVX-32-NEXT: retl
;
; AVX-64-LABEL: fcmp_select_ogt:
; AVX-64: # %bb.0:
; AVX-64-NEXT: vmaxss %xmm1, %xmm0, %xmm0
; AVX-64-NEXT: retq
;
; X87-LABEL: fcmp_select_ogt:
; X87: # %bb.0:
; X87-NEXT: flds {{[0-9]+}}(%esp)
; X87-NEXT: flds {{[0-9]+}}(%esp)
; X87-NEXT: fcom %st(1)
; X87-NEXT: wait
; X87-NEXT: fnstsw %ax
; X87-NEXT: # kill: def $ah killed $ah killed $ax
; X87-NEXT: sahf
; X87-NEXT: ja .LBB57_2
; X87-NEXT: # %bb.1:
; X87-NEXT: fstp %st(0)
; X87-NEXT: fldz
; X87-NEXT: fxch %st(1)
; X87-NEXT: .LBB57_2:
; X87-NEXT: fstp %st(1)
; X87-NEXT: wait
; X87-NEXT: retl
;
; X87-CMOV-LABEL: fcmp_select_ogt:
; X87-CMOV: # %bb.0:
; X87-CMOV-NEXT: flds {{[0-9]+}}(%esp)
; X87-CMOV-NEXT: flds {{[0-9]+}}(%esp)
; X87-CMOV-NEXT: fcomi %st(1), %st
; X87-CMOV-NEXT: fxch %st(1)
; X87-CMOV-NEXT: fcmovnbe %st(1), %st
; X87-CMOV-NEXT: fstp %st(1)
; X87-CMOV-NEXT: wait
; X87-CMOV-NEXT: retl
%cond = call i1 @llvm.experimental.constrained.fcmps.f32(
float %f1, float %f2, metadata !"ogt",
metadata !"fpexcept.strict")
%res = select i1 %cond, float %f1, float %f2
ret float %res
}

define double @fcmp_select_ule(double %f1, double %f2) #0 {
; SSE-32-LABEL: fcmp_select_ule:
; SSE-32: # %bb.0:
; SSE-32-NEXT: pushl %ebp
; SSE-32-NEXT: movl %esp, %ebp
; SSE-32-NEXT: andl $-8, %esp
; SSE-32-NEXT: subl $8, %esp
; SSE-32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE-32-NEXT: minsd 8(%ebp), %xmm0
; SSE-32-NEXT: movsd %xmm0, (%esp)
; SSE-32-NEXT: fldl (%esp)
; SSE-32-NEXT: wait
; SSE-32-NEXT: movl %ebp, %esp
; SSE-32-NEXT: popl %ebp
; SSE-32-NEXT: retl
;
; SSE-64-LABEL: fcmp_select_ule:
; SSE-64: # %bb.0:
; SSE-64-NEXT: minsd %xmm0, %xmm1
; SSE-64-NEXT: movapd %xmm1, %xmm0
; SSE-64-NEXT: retq
;
; AVX-32-LABEL: fcmp_select_ule:
; AVX-32: # %bb.0:
; AVX-32-NEXT: pushl %ebp
; AVX-32-NEXT: movl %esp, %ebp
; AVX-32-NEXT: andl $-8, %esp
; AVX-32-NEXT: subl $8, %esp
; AVX-32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
; AVX-32-NEXT: vminsd 8(%ebp), %xmm0, %xmm0
; AVX-32-NEXT: vmovsd %xmm0, (%esp)
; AVX-32-NEXT: fldl (%esp)
; AVX-32-NEXT: wait
; AVX-32-NEXT: movl %ebp, %esp
; AVX-32-NEXT: popl %ebp
; AVX-32-NEXT: retl
;
; AVX-64-LABEL: fcmp_select_ule:
; AVX-64: # %bb.0:
; AVX-64-NEXT: vminsd %xmm0, %xmm1, %xmm0
; AVX-64-NEXT: retq
;
; X87-LABEL: fcmp_select_ule:
; X87: # %bb.0:
; X87-NEXT: fldl {{[0-9]+}}(%esp)
; X87-NEXT: fldl {{[0-9]+}}(%esp)
; X87-NEXT: fcom %st(1)
; X87-NEXT: wait
; X87-NEXT: fnstsw %ax
; X87-NEXT: # kill: def $ah killed $ah killed $ax
; X87-NEXT: sahf
; X87-NEXT: jbe .LBB58_2
; X87-NEXT: # %bb.1:
; X87-NEXT: fstp %st(0)
; X87-NEXT: fldz
; X87-NEXT: fxch %st(1)
; X87-NEXT: .LBB58_2:
; X87-NEXT: fstp %st(1)
; X87-NEXT: wait
; X87-NEXT: retl
;
; X87-CMOV-LABEL: fcmp_select_ule:
; X87-CMOV: # %bb.0:
; X87-CMOV-NEXT: fldl {{[0-9]+}}(%esp)
; X87-CMOV-NEXT: fldl {{[0-9]+}}(%esp)
; X87-CMOV-NEXT: fcomi %st(1), %st
; X87-CMOV-NEXT: fxch %st(1)
; X87-CMOV-NEXT: fcmovbe %st(1), %st
; X87-CMOV-NEXT: fstp %st(1)
; X87-CMOV-NEXT: wait
; X87-CMOV-NEXT: retl
%cond = call i1 @llvm.experimental.constrained.fcmps.f64(
double %f1, double %f2, metadata !"ule",
metadata !"fpexcept.strict")
%res = select i1 %cond, double %f1, double %f2
ret double %res
}

attributes #0 = { nounwind strictfp }

declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)
declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
Expand Down
10 changes: 5 additions & 5 deletions mlir/utils/spirv/gen_spirv_dialect.py
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ def gen_instr_coverage_report(path, instructions):

prefix = "def SPIRV_OC_"
existing_opcodes = [
k[len(prefix) :] for k in re.findall(prefix + "\w+", content[1])
k[len(prefix) :] for k in re.findall(prefix + r"\w+", content[1])
]
existing_instructions = list(
filter(lambda inst: (inst["opname"] in existing_opcodes), instructions)
Expand Down Expand Up @@ -597,7 +597,7 @@ def update_td_opcodes(path, instructions, filter_list):
# Extend opcode list with existing list
prefix = "def SPIRV_OC_"
existing_opcodes = [
k[len(prefix) :] for k in re.findall(prefix + "\w+", content[1])
k[len(prefix) :] for k in re.findall(prefix + r"\w+", content[1])
]
filter_list.extend(existing_opcodes)
filter_list = list(set(filter_list))
Expand Down Expand Up @@ -644,7 +644,7 @@ def update_td_enum_attrs(path, operand_kinds, filter_list):
suffix = "Attr"
existing_kinds = [
k[len(prefix) : -len(suffix)]
for k in re.findall(prefix + "\w+" + suffix, content[1])
for k in re.findall(prefix + r"\w+" + suffix, content[1])
]
filter_list.extend(existing_kinds)

Expand Down Expand Up @@ -971,15 +971,15 @@ def extract_td_op_info(op_def):
suffix = "Op"
opname = [
o[len(prefix) : -len(suffix)]
for o in re.findall(prefix + "\w+" + suffix, op_def)
for o in re.findall(prefix + r"\w+" + suffix, op_def)
]
assert len(opname) == 1, "more than one ops in the same section!"
opname = opname[0]

# Get instruction category
prefix = "SPIRV_"
inst_category = [
o[len(prefix) :] for o in re.findall(prefix + "\w+Op", op_def.split(":", 1)[1])
o[len(prefix) :] for o in re.findall(prefix + r"\w+Op", op_def.split(":", 1)[1])
]
assert len(inst_category) <= 1, "more than one ops in the same section!"
inst_category = inst_category[0] if len(inst_category) == 1 else "Op"
Expand Down